【学习】从零开始的Android音视频开发(9)——NuPlayer

Android NuPlayer MediaPlayer的核心是NuPlayer实现视频的解码、渲染、同步、输出。NuPlayer基于StagefrightPlayer的基础类构建,利用了底层ALooper/AHandler机制来进行异步解码播放,ALooper轮询队列中的消息,把消息推送道AHandler中处理,最后通过handleMessage函数回调,做相应的逻辑处理。 阅读详情

NuPlayer基于StagefrightPlayer的基础类构建,利用了底层的ALooper/AHandler机制来进行异步解码播放,Alooper轮循队列中的消息,把消息推送到AHandler处理,最后通过handleMessage函数回调,做相应的逻辑处理

NuPlayer整体结构

MediaPlayerFactory通过工厂模式创建NuPlayerFactory,然后通过NuPlayerFactory创建NuPlayerDriver,接着通过NuPlayerDriver构建一个NuPlayer,NuPlayer作为播放器,其中设计数据解析、解码、渲染等过程

在这里插入图片描述
在这里插入图片描述

NuPlayer的构建过程

在上层调用setDataSource函数后,开始到达MediaPlayerService的setDataSource函数,通过getPlayerType函数获取播放器类型

在这里插入图片描述

播放器类型枚举如下

在这里插入图片描述

这时再回到MediaPlayerFactory中看看getPlayerType函数
在这里插入图片描述

接下来进入一个宏函数,宏的主要作用是替换,提高代码的执行效率,因为其省去了分配和释放栈帧、传参、传返回值等一系列工作
在这里插入图片描述

这个宏函数的标示遍历map中存放的播放器工厂类,调用scoreFactory可以得到播放器的播放能力,如果是NuPlayer,默认有一个0.8的值,返回的ret就是NuPlayerFactory对象,如果得到的值为0.0,就进入getDefaultPlayerType函数
在这里插入图片描述

默认也是NuPlayerFactory

针对NuPlayerFactory不会直接创建NuPlayer,而是在NuPlayerDriver的构造函数中创建一个NuPlayerDriver
在这里插入图片描述

在NuPlayerDriver的构造函数中,创建了一个NuPlayer,NuPlayerDriver是对NuPlayer的封装,继承MediaPlayerInterface接口。通过NuPlayer可以实现播放功能,主要用于通知上面的流程

NuPlayer继承自AHandler,并且引入了AMessage,通过ALooper来处理消息,比如它的prepareAsync函数
在这里插入图片描述

实际就是发送一个kWhatPrepare消息。在onMessageReceived函数中,收到消息并进行处理(该函数太长,仅摘取kWhatPrepare部分分析)
在这里插入图片描述

NuPlayer的数据解析模块

解析的模块主要是NuPlayerSource以及继承它的几个类,如HTTPLiveSource、RTSPSource、GenericSource等

在NuPlayer中调用setDataSourceAsync函数后
在这里插入图片描述

这里会根据不同协议选择不同的Source对象,有了这个Source对象后,发送kWhatSetDataSource消息(下图同样只是该函数部分截图)
在这里插入图片描述

通过具体的Source解析完数据,再把Source强制转换成mSource给Decoder使用,这时里面就包含了数据相关信息,其中的一个HTTPLiveSource,主要用于解析HLS协议
在这里插入图片描述

当调用HTTPLiveSource的prepareAsync函数时

在这里插入图片描述

内部主要构建了一个LiveSession对象,通过LiveSession内部的connectAsync函数,创建一个会话

在这里插入图片描述
在这里插入图片描述

查看onConnect函数
在这里插入图片描述

网络请求,开始取播放列表,在取到播放列表后进行回调(下图是回调函数)
在这里插入图片描述

上面的代码主要是根据URL返回的M3U文件,获取对应的BandwidthItem,如果熟悉M3U文件,可以知道M3U文件有一级索引和二级索引,下图是一些举例
在这里插入图片描述

其主要作用是动态码率适应,BANDWIDTH越大,分辨率越高。BINDWIDTH实际上就是带宽

若想获得某个Track的信息,得到视频、音频、字幕相关信息,可以通过LiveSession的getTrackInfo函数
在这里插入图片描述

到此数据解析模块完成,视频源的主要作用都是得到音视频数据信息,最终通过mSource变量传递给解码器

NuPlayer的解码模块

它引入了NuPlayerDecoderBase,这是一个基类,真正的解码器逻辑在NuPlayerDecoder.cpp中,它继承了这个基类,下面先查看实例化解码器

在这里插入图片描述

上面的代码构造了Decoder对象,且进行了初始化和构建解码器

