本文的目的是為了分析android中的多媒體播放體系,在了解了它的播放體系上,拋棄它原先的基于opencore的架構(gòu),重新涉及一套基于ffmpeg的架構(gòu)。沒(méi)有時(shí)間做詳細(xì)論述,本文目前先列一個(gè)提綱,用來(lái)分析android2.1中媒體播放架構(gòu),以后得空再進(jìn)行補(bǔ)充。
1,java部分供java應(yīng)用程序調(diào)用的接口為android.media.MediaPlayer。關(guān)于此類的詳細(xì)描述可以參考android的文檔MediaPlayer.html。我將接口列在了下面,
mMediaPlayer.stop(); mMediaPlayer.release();
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setOnPreparedListener(mPreparedListener);
mMediaPlayer.setOnVideoSizeChangedListener(mSizeChangedListener);
mMediaPlayer.setOnCompletionListener(mCompletionListener);
mMediaPlayer.setOnErrorListener(mErrorListener);
mMediaPlayer.setOnBufferingUpdateListener(mBufferingUpdateListener);
mMediaPlayer.setDataSource(mContext, mUri);
mMediaPlayer.setDisplay(mSurfaceHolder);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.setScreenOnWhilePlaying(true);
mMediaPlayer.prepareAsync();
mMediaPlayer.isPlaying() mMediaPlayer.start();
mMediaPlayer.pause(); mDuration =
mMediaPlayer.getDuration();
mMediaPlayer.getCurrentPosition();
mMediaPlayer.seekTo(msec);
2,android.media.MediaPlayer中有2部分,一部分供java上層如VideoView調(diào)用,一部分為native方法,調(diào)用jni。所有用到的jni的接口可以在frameworks/base/media/jni/android_media_MediaPlayer.cpp中找到。
3,android_media_MediaPlayer.cpp會(huì)調(diào)用c++層次的mediaplayer,在這里根據(jù)不同的擴(kuò)展名去調(diào)用不同的播放器,mp4可能會(huì)調(diào)用到PVPlayer。mediaplayer由下列文件實(shí)現(xiàn), frameworks/base/media/libmedia/IMediaPlayer.cpp frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp
4,PVPlayer由opencore實(shí)現(xiàn),從以下文件去探尋
frameworks/base/include/media/PVPlayer.h
external/opencore/android/playerdriver.cpp
5,視頻顯示的實(shí)現(xiàn),使用android-surface進(jìn)行render,由opencore對(duì)surfaceflinger做了封裝,在下列文件中, external/opencore/android/android_surface_output.h external/opencore/android/android_surface_output.cpp 如果我們使用基于ffmpeg的多媒體播放器,這一塊可以參考,并移植過(guò)去。
6,音頻的實(shí)現(xiàn),使用了AudioOutput,請(qǐng)參考如下文件 frameworks/base/media/libmediaplayerservice/MediaPlayerService.h frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp
調(diào)用MediaPlayerService::AudioOutput::open,創(chuàng)建AudioTrack
mTrack??梢圆檎乙幌抡{(diào)用了mTrack的哪些方法。 調(diào)用ssize_t ret = mTrack->write(buffer,
size);將數(shù)據(jù)寫(xiě)入AudioTrack。 frameworks/base/include/media/AudioTrack.h
frameworks/base/media/libmedia/AudioTrack.cpp
7,音頻這一塊太過(guò)混雜,libmedia調(diào)用了opencore,libaudioflinger調(diào)用了libmedia,對(duì)于我們封裝造成了很大困難。鑒于此,考慮直接調(diào)用linux音頻設(shè)備,不使用android中l(wèi)ibmedia,libaudioflinger。
8,歡迎聯(lián)系
agooou@gmail.com 探討
|