Android音视频入门及架构介绍
一、多媒体基础
音视频格式
一个视频文件的格式由封装格式+音频码流格式+视频码流格式+字幕流组成。
如下为一个视频文件的信息,是asf封装的wmav2音频+mpeg4视频。
常用的视频格式
- MPEG系列,由ISO开发,有MPEG-1,MPEG-2,MPEG-4, 有视频也有音频。
- H26x系列, 由ITU开发,侧重网络传输只有视频编码,H265(资源消耗是H264的1/2)需要license
- rmvb/rm ,由RealNetwork开发,需要license
- WMV系列,由微软开发,有WMV7/8/9,需要license
常见的音频格式
- MP3,MPEG Audio Layer 3, 有损压缩,压缩高频部分,压缩率约为90%
- AAC,杜比,索尼等共同开发,基于MPEG技术,有损压缩,比MP3音质好, 多声道支持。比较常用,例如苹果设备,sony蓝牙耳机采用该格式。
- AC3,杜比环绕音格式,支持5.1通道,信息损失很少,全频段的细节丰富
- WMA,Windows Media Audio,微软公司推出的与MP3格式齐名的一种新的音频格式。
- APE,开源的无损音频格式,压缩率约为55%,比FLAC高。
- FLAC,免费的无损音频格式,比较常用。https://github.com/mewkiz/flac
软/硬编解码
软编解码,又称软件解码,由CPU实现编解码运算。
硬编解码,由专门的硬件实现编解码运算,例如高通平台的aDSP,VPU。
码率(bps)
不进行编码压缩的原始视频,播放时每秒需要的bit数。
例如一个视频:1280 width * 720 high,YUV 420(每个像素平均 12bit),帧率25fps
其每秒原始的数据量为:1280 x 720 (总像素) x 12bit(每个像素占用) x 25(fps) = 331776000 bits(约40M)
一般也会用bps能力来衡量系统的编解码性能。
二、Android音视频架构
Android 10之后引入专用的C2架构(用来代理OMX IL架构),C2相比OMX更加灵活,支持更多功能。
整体架构由3大部分组成,NuPlayer播放器,MediaExtractor媒体解析器,MediaCodec编解码器。
采用该架构很方便基于C2 API(或OMX API)进行编解码库的开发与集成。
三、解码数据流向
音频解码数据流向
- 音乐APP调用MediaPlayer接口播放音乐,并将原始音乐文件的fd传给MediaPlayService
- MediaPlayService调用NuPlayer,NuPlayer使用MediaExtractor对该文件进行解析,识别音轨,歌曲信息,播放时长等。
- NuPlayer使用MediaExtractor提取数据,将数据送给MediaCodec的Input Buffer。
- MediaCodec使用软解码SW decoder,最终解码后是PCM数据,放到Output Buffer。
- NuPlayer从Output Buffer取数据,再通过AudioTrack将音频数据送给AudioFlinger。
- AudioFlinger再通过ALSA驱动写到DSP,DSP处理后转成模拟信号播放出来。
视频解码流向
- 视频APP调用MediaPlayer接口播放视频,并将原始视频文件的fd传给MediaPlayService。
- MediaPlayService调用NuPlayer,NuPlayer使用MediaExtractor对该文件进行解析,识别音轨,歌曲信息,播放时长等。
- NuPlayer使用MediaExtractor提取数据,将数据送给MediaCodec的Input Buffer。
- MediaCodec使用软解码SW decoder或硬解码VPU解码,最终解码后是YUV数据,放到Output Buffer。
- NuPlayer从Output Buffer取数据,再通过Surface将音频数据送给SurfaceFlinger。
- SurfaceFlinger再通过HW Composer将数据推送到DPU进行渲染,之后再推到屏幕显示。
Android音视频入门及架构介绍相关推荐
- Android 音视频入门之音频采集、编码、播放
今天我们学习音频的采集.编码.生成文件.转码等操作,我们生成三种格式的文件格式,pcm.wav.aac 三种格式,并且我们用 AudioStack 来播放音频,最后我们播放这个音频. 本篇文章你将学到 ...
- 吹爆系列:教科书级别的Android音视频入门进阶学习手册,学完我成功“挤进”了抖音音视频开发岗
Android开发工作两年,真的是感觉Android应用层开发没什么前景了,于是打算在网络安全,智能硬件,音视频这几个方向发展,考虑了一段时间,最终决定选择音视频.理由就不说了,既然选择了就要好好深耕 ...
- 堪称教科书级别的Android音视频入门进阶学习手册,开源分享
概述 随着整个互联网的崛起,数据传递的形式也在不断升级变化,总的流行趋势如下: 纯文本的短信,QQ -> 空间,微博,朋友圈的图片文字结合 -> 微信语音 -> 各大直播软件 -&g ...
- Android 音视频入门/进阶教程
后续的音视频文章,都会在这里更新 作为安卓开发仔,对音视频这块,一直是比较感兴趣的,所以,本着学习和记录的态度,我也把我所学的知识记录起来,希望对想音视频感兴趣的小伙伴有所帮忙. 一. 基础文章系列 ...
- 推荐几个堪称教科书级别的 Android 音视频入门项目
公众号回复:OpenGL,领取学习资源大礼包 在 直播 中有提到几个不错的开源项目,这里再重点推荐一下: 目前,市面上关于音视频学习的相关书籍并不多,而且即使看了书籍学了理论,最终还是要回归到代码上来 ...
- Android音视频——MediaPlayerService
MediaPlay一定不少人都知道,那MediaPlayerService呢?有多少人了解过呢,MediaPlayerService和MediaPlayer直接到关系是什么?那么接下来带着这些疑问往下 ...
- Android 音视频开发入门指南
最近收到很多网友通过邮件或者留言说想学习音视频开发,该如何入门,我今天专门写篇文章统一回复下吧. 音视频这块,目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的,希望我后面能挤出时间整 ...
- Android音视频开发入门指南
<Android 音视频从入门到提高 -- 任务列表> 1. 在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 Vi ...
- android音视频介绍(一)
最近抽空回顾了下之前做过的一个音视频项目,突然发现曾经有踩过不少的坑,刚好这几天有时间就把这些东西整理了下,分享出来吧... 首先介绍下android中有关音视频播放使用到的类 : MediaPlay ...
最新文章
- 秀尔算法:破解RSA加密的“不灭神话” --zz
- Python几个简单好用的基础功能
- 自动批量修改linux用户密码
- 技术讨论 | 一次尚未完成的薅羊毛行动
- C/Cpp / 类中静态成员变量和普通成员变量的区别
- 爬虫的步骤解析内容xpath介绍_爬虫入门到精通-网页的解析(xpath)
- XmlPullParser
- linux内存平均值,linux下查看内存使用情况[转载]
- 简单的java信息显示_JSP实现简单的用户登录并显示出用户信息的方法
- 京瓷打印机更换墨盒后显示缺粉_京瓷1800打印机更换墨盒后仍然提示添加墨粉,怎么解决啊?...
- 数据结构课程设计———迷宫和哈夫曼编/译码器
- C#实现秒杀器之网站登录
- Solaris 查看系统信息命令
- 曲面映射的算法理论基础
- 今日杂谈---重用和程序员
- elementUI 日 周 月 季 年 时间选择控件封装
- 蓝牙音箱方案硬件架构介绍
- [日常训练] 联络网
- “熊孩子”乱敲键盘就攻破了Linux桌面,大神:17年前我就警告过你们
- 12款好用的Visual Studio插件,最后一款良心推荐