由于NuPlayerDecoder继承自NuPlayerDecoderBase类,所以Configure函数会执行NuPlayerDecoder的Configure函数,最终回调onConfigure函数,其位于NuPlayerDecoder.cpp中

在这里插入图片描述

从onConfigure函数可以看到,NuPlayerDecoder引入了MediaCodec作为解码器。通过CreateByType/CreateByComponentName创建了Codec对象。

NuPlayer的渲染模块

主要功能

1.将音视频原始数据缓存到队列
2.音频数据消耗播放
3.视频数据消耗显示
4.音视频同步
5.播放器控制

将音视频原始数据缓存到队列,在NuPlayerRenderer.h中,存在一个QueueEntry结构体和两个队列
在这里插入图片描述
在这里插入图片描述

数据在onQueueBuffer函数中进行添加
在这里插入图片描述

而音频的播放在NuPlayerRenderer中,会先调用openAudioSink函数
在这里插入图片描述

发送一个kWhatOpenAudioSink消息,收到消息后进行如下处理
在这里插入图片描述

调用onOpenAudioSink函数
在这里插入图片描述

这里打开了AudioSink(音频后端)。当将音频数据放入音频队列时,会接着调用postDrainAudioQueue_l函数
在这里插入图片描述

上图代码发送了一个kWhatDrainAudioQueue
在这里插入图片描述

主要是有一个进行判断的onDrainAudioQueue函数,判断是否需要重新向AudioSink写入数据
在这里插入图片描述

到这里,这个音频播放流程如下:先打开音频后端,然后当向音频队列中发送数据,音频队列同时向音频后端写入数据,以供播放音频

视频显示的话,同样是在视频原始数据进入视频队列后,开始执行postDrainVideoQueue函数

在这里插入图片描述

这里先发送一个kWhatDrainVideoQueue的消息,然后进行音视频同步,发送消息后会出发调用onDrainVideoQueue

在这里插入图片描述

NuPlayer::Renderer使用的是以视频为基准的同步机制,解码后的音频数据时间戳如果大于视频数据时间戳,直接丢弃音频包,然后直接渲染视频。同步机制主要位于视频缓冲区处理部分的onDrainVideoQueue和音频缓冲区处理部分的onDrainVideoQueue中。音视频的渲染都采用类似定时器的机制,只不过视频显示需要依赖于实际解码器,音频播放需要依赖于AudioSink接口

android 之 NuPlayer 介绍 是 Android NuPlayer 播放框架的核心渲染模块,负责协调音视频数据的。,确保播放流畅性与时序准确性。 阅读详情

相关推荐

NuPlayer源码分析(二)NuPlayer的音频buffer处理机制

一、引言: 在上一篇博客,对nuplayer的创建流程有了一个分析,并且在末尾引入了输入输出buffer的处理出处,这篇博客将分析nuplayer对音频buffer的处理机制。 先贴出输入输出buffer的核心处理函数: -------------------------------------------------------------------------- onMessageReceived@frameworks\av\media\libmediaplayerservice\nuplayer\N

achina2011jy的博客 2266

MediaPlayer的核心-NuPlayer

之前整理过[Android MediaPlayer源码分析],知道MediaPlayer的核心是NuPlayer实现视频的解码、渲染、同步、输出,这篇深入分析NuPlayer相关的知识体系

Gaga246的博客 1610

[Android] SDK->NuPlayer

[Android] SDK->NuPlayer。

ykun089的博客 858

Android怎么开发自己底层的NuPlayer音视频播放器框架

    Android怎么开发自己底层的NuPlayer播放器框架 引言   远离博客好久了,因为一直在忙于新的一个领域那就是Android底层音视频播放器框架的搭建,此时此刻公寓干的差不多了(虽然其中还是有许多的不足,和需要改进的,但是万事开头难吗,还是有一种小有成就的感觉!)。本篇博客不会大书特书音视频领域的相关知识,因为它太庞大了,那我写这篇博客的目的是什么呢,主要是总结概括一下如何搭建自己的Android底层音视频播放器框架。 重要的事情说三遍: 1.如果多Android音视频领域不感兴趣,可以

IT先森 2348

深入理解Android音视频同步机制(三)NuPlayer的avsync逻辑

本文深入介绍了NuPlayer的avsync逻辑和原理

张晖的专栏 1万+

UE5 VlcMedia 插件编译与流媒体播放实战

本文详细介绍了在虚幻引擎5中编译并集成VlcMedia插件以解决流媒体播放难题的实战指南。针对UE5不再默认支持Win32 API导致的编译错误,文章提供了核心的构建配置文件修改步骤,并指导如何启用插件、创建VLC媒体播放器,最终成功播放如.m3u8等格式的网络直播流或点播视频。

weixin_29013129的博客 339

Android音视频——NuPlayer框架

