NuPlayer

本文深入解析了Android系统中NuPlayer的架构与工作原理,包括其内部的打分机制、解码模块、渲染流程等关键部分。

NuPlayer 安卓原生的Player , 用于替代Awesomeplayer ;

1 结构关系图

 MediaPlayerFactory 通过工厂模式创建AwesomePlayer , NuPlayer,其他Player.

问:具体创建哪个Player 如何选择?

答:通过打分机制,选择得分最高的。

MediaPlayerService::Client::setDataSource()
>MediaPlayerFactory::getPlayerType()
>>GET_PLAYER_TYPE_IMPL() //这是个宏函数
>>> v->scoreFactory() //这里会遍历所有注册player 的分数 ,然后选最高的那个

每个player 都有实现自己的sorceFactory() 函数。 已Nuplayer 来说,位置再:
class NuplayerFactory : public MediaPlayerFactory :: IFactory 中

2 NuPlayer 层次关系

 3 Nuplayer 解码模块

Nuplayer 解码引入了NuplayerDecodeBase, 这是个基类。 真正解码逻辑再NuPlayerDecoder.cpp 文件中。 

解码器创建流程:

NuPlayer::instantiateDecoder()
> *decoder->configure(format)
>> NuPlayer::Decoder::onConfigure()
>>>MediaCodec::CreateByType()
>>>mcodec->configure() //构建解码器
>>>mcodec->start()

4 NuPlayer Render

  代码逻辑位于NuPlayerRenderer.c 中

1 解码后的音视频数据在哪里缓存?
答:再NuPlayerRenderer.c 文件中有个QueueEntry 的队列, 声明如下两个变量:
List<QueueEntry> mAudioQueue; //音频缓存队列
List<QueueEntry> mVideoQueue; //视频缓存队列
通过NuPlayer::Renderer::onQueueBuffer() // 将数据推进队列中;

2 解码后的音视频数据如何进行render?
再Nuplayer::Renderer::onDrainAudioQueue() 中消耗Audio数据;
postDrainVideoQueue()中会做AVSYNC, 之后会Call到NuPlayer::Renderer::OnDrainVideoQueue() 中消耗Video 数据,

### 三级标题:AwesomePlayer与NuPlayer的对比分析 在IT领域,特别是在Android多媒体框架中,AwesomePlayer和NuPlayer是两个关键的媒体播放器实现。它们在架构设计、性能表现以及适用场景上各有特点。 #### 架构差异 AwesomePlayer基于OMXCodec进行开发,依赖于OpenMAX IL接口来完成音视频解码工作。这种设计使得它能够较好地支持硬件加速解码功能,但同时也带来了较高的系统资源消耗[^1]。相比之下,NuPlayer则采用了更为先进的Acodec组件作为其核心解码模块。Acodec不仅提供了对软硬混合解码的支持,还通过ALooper/AHandler机制实现了高效的异步消息处理流程,从而显著降低了线程间同步所带来的开销[^1]。 #### 性能表现 由于使用了更底层的消息传递模型,NuPlayer能够在处理大规模并发请求时保持较低的延迟水平,并且减少了锁竞争现象的发生频率。这直接导致了整体吞吐量的提升以及用户体验上的改善[^1]。另一方面,虽然AwesomePlayer同样具备不错的实时性控制能力,但由于其内部存在较多互斥锁操作,在高负载环境下可能会出现一定程度的性能瓶颈。 #### 扩展性和兼容性 从扩展角度来看,NuPlayer展现出了更强的优势。它可以轻松适应多种新型编码格式及传输协议的变化需求,例如HTTP Live Streaming (HLS) 和 Real Time Streaming Protocol (RTSP) 等[^3]。同时,NuPlayer内置了一套灵活的内容源识别机制,可以根据输入流类型自动选择最合适的解析策略(如GenericSource, HTTPLiveSource等)[^4]。而AwesomePlayer在这方面的灵活性稍逊一筹,通常需要针对特定应用场景做出额外调整才能达到最佳效果。 #### 应用场景 对于那些追求极致效率并希望充分利用现代移动设备硬件加速特性的应用来说,NuPlayer无疑是首选方案。尤其适用于在线视频直播、高清电影回放等领域[^2]。而对于一些老旧项目或者对现有代码库有特殊依赖的情况,则可能更适合继续沿用AwesomePlayer以减少迁移成本。 综上所述,尽管两者都能胜任基本的音频/视频播放任务,但在具体实施过程中仍需根据实际业务需求和技术条件作出合理抉择。 ```cpp // 示例代码展示如何设置视频表面纹理 void NuPlayer::setVideoSurfaceTextureAsync(const sp<IGraphicBufferProducer>& bufferProducer) { sp<AMessage> msg = new AMessage(kWhatSetVideoSurface, this); if (bufferProducer == NULL) { msg->setObject("surface", NULL); } else { msg->setObject("surface", new Surface(bufferProducer, true /* controlledByApp */)); } msg->post(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值