android之多媒體篇(一)

Android 4.0.3(Api Level 15)支持的多媒體格式。

注意:有些設備可能支持其餘的文件格式。 java

1.Audio android

AAC LC/LTP、HE-AACv1(AAC+)、AMR-NB、AMR-WB、MP三、MIDI、Ogg Vorbis、PCM/WAVE、FLAC(3.1或3.1以上) 網絡

2.Image 框架

JPEG、PNG、WEBP、GIF、BMP 異步

3.Video ide

H.26三、H.264 AVC、MPEG-4 SP、VP8(2.3.3或2.3.3以上) oop

播放音頻、視頻主要由MediaPlayer類來控制。

大體步驟:
1.初始化MediaPlayer,附上要播放的媒體。 this

2.準備播放 prepare url

3.開始播放 start .net

4.在播放結束前:中止或者暫停播放 pause or stop

5.播放完成 complete

android只支持有限數量的可同步的MediaPlayer,不釋放它們會致使運行時錯誤,因此當你完成播放的時候,記得:

mediaPlayer.release(); 來釋放所涉及的資源。

Prepare音頻

MediaPlayer能夠播放本地文件、Content Providers、遠程URL流。

加載:

// Load an audio resource from a package resource. 
MediaPlayer resourcePlayer = 
   MediaPlayer.create(this, R.raw.my_audio);

// Load an audio resource from a local file. 
MediaPlayer filePlayer = MediaPlayer.create(this, 
   Uri.parse(「file:///sdcard/localfile.mp3」));

// Load an audio resource from an online resource. 
MediaPlayer urlPlayer = MediaPlayer.create(this, 
   Uri.parse(「http://site.com/audio/audio.mp3」));

// Load an audio resource from a Content Provider. 
MediaPlayer contentPlayer = MediaPlayer.create(this, 
   Settings.System.DEFAULT_RINGTONE_URI);

注意:上述這種create後返回mediaPlayer的方式,其實已經調用了prepare方法,因此不能再調用了。

涉及網絡的,記得加網絡權限。

方法2:

MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(「/sdcard/mydopetunes.mp3」);
mediaPlayer.prepare();

與上面相似。

Prepare視頻

想要播放視頻,比播放音頻複雜許多。播放視頻你必須有一個surface來支持。

2種方式來播放視頻:

方法一:使用VideoView,內置了surface,經過MediaPlayer加載。

方法二:本身指定surface,直接操做底層的MediaPlayer。

播放視頻經過VideoView:

final VideoView videoView = (VideoView)findViewById(R.id.videoView);

// Assign a local file to play 
videoView.setVideoPath(「/sdcard/mycatvideo.3gp」);

// Assign a URL of a remote video stream 
videoView.setVideoUri(myAwesomeStreamingSource);

當Video被初始化後,你能夠控制它的播放經過使用start、stopPlayback、pause、seekTo方法。

VideoView還包含setKeepScreenOn方法,在播放中屏幕不鎖屏。

方法一:使用VideoView:

// Get a reference to the Video View. 
final VideoView videoView = (VideoView)findViewById(R.id.videoView);

// Configure the video view and assign a source video. 
videoView.setKeepScreenOn(true); 
videoView.setVideoPath(「/sdcard/mycatvideo.3gp」);

// Attach a Media Controller 
MediaController mediaController = new MediaController(this); 
videoView.setMediaController(mediaController);

方法二:利用surface

SurfaceHolder是異步建立的,因此你必須等surfaceCreated觸發後,你才能將Holder給mediaPlayer。

直接看框架代碼:

public class SurfaceViewVideoViewActivity extends Activity 
  implements SurfaceHolder.Callback {

  static final String TAG = 「SurfaceViewVideoViewActivity」;

  private MediaPlayer mediaPlayer;

  public void surfaceCreated(SurfaceHolder holder) { 
     try {  
    // When the surface is created, assign it as the 
    // display surface and assign and prepare a data 
    // source. 
    mediaPlayer.setDisplay(holder); 
    mediaPlayer.setDataSource(「/sdcard/test2.3gp」); 
    mediaPlayer.prepare(); 
  } catch (IllegalArgumentException e) { 
    Log.e(TAG, 「Illegal Argument Exception」, e); 
  } catch (IllegalStateException e) { 
    Log.e(TAG, 「Illegal State Exception「, e); 
  } catch (SecurityException e) { 
    Log.e(TAG, 「Security Exception「, e); 
  } catch (IOException e) { 
    Log.e(TAG, 「IO Exception「, e); 
  } 
}

public void surfaceDestroyed(SurfaceHolder holder) { 
  mediaPlayer.release(); 
}

public void surfaceChanged(SurfaceHolder holder, 
                                int format, int width, int height) { }

@Override 
public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState);

  setContentView(R.layout.surfaceviewvideoviewer);

  // Create a new Media Player. 
  mediaPlayer = new MediaPlayer();

  // Get a reference to the Surface View. 
  final SurfaceView surfaceView = 
    (SurfaceView)findViewById(R.id.surfaceView);

  // Configure the Surface View. 
  surfaceView.setKeepScreenOn(true);

  // Configure the Surface Holder and register the callback. 
  SurfaceHolder holder = surfaceView.getHolder(); 
  holder.addCallback(this); 
  holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
  holder.setFixedSize(400, 300);

  // Connect a play button. 
  Button playButton = (Button)findViewById(R.id.buttonPlay); 
  playButton.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
       mediaPlayer.start();

       } 
    });

    // Connect a pause button. 
    Button pauseButton = (Button)findViewById(R.id.buttonPause); 
    pauseButton.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
         mediaPlayer.pause(); 
       } 
    });

    // Add a skip button. 
    Button skipButton = (Button)findViewById(R.id.buttonSkip); 
    skipButton.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
         mediaPlayer.seekTo(mediaPlayer.getDuration()/2); 
       } 
    }); 
  } 
}