如标题所说,接下来讲的是NuPlayer,不知道对这个,大家了解多少呢。 Android2.3时引入流媒体框架,而流媒体框架的核心是NuPlayer。在之前的版本中一般认为Local Playback就用Stagefrightplayer+Awesomeplayer,流媒体用NuPlayer。Android4.0之后HttpLive和RTSP协议开始使用NuPlayer播放器,Android5.0(L版本)之后本地播放也开始使用NuPlayer播放器。 Android7.0(N版本)则完全去掉了Aweso

知道的越多,不知道的越多。 2951

信息学奥赛一本通高手训练1680:序列

题目 代码 #include<cstdio> #include<iostream> #include<cmath> #define LL long long using namespace std; const LL N = 1400000+7; const LL mod = 1e9+7; int n, t; LL pos[N], sum[N], ans[N]; struct node{ LL ll, rr; }a[N]; int main(){ p

qingfeixueyue的博客 468

Android多媒体框架(一)NuPlayer框架

NuPlayer框架 从5.0之后Android的音视频播放框架就开始全面抛弃AwesomePlayer,本地播放开始采用NuPlayer框架。本章会介绍NuPlayer创建流程、音视频解析、音视频解码器创建、音频Track创建、音频offload播放等NuPlayer相关流程。 音视频播放上层对外的接口都是调用MediaPlayer,做过应用的同学都是MediaPlayer的三步: setDa...

junluoyu000的博客 4655

Ubutntu下使用realsense d435i(二):获取某二维像素点的三维坐标

00 准备工作 准备工作包括安装驱动以及pyrealsense2,具体可参考上一篇: Ubutntu下使用realsense d435i(一):准备工作以及安装pyrealsense2 https://blog.youkuaiyun.com/gyxx1998/article/details/121461293 01 通过二维像素点获得物体三维坐标 这个在上一篇已经介绍了代码: realsense d435i获取某像素点三维坐标(计算深度和点云两种方法) https://blog.youkuaiyun.com/gyxx1998/

gyxx1998的博客 9944

洪水风险图制作全流程:HEC-RAS 与 ArcGIS 的耦合应用

本文系统介绍HEC-RAS水动力模拟软件在水利工程中的应用技术。内容涵盖:1)软件理论与安装;2)一维地形数据导入与河网构建;3)恒定流/非恒定流计算及模型调试要点;4)构筑物建模技术(桥梁、堰闸等);5)二维水动力模拟与溃坝分析;6)洪水风险图绘制。重点讲解水面线调试、糙率选取、报错分析等实操难点,通过案例教学实现从基础到工程应用的全流程技术掌握。该培训适用于防洪评价、河道治理等水利工程数值模拟需求。

2403_89974123的博客 1050

NuPlayer源码分析四:渲染模块&音视频同步

渲染模块&音视频同步 渲染模块的作用是,将音频、视频数据安装一定的同步策略通过对应的设备输出。这是所有的播放器都不可或缺的模块。 NuPlayer的渲染类为Renderer,定义在NuPlayerRenderer.h文件中。它的主要功能有: 缓存数据 音频设备初始化&数据播放 视频数据播放 音视频同步功能 缓存数据 在表明缓存逻辑之前,先介绍一下NuPlayerRenderer...

SuperLi 2936

sdio wifi 移植

介绍 简单来说,sdio起源自sd标准,顾名思义就是sd的IO接口(interface)的意思,更具体的说明,sd本来是记忆卡的标准,但是现在也可以把SD卡拿来插上一些外围设备接口使用,这个就是就叫做sdio。 而且sdio本身是一种相当单纯的技术,通过sd的IO引脚来连接外部外围,并且通过sd的IO数据接位与外围传输数据,而且sd协会也推出很完整的sdio stack 驱动程序,使得sdio外围得开发与应用变得非常热门 这里我们要移植的是RTL8822cs的sdio WiFi 模块,将其移植到rk3

Enosji的博客 9611

深入理解Android音视频同步机制(二)NuPlayer的avsync逻辑

深入理解Android音视频同步机制(二)NuPlayer的avsync逻辑

m0_60259116的博客 2478

学Simulink——基于电能质量治理的场景实例:静止无功发生器(SVG)与并网逆变器的结合

本文详细介绍了基于Simulink的SVG与光伏并网逆变器联合仿真建模方法。系统包含光伏单元、SVG主电路、控制策略(无功检测+双闭环控制)等模块,通过ip-iq法实现动态无功补偿。仿真结果表明,SVG能快速响应负载变化,将功率因数提升至0.98以上,有效稳定母线电压。该方案为新能源并网系统提供了有功/无功协同控制解决方案,具有10ms级响应速度和±5kvar补偿能力。文章提供了完整的建模流程、控制算法实现和结果分析,可作为电力电子与电能质量治理领域的实践指导。

