NuPlayer是AOSP中提供的多媒体播放框架,能够支持本地文件、HTTP(HLS)、RTSP等协议的播放,通常支持H.264、H.265/HEVC、AAC编码格式,支持MP4、MPEG-TS封装。
在实现上NuPlayer和Awesomeplayer不同,NuPlayer基于StagefrightPlayer的基础类构建,利用了更底层的ALooper/AHandler机制来异步地处理请求,ALooper列队消息请求,AHandler中去处理,所以有更少的Mutex/Lock在NuPlayer中。Awesomeplayer中利用了omxcodec而NuPlayer中利用了Acodec。
NuPlayerDriver : public MediaPlayerInterface public ALooper
AVNuFactory
NuPlayer : public AHandler
NuPlayer
播放文件:HTTPLiveSource RTSPSource GenericSource(本地)
AMessage AHandler
(NuPlayerDriver)mLooper->registerHandler(mPlayer);(NuPlayer)
- NuPlayer::Source:解析模块(parser,功能类似FFmpeg的avformat)。其接口与MediaExtractor和MediaSource组合的接口差不多,同时提供了用于快速定位的seekTo接口。
- NuPlayer::Decoder:解码模块(decoder,功能类似FFmpeg的avcodec),封装了用于AVC、AAC解码的接口,通过ACodec实现解码(包含OMX硬解码和软解码)。
- NuPlayer::Render:渲染模块(render,功能类似声卡驱动和显卡驱动),主要用于音视频渲染和同步,与NativeWindow有关
DataSource有两个概念:
- 上图中的DataSourceInput(DataSource)指的是单纯的原始数据(容器格式,没有经过demuxer处理)。
- 在后文中setDataSource中DataSource指的是从数据输入到demux输出的一个过程(即图中最外层的DataSource)。
VideoTrack与AudioTrack指的是Extractor(即demux)的两个通道,从这里输出的分别就是单纯的解复用后的Video和Audio流。再经过Decoder后输出的就是音、视频的输出了:
- VideoRenderer + Surface即视频的输出;
- AudioSink即音频的输出;
在prepare的过程中会创建Extractor, Extractor的主要作用是从容器格式中把音频和视频剥离出来,为之后的解码提供音频流和视频流,要知道。音频和视频的解码是分离的, 所以Extractor这一步非常重要
环境及相应DataSource都准备好以后,上层发送start开始播放流程以后,开始创建解码器
case kWhatSetDataSource:
driver->notifySetDataSourceCompleted(err);
NuPlayer框架中最顶层的类是NuPlayerDriver,继承自MediaPlayerInterface,主要提供一个状态转换机制,作为NuPlayer类的Wrapper。NuPlayerDriver类中最重要的成员是以下几个:
State mState
播放器状体标志sp<ALooper> mLooper
内部消息驱动机制sp<NuPlayer> mPlayer
真正完成播放器的类
sendEvent(msg, ext1, ext2, in);//发给上层的状态消息通知
光着脚丫行一生的专栏
http://blog.csdn.net/liu1314you/article/details/56682378
NuPlayer介绍
http://blog.csdn.net/u010025003/article/details/52743482
Solution Title
What are the basic steps to implement custom MediaExtractor in Android | ||||
Solution Details |
|
\frameworks\av\media\libmediaplayerservice\nuplayer\
NuPlayer.cpp
NuPlayerDecoder.cpp
NuPlayerRenderer.cpp
\frameworks\av\media\libmedia
AudioSystem.cpp
AudioTrack.cpp
\frameworks\av\media\libstagefright\
ACodec.cpp
\frameworks\av\services\audioflinger
AudioFlinger.cpp
\harwdware\xxx\audio\hal
audio_hw.c
\harwdware\xxx\audio\hal\xxx
platform.c
hw_info.c
\frameworks\av\services\audiopolicy\
AudioPolicyManager.cpp