控制MediaPlayer的播放

mediaPlayer.start()後就開始播放。 getDuration方法得到播放的長度,getCurrentPosition找到當前播放到的位置。使用seekTo方法跳到指定的位置。

去確保一致的體驗,Android提供了MediaController-一個標準的提供經常使用的Media控制按鈕,就像:

image

你若想使用MediaController去控制播放,最好在代碼中實例化它。當你這麼作了,MediaController只會在你設置它爲visible以後或者觸摸它的Video View,或者與其交互。

若是你使用VideoView去顯示你的視頻內容,你能夠簡單得經過VideoViewsetMediaController方法:

// Attach a Media Controller 
MediaController mediaController = new MediaController(this); 
videoView.setMediaController(mediaController);

去控制一個MediaPlayer,你須要去實現一個新的MediaController.MediaPlayerControl

MediaController mediaController = new MediaController(this); 
mediaController.setMediaPlayer(new MediaPlayerControl() {

   public boolean canPause() { 
     return true; 
   }

   public boolean canSeekBackward() { 
     return true; 
   }

   public boolean canSeekForward() { 
     return true; 
   }

   public int getBufferPercentage() { 
     return 0; 
   }

   public int getCurrentPosition() { 
     return mediaPlayer.getCurrentPosition(); 
   }

   public int getDuration() { 
     return mediaPlayer.getDuration(); 
   }

   public boolean isPlaying() { 
     return mediaPlayer.isPlaying(); 
   }

   public void pause() { 
     mediaPlayer.pause(); 
   }

  public void seekTo(int pos) { 
    mediaPlayer.seekTo(pos); 
  }

  public void start() { 
    mediaPlayer.start(); 
  }

});

使用setAnchorView方法去決定MediaController依附在哪一個View上,這個View能夠是任意View

調用show或者hide來顯示或者隱藏。

mediaController.setAnchorView(myView); 
mediaController.show();

管理MediaPlayer的輸出

MediaPlayer提供方法去控制音量、鎖屏亮度、設置循環模式

控制音量經過setVolume方法。

mediaPlayer.setVolume(0.5f, 0.5f);  值在0-1之間浮點數,0表示靜音,1表示最大音量。 2個參數分別表明左聲道和右聲道

mediaPlayer.setScreenOnWhilePlaying(true);  //播放時,屏幕不鎖屏。

if (!mediaPlayer.isLooping()) 
  mediaPlayer.setLooping(true);

有些設備,附上了耳機,或者藍牙耳機,會提供播放、暫停、skip、上一個播放的 按鍵

你能夠監聽Action爲:android.intent.action.MEDIA_BUTTON

public class MediaControlReceiver extends BroadcastReceiver {

  public static final String ACTION_MEDIA_BUTTON = 
    「com.paad.ACTION_MEDIA_BUTTON」;

  @Override 
  public void onReceive(Context context, Intent intent) { 
    if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { 
       Intent internalIntent = new Intent(ACTION_MEDIA_BUTTON); 
       internalIntent.putExtras(intent.getExtras()); 
       context.sendBroadcast(internalIntent); 
    } 
  } 
}

public class ActivityMediaControlReceiver extends BroadcastReceiver { 
  @Override 
  public void onReceive(Context context, Intent intent) { 
    if (MediaControlReceiver.ACTION_MEDIA_BUTTON.equals( 
         intent.getAction())) { 
       KeyEvent event = 
         (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);

       switch (event.getKeyCode()) { 
         case (KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE) : 
            if (mediaPlayer.isPlaying()) 
              pause(); 
            else 
              play(); 
            break; 
         case (KeyEvent.KEYCODE_MEDIA_PLAY) : 
            play(); break; 
         case (KeyEvent.KEYCODE_MEDIA_PAUSE) : 
            pause(); break; 
         case (KeyEvent.KEYCODE_MEDIA_NEXT) : 
            skip(); break; 
         case (KeyEvent.KEYCODE_MEDIA_PREVIOUS) :

            previous(); break; 
          case (KeyEvent.KEYCODE_MEDIA_STOP) : 
            stop(); break; 
          default: break; 
       } 
     } 
  } 
}

AudioManagerregistMediaButtonEventReceiver方法去註冊接受者,能夠防止其餘APP也在監聽ACTION

// Register the Media Button Event Receiver to 
// listen for media button presses. 
AudioManager am = 
  (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
ComponentName component = 
  new ComponentName(this, MediaControlReceiver.class);

am.registerMediaButtonEventReceiver(component);

// Register a local Intent Receiver that receives media button 
// presses from the Receiver registered in the manifest. 
activityMediaControlReceiver = new ActivityMediaControlReceiver(); 
IntentFilter filter = 
  new IntentFilter(MediaControlReceiver.ACTION_MEDIA_BUTTON);

registerReceiver(activityMediaControlReceiver, filter);
相關文章
相關標籤/搜索