android之多媒体篇(一)
2019獨角獸企業重金招聘Python工程師標準>>>
Android 4.0.3(Api Level 15)支持的多媒體格式。
注意:有些設備可能支持其他的文件格式。
1.Audio
AAC LC/LTP、HE-AACv1(AAC+)、AMR-NB、AMR-WB、MP3、MIDI、Ogg Vorbis、PCM/WAVE、FLAC(3.1或3.1以上)
2.Image
JPEG、PNG、WEBP、GIF、BMP
3.Video
H.263、H.264 AVC、MPEG-4 SP、VP8(2.3.3或2.3.3以上)
播放音頻、視頻主要由MediaPlayer類來控制。
大致步驟:
1.初始化MediaPlayer,附上要播放的媒體。
2.準備播放 prepare
3.開始播放 start
4.在播放結束前:停止或者暫停播放 pause or stop
5.播放完成 complete
android只支持有限數量的可同步的MediaPlayer,不釋放它們會導致運行時錯誤,所以當你完成播放的時候,記得:
mediaPlayer.release(); 來釋放所涉及的資源。
Prepare音頻
MediaPlayer可以播放本地文件、Content Providers、遠程URL流。
加載:
注意:上述這種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控制按鈕,就像:
你若想使用MediaController去控制播放,最好在代碼中實例化它。當你這么做了,MediaController只會在你設置它為visible之后或者觸摸它的Video View,或者與其交互。
如果你使用VideoView去顯示你的視頻內容,你可以簡單得通過VideoView的setMediaController方法:
// 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。
AudioManager的registMediaButtonEventReceiver方法去注冊接受者,可以防止其他APP也在監聽ACTION。
轉載于:https://my.oschina.net/wangjunhe/blog/118613
總結
以上是生活随笔為你收集整理的android之多媒体篇(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: asp.net读取xml方法
- 下一篇: 电风扇标准集合(BS/EN/IEC/UL