1.需要在activity中判斷
if (!io.vov.vitamio.LibsChecker.checkVitamioLibs(this))
return;
2.緩衝狀態的回掉,用於顯示加載進度(其實是設置MediaPlayer的該方法)
mVideoView.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
// 緩衝狀態中,percent爲下載量的百分比
}
});
3.不管同步異步調用mMediaPlayer.prepare,都會回掉該監聽器的方法
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.setPlaybackSpeed(1.0f);
}
});
4.播放結束將會回調,前提是沒有開啓循環模式mWebView.setOnCompletionListener(mCompletionListener);
5.播放過程中出現錯誤將會回掉mVideoView.setOnErrorListener(mErrorListener);
6.seekTo(int)方法是異步執行的,所以它可以馬上返回,但是實際的定位播放操作可能需要一段時間才能完成,尤其是播放流形式的音頻/視頻。當實際的定位播放操作完成之後,內部的播放引擎會調用客戶端程序員提供的OnSeekComplete.onSeekComplete()回調方法。
mVideoView.setOnSeekCompleteListener(mSeekCompleteListener);
7.回掉播放過程中的各種信息mVideoView.setOnInfoListener(mInfoListener);
以下是系統MediaPlayer的靜態字段
MEDIA_INFO_UNKNOWN:未知消息
MEDIA_INFO_VIDEO_TRACK_LAGGING:視頻解碼器太複雜了:它不能解碼幀的足夠快。可能只有音頻播放良好在這個階段。
MEDIA_INFO_VIDEO_RENDERING_START:只是渲染了視頻的第一幀。
MEDIA_INFO_BUFFERING_START:暫停播放以緩存更多地數據。
MEDIA_INFO_BUFFERING_END:緩衝結束,將要繼續進入播放狀態。
MEDIA_INFO_BAD_INTERLEAVING:
MEDIA_INFO_NOT_SEEKABLE:不能拖動
MEDIA_INFO_METADATA_UPDATE:
MEDIA_INFO_UNSUPPORTED_SUBTITLE:該媒體框架不支持該字幕
MEDIA_INFO_SUBTITLE_TIMED_OUT:字幕讀取時間過長
VitamioBundle中的MediaPlayer
MEDIA_INFO_DOWNLOAD_RATE_CHANGED:下載的速率發生了改變(單位kb/s)
8.設置控制器
MediaController mediaController = new MediaController(TvPlayActivity.this);
// 全屏半屏按鈕點擊事件
mediaController.setIvToBigClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 設置屏幕強轉
if (TvPlayActivity.this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
TvPlayActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else if (TvPlayActivity.this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
TvPlayActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
});
MediaController中一般按鈕的監聽裏面已經設置好,比如開始播放,暫停,seekbar拖動,然後以上方法可以設置橫豎屏切換的監聽。// 設置uri
if (!TextUtils.isEmpty(videoInfoVo.getProgramlist().get(0).getM3u8())) {
// 設置控制器
MediaController mediaController = new MediaController(TvPlayActivity.this);
// 全屏半屏按鈕點擊事件
mediaController.setIvToBigClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// 設置屏幕強轉
if (TvPlayActivity.this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
TvPlayActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} else if (TvPlayActivity.this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
TvPlayActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
});
mVideoView.setMediaController(mediaController);
// 獲得焦點
mVideoView.requestFocus();
// 設置監聽器
mVideoView.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
// 緩衝狀態中,percent爲下載量的百分比,一般在videoView中間設置
}
});
mVideoView.setOnInfoListener(new MediaInfoListener());
mVideoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.setPlaybackSpeed(1.0f);
}
});
Uri uri = Uri.parse(videoInfoVo.getProgramlist().get(0).getM3u8());
mVideoView.setVideoURI(uri);
}
class MediaInfoListener implements OnInfoListener {
@Override
public boolean onInfo(MediaPlayer arg0, int arg1, int arg2) {
switch (arg1) {
case MediaPlayer.MEDIA_INFO_BUFFERING_START:
// 開始緩衝,如果正在播放,則停止
if (mVideoView.isPlaying()) {
mVideoView.pause();
}
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_END:
// 緩衝完畢,開始播放
mVideoView.start();
break;
case MediaPlayer.MEDIA_INFO_DOWNLOAD_RATE_CHANGED:
// 下載的速率發生了改變
// setText("" + arg2 + "kb/s" + " ");
break;
}
return true;
}
}
當點擊橫豎屏時,需要手動設置控件的寬高:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
mTopRl.getLayoutParams().height = LayoutParams.MATCH_PARENT;
mTopRl.getLayoutParams().width = LayoutParams.MATCH_PARENT;
mVideoView.getLayoutParams().height = LayoutParams.MATCH_PARENT;
mVideoView.getLayoutParams().width = LayoutParams.MATCH_PARENT;
// mVideoView.getHolder().setFixedSize(mVideoView.getLayoutParams().width, mVideoView.getLayoutParams().height);
// mVideoView.setVideoScale(Settings.DISPLAY_HEIGHT, Settings.DISPLAY_WIDTH);
// mVideoView.setVideoScale(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
// mVideoView.getHolder().setFixedSize(Settings.DISPLAY_HEIGHT, Settings.DISPLAY_WIDTH);
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
// mVideoView.getLayoutParams().height= DensityUtils.dp2px(TvPlayActivity.this, 230);
// mVideoView.getLayoutParams().width= LayoutParams.MATCH_PARENT;
mTopRl.getLayoutParams().height = LayoutParams.WRAP_CONTENT;
mTopRl.getLayoutParams().width = LayoutParams.MATCH_PARENT;
mVideoView.setVideoScale(LayoutParams.MATCH_PARENT, DensityUtils.dp2px(TvPlayActivity.this, 230));
mVideoView.getHolder().setFixedSize(mVideoView.getLayoutParams().width, mVideoView.getLayoutParams().height);
}
}