在Android上实现多格式多媒体播放器的几种方式

Google在Android 2.0版本以后采用了StageFright作为他的多媒体框架,但是StageFright自带的音视频解码标准实在太少。

    Android 2.3.1里面原生支持的Extractor有: AMR, MP3, MPEG4, Ogg, WAV

    Android 2.3.1里面原生支持的Audio解码器有: AMRNB AMRWB, MP3, AAC, G711

    Android 2.3.1里面原生支持的Video解码器有: MPEG4, H264, H264 (Baseline Profile), VPx (应该是VP8)

 

可以说目前最好的支持多标准媒体处理的开源项目是FFMpeg,因此在考虑多格式媒体播放器时自然会想到怎么样利用FFmpeg。

1. 通过JNI来调用FFmpeg.

   这种方式不管Android自己的多媒体框架,把FFmpeg作为一个应用调用起来。Rockplyer貌似就是用这样的方式实现的。网上有些教程教大家怎么做。 
 
2. 用Mplayer架构替换StageFright架构
    因为只是解码器,所以可以选用支持多格式更加完善的Mplayer来代替(这里应该叫Bypass更好)StageFright
    仿照StageFright与AwesomePlayer之间的API,在Mplayer上面实现它们, 这样对于Android应用层是完全不可见的,有点类似Google用StageFright替代OpenCore。
    这种方式的好处是可能开发速度会很快,FFmpeg作为Mplayer的解码核,不需要做任何的改动就可以直接使用,网上也有Mplayer的Android版本可供参考;
    这种方式的不好处就是替换了SF架构,这与Google的设计有些冲突。还有Mplayer对OpenMax的支持不足,以后系统扩展升级会遇到困难。
 
3. 按照Google提供的方法,添加不同的Demux, decoder 到SF中
    这种方式需要把不同的Demux, decoder从ffmpeg代码中提取出来,然后添加到 frameworks/base/media/libstagefright/codecs/ 目录里面。
    这种方式的好处在于完全按照google的架构来实现,也可以重用第三方的其他音视频标准的实现(如果能找到的话);
    这种方式的不好处在于所有的标准都需要一个个的重复做一边,开发周期可能会很长。
    以后FFMpeg升级了,这边的代码如果想做相应升级也会很麻烦,因为已经被拆分零散了。
 
4. 把FFmpeg看作是一个硬件解码核,作为一个OMX core通过OMX接口加载到SF系统中
    这种方式的好处在于不需要对FFmpeg的源代码进行修改,只需要把他用OMX包起来,然后加载到SF架构上去。
    这种方式的不好处在于需要去了解OpenMax的技术细节,实现的技术难度比较大,

 

究竟采用哪种方式,要看开发周期,开发人员的技术储备,以及对后续系统升级的要求了。

你可能感兴趣的:(StageFright,FFmpeg)