一、NuPlayer介绍
MediaPlayer的核心是NuPlayer实现视频的解码、渲染、同步、输出。NuPlayer基于StagefrightPlayer的基础类构建,利用了底层ALooper/AHandler机制来进行异步解码播放,ALooper轮询队列中的消息,把消息推送道AHandler中处理,最后通过handleMessage函数回调,做相应的逻辑处理。下图是NuPlayer的工作流程:
可以看到Android当中采用NuPlayer作为主流播放器,NuPlayer采用StageFright引擎,StageFright内部集成了OpenMAX编解码器,会话管理、时间同步、渲染、传输控制和DRM(Digital Rights Management)
AHandler机制
在NuPlayer源码当中到处能看到AHandler的影子,NuPlayer就是通过AHandler建立各个成员之间的通信和交互,类似Android Java层中的Handler一样,AHandler是Android native层实现的一个异步消息机制,在这个机制中所有的处理都是异步的,将变量封装到一个消息AMessage结构体中,然后放到队列中去,后台专门有一个线程会从这个队列中取出消息然后执行,执行函数就是onMessageReceived。 原理如下图:
下图是NuPlayer的架构设计:
二、NuPlayer接口
void NuPlayer::init(const wp<NuPlayerDriver> &driver)
void NuPlayer::setDataSourceAsync(const sp<IStreamSource> &source)
void NuPlayer::setDataSourceAsync(const sp<IMediaHTTPService> &httpService, const char *url, const KeyedVector<String8, String8> *headers)
void NuPlayer::setDataSourceAsync(int fd, int64_t offset, int64_t length)
void NuPlayer::setDataSourceAsync(const sp<DataSource> &dataSource)
void NuPlayer::setDataSourceAsync(const String8& rtpParams)
void NuPlayer::prepareAsync()
void NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink)
void NuPlayer::start()
status_t NuPlayer::getBufferingSettings(BufferingSettings *buffering /* nonnull */)
status_t NuPlayer::setBufferingSettings(const BufferingSettings& buffering)
status_t NuPlayer::setPlaybackSettings(const AudioPlaybackRate &rate)
status_t NuPlayer::getPlaybackSettings(AudioPlaybackRate *rate /* nonnull */)
status_t NuPlayer::se