AndroidMultimedia Framework 架构--base on jelly...
video 部分:
1:video playback
2:video streaming
3:video recorder
audio部分:
1:audio playback
2:audio streaming
3:sound recorder
4:audio flinger
android多媒体框架演变历史
android的多媒体框架从android诞生以来,发生了天方腹地的变化,
引擎的更改,
单独处理流媒体的播放器nuplayer的加入,
到最新jellybean(android4.1)nuplayer逐步加入stagefrightplayer的功能,
可能以后stagefight引擎会被nuplayer取代,那都是后话了。
但是openmax(即引擎连接codec的纽带)一直都得到了保持。
在Froyo2.2 以前,multimedia framework 的引擎是一直都是opencore,
但为啥用stagefright替代呢,
由于我没有开发过opencore,不便下结论,
但从网上一些言论来看,估计是opencore太过庞大,不太好维护.
Gingerbreadandroid2.3,
加入了真正的支持流媒体的播发器nuplayer,
如果你下有源码,可以用gitk\nuplayer,
从gitk可以看到如下提交:
Initial support for a true streaming player for mpeg2 transportstreams.2010.12。
android3.0 到android 4.0 ,总体框架没有多大变化。
android4.1(jellybean) 最大的变化是给c/c++部分的多媒体框架
单独设立了一个framework/av的目录,
给它开辟了一个git库,
即从framework/base下的git库分离了出来,总算给多媒体找了个港湾。
jellybean多媒体架构
multimediaframework 架构 由两大部分构成:
----framework/base/media:
供上层程序调用的java API,
连接java和C/C++的jni部分,
----framework/av: c/c++代码
多媒体引擎(stagefright)
codec接口(openmaxinterface)。
编译命令
如果你修改的是java API接口或加LOG后编译可以用如下命令:makeframework ,
JNI 部分:make media_jni,
framework/av有三个libs组成:
libmedia:make media
libmediaplayerservice: make mediaplayerservice
libstagefright: makestagefright
生成各自的.so文件,用adb push 到system/下就可以调试了。
记得重启!
讲了好多废话,还是没有看到总体架构,罪过,好吧,上图,更直观。
从上两图,我们可以发现上层APK要播放视频,
1::分配player类型
mediaplayerservice:获得一个player,类型根据你媒体文件的类型来决定的,
2:选择编码器
这个过程由awesomeplayer和omxcodec来完成,
至于声音和图像输出就交由audioflinger和surfaceflinger来完成了。
------------------------------------------------------------------------------------------------
m3u8流媒体code:
testCode:
./cts/tests/tests/media/src/android/media/cts/StreamingMediaPlayerTest.java
./frameworks/wilhelm/tests/native-media/res/values/strings.xml
<item>http://iphoned5.akamai.com.edgesuite.net/mhbarron/nasatv/nasatv_1500.m3u8</item>
<item>http://iphone.video.hsn.com/iPhone_high.m3u8</item>
<item>http://mlbsegqa.mlb.com/mlbam/dev/build84/2010/10/29/test1/master_wired.m3u8</item>
对于音频的处理:
1:libwebcore.so
./external/webkit/Source/WebCore/platform/MIMETypeRegistry.cpp
{ "application/vnd.apple.mpegurl", "m3u8" },
{ "application/mpegurl", "m3u8" },
{ "application/x-mpegurl", "m3u8" },
2:libmediaplayerservice.so
./frameworks/av/media/libmediaplayerservice/nuplayer
./frameworks/av/media/libmediaplayerservice/MediaPlayerFactory
具体的流程:
多媒体本地播放流程video playback--base on jellybean (三)