amy_mhd的博客 167

Android SystemUI——车载CarSystemUI加载(八)

车载 CarSystemUI 是指专门为汽车环境设计的用户界面和用户体验(UI/UX),它通常与 Android Automotive OS 或其他嵌入式操作系统一起工作,为驾驶者和乘客提供安全、直观且高效的交互方式。Android Automotive OS 是 Google 专门为汽车开发的操作系统版本,它基于 Android 平台,并针对车辆内部的使用进行了优化。

小旭的专栏 2174

Android-NuPlayer音视频同步之安卓Q新功能

概述: NuPlayer在播放视频时,当收到kWhatScanSources消息,即有数据需要播放时,会先把render置成paused状态。因为audio解码比video慢,audio已经有数据需要显示时,video可能还没解码出来数据,所以在开始解码前先把render置成paused状态,当video有第一帧数据需要显示时再把render置成resume状态。vidoe aud...

cheriyou_的博客 1279

Unity零基础到入门 ☀️| 轻松学会 Unity界面布局和简单实例——入门级!(^_−)☆

入门级Unity知识,一起加油呀!

努力前行,总会成为自己心中的那道光 1万+

NuPlayer介绍

简介 Android2.3时引入流媒体框架,而流媒体框架的核心是NuPlayer。Android4.0之后HttpLive和RTSP协议开始使用NuPlayer播放器,Android5.0(L版本)之后本地播放也开始使用NuPlayer播放器。  视频是如何播放的 DataSource有两个概念: 上面框图中的DataSourceInput(或者直接叫DataSou

创造晴天的博客 6944

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android NuPlayer播放框架

①Android NuPlayer播放框架 [时间:2016-09] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架,nuplayerdriver] 0 NuPlayer简介 Android2.3时引入流媒体框架,而流媒体框架的核心是NuPlayer。在之前的版本中一般认为Local Playback就用Stagefrightp

jesse的博客 3172

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Android音视频——NuPlayer的渲染模块

渲染模块的主要功能如下。下面将音视频原始数据 缓存到队列。在\frameworks\av\media\libmediaplayerservice\ 上面主要是发送了一个消息kWhatDrainAudioQueue,找到对应接收消息的地方,代码如 下: 主要是有一个进行判断的onDrainAudioQueue函数,判断是否需要重新向AudioSink写入 数据,代码如下: 到这里,已经很清楚了,音频播放流程如下:先打开音频后端,然后当向音频队列中发送 数据时,音频队列同时向音频后端写入数据,以供播放音频。 那

知道的越多,不知道的越多。 1583

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

《Android音视频开发》— Android 书籍

文章目录第1章 音视频基础知识 1第2章 常用的系统播放器MediaPlayer 8第3章 管理调度的服务者MediaPlayerService 40第4章 StagefrightPlayer(AwesomePlayer) 60第5章 流媒体播放的新生力量NuPlayer 98第6章 OpenMAX(OMX)框架 118第7章 FFmpeg项目 161 出版年: 2018-11 简介: 近年来,直播、短视频行业的相关业务发展迅猛,《Android音视频开发》主要介绍其中涉及的Android音视频开发相关技术

qq_27494201的博客 3627

NuPlayer的构建

MediaPlayerService构造函数中初始化平台可用的播放器类型 NU_PLAYER为播放器的类型即下面的PlayerType 将表存在sFactoryMap里 MediaPlayerFactory::tFactoryMap MediaPlayerFactory::sFactoryMap;为类内全局变量  播放初始化资源时,获取对应的player getPlayerType中获取播...

温柔一刀 1492

Android多媒体框架:从MediaPlayer到NuPlayer

Android上经常会使用到MediaPlayer去播放音频和视频。但是从严格意义上来说,MediaPlayer并不是播放器本身,它只是Android框架层众多媒体播放器(包括ROM厂商自定义的播放器)的“壳”。 MediaPlayer的主要操作(包括但不限于播放、暂停、快进等)都会调用到框架层的播放器,比如常见的NuPlayer播放器。

yihanss的博客 2992

Android音视频——NuPlayer数据解析模块详解

从上文 Android音视频——NuPlayer框架的图来看 可以看到 NuPlayer 的解析模块主要是

知道的越多,不知道的越多。 1737
上一篇: 【学习】从零开始的Android音视频开发(8)——AwesomePlayer的渲染输出过程及总结
下一篇: 【学习】从零开始的Android音视频开发(10)——OMX:Codec部分中AwesomePlayer到OMX服务
Panic  Lin
博客等级 码龄6年 81粉丝 64原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值