多媒体 nuplayer

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lf12345678910/article/details/59483829

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

1. Implement the parser interface (MediaExtractor).

2. Register the sniffer in DataSource (/frameworks/av/media/libstagefright/DataSource.cpp) 

3. Map your extractor to MIME in MediaExtractor (/frameworks/av/media/libstagefright/MediaExtractor.cpp)

E.g. MPEG4Extractor

/frameworks/av/media/libstagefright/include/MPEG4Extractor.h

/frameworks/av/media/libstagefright/MPEG4Extractor.cpp 

\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

猜你喜欢

转载自blog.csdn.net/lf12345678910/article/details/59483829