在VideoView.java中提供了視頻播放的實(shí)例。視頻播放和音頻播放一樣都是通過MediaPlayer來實(shí)現(xiàn)的。
為了進(jìn)行視頻播放,必須設(shè)置數(shù)據(jù)源、音頻流類型等,以加載不同的解碼器和采用相應(yīng)的音頻沖突策略。為了捕捉到視頻播放中的各種消息,需要設(shè)置不同的監(jiān)聽器。
MediaPlayer的常用方法包括:
SipManager用于初始化SIP鏈接和接入SIP服務(wù)等。能夠創(chuàng)建SIP會話。比較常用的方法包括:
setDataSource() //設(shè)置數(shù)據(jù)源
getVideoHeight() //獲得視頻高度
getVideoWidth() //獲得視頻寬度
getDuration() //獲得時長
getCurrentPosition() //獲得當(dāng)前位置
setVolume() //設(shè)置音量
start() //開始播放
stop() //停止播放
seekto() //定位
setAudioSessionId() //設(shè)置音頻會話ID
try {
mMediaPlayer=new MediaPlayer(); //創(chuàng)建MediaPlayer
//設(shè)置監(jiān)聽器
mMediaPlayer.setOnPreparedListener(mPreparedListener);
mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);
mDuration=-1;
mMediaPlayer.setOnCompletionListener(mCompletionListener);
mMediaPlayer.setOnErrorListener(mErrorListener);
mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);
mCurrentBufferPercentage=0;
//設(shè)置數(shù)據(jù)源
mMediaPlayer.setDataSource(mContext, mUri);
mMediaPlayer.setDisplay(mSurfaceHolder);
//設(shè)置音頻流類型
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mMediaPlayer.工補(bǔ)農(nóng) setScreenOnWhilePlaying(true);
mMediaPlayer.prepareAsync();
mCurrentState=STATE_PREPARING;
attachMediaController();
mMediaPlayer.start();
mCurrentState=STATE_PLAYING;
}
catch (IOException ex) {
Log.w(TAG, "Unable to open content: " + mUri, ex);
mCurrentState=STATE_ERROR;
mTargetState=STATE_ERROR;
mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
return;
}
catch (IllegalArgumentException ex) {
Log.w(TAG, "Unable to open content: " + mUri, ex);
mCurrentState=STATE_ERROR;
mTargetState=STATE_ERROR;
mErrorListener.onError(mMediaPlayer, MediaPlayer.MEDIA_ERROR_UNKNOWN, 0);
return;
}
…
視頻播放的原生接口位于android_media_MediaPlayer.cpp文件中。