android全格式多媒体播放器(二:opencore媒体系统解析)

来源:互联网 发布:网络推广怎么拿提成 编辑:程序博客网 时间:2024/04/26 06:53

作者 QQ: 35327864,msn: fgwf1@hotmail.com,mail: agooou@gmail.com

本文的目的是为了分析android中的多媒体播放体系,在了解了它的播放体系上,抛弃它原先的基于opencore的架构,重新涉及一套基于ffmpeg的架构。没有时间做详细论述,本文目前先列一个提纲,用来分析android2.1中媒体播放架构,以后得空再进行补充。

1,java部分供java应用程序调用的接口为android.media.MediaPlayer。关于此类的详细描述可以参考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调用,一部分为native方法,调用jni。所有用到的jni的接口可以在frameworks/base/media/jni/android_media_MediaPlayer.cpp中找到。

3,android_media_MediaPlayer.cpp会调用c++层次的mediaplayer,在这里根据不同的扩展名去调用不同的播放器,mp4可能会调用到PVPlayer。mediaplayer由下列文件实现,
frameworks/base/media/libmedia/IMediaPlayer.cpp
frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp

4,PVPlayer由opencore实现,从以下文件去探寻
     frameworks/base/include/media/PVPlayer.h
     external/opencore/android/playerdriver.cpp

5,视频显示的实现,使用android-surface进行render,由opencore对surfaceflinger做了封装,在下列文件中,
external/opencore/android/android_surface_output.h
external/opencore/android/android_surface_output.cpp
如果我们使用基于ffmpeg的多媒体播放器,这一块可以参考,并移植过去。

6,音频的实现,使用了AudioOutput,请参考如下文件
frameworks/base/media/libmediaplayerservice/MediaPlayerService.h
frameworks/base/media/libmediaplayerservice/MediaPlayerService.cpp
调用MediaPlayerService::AudioOutput::open,创建AudioTrack mTrack。可以查找一下调用了mTrack的哪些方法。
调用ssize_t ret = mTrack->write(buffer, size);将数据写入AudioTrack。
frameworks/base/include/media/AudioTrack.h
frameworks/base/media/libmedia/AudioTrack.cpp

7,音频这一块太过混杂,libmedia调用了opencore,libaudioflinger调用了libmedia,对于我们封装造成了很大困难。鉴于此,考虑直接调用linux音频设备,不使用android中libmedia,libaudioflinger。

8,欢迎联系 agooou@gmail.com 探讨

原创粉丝点击