一、多媒体基础

音视频格式

一个视频文件的格式由封装格式+音频码流格式+视频码流格式+字幕流组成。

如下为一个视频文件的信息,是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)进行编解码库的开发与集成。

三、解码数据流向

音频解码数据流向

  1. 音乐APP调用MediaPlayer接口播放音乐,并将原始音乐文件的fd传给MediaPlayService
  2. MediaPlayService调用NuPlayer,NuPlayer使用MediaExtractor对该文件进行解析,识别音轨,歌曲信息,播放时长等。
  3. NuPlayer使用MediaExtractor提取数据,将数据送给MediaCodec的Input Buffer。
  4. MediaCodec使用软解码SW decoder,最终解码后是PCM数据,放到Output Buffer。
  5. NuPlayer从Output Buffer取数据,再通过AudioTrack将音频数据送给AudioFlinger。
  6. AudioFlinger再通过ALSA驱动写到DSP,DSP处理后转成模拟信号播放出来。

视频解码流向

  1. 视频APP调用MediaPlayer接口播放视频,并将原始视频文件的fd传给MediaPlayService。
  2. MediaPlayService调用NuPlayer,NuPlayer使用MediaExtractor对该文件进行解析,识别音轨,歌曲信息,播放时长等。
  3. NuPlayer使用MediaExtractor提取数据,将数据送给MediaCodec的Input Buffer。
  4. MediaCodec使用软解码SW decoder或硬解码VPU解码,最终解码后是YUV数据,放到Output Buffer。
  5. NuPlayer从Output Buffer取数据,再通过Surface将音频数据送给SurfaceFlinger。
  6. SurfaceFlinger再通过HW Composer将数据推送到DPU进行渲染,之后再推到屏幕显示。

Android音视频入门及架构介绍相关推荐

  1. Android 音视频入门之音频采集、编码、播放

    今天我们学习音频的采集.编码.生成文件.转码等操作,我们生成三种格式的文件格式,pcm.wav.aac 三种格式,并且我们用 AudioStack 来播放音频,最后我们播放这个音频. 本篇文章你将学到 ...

  2. 吹爆系列:教科书级别的Android音视频入门进阶学习手册,学完我成功“挤进”了抖音音视频开发岗

    Android开发工作两年,真的是感觉Android应用层开发没什么前景了,于是打算在网络安全,智能硬件,音视频这几个方向发展,考虑了一段时间,最终决定选择音视频.理由就不说了,既然选择了就要好好深耕 ...

  3. 堪称教科书级别的Android音视频入门进阶学习手册,开源分享

    概述 随着整个互联网的崛起,数据传递的形式也在不断升级变化,总的流行趋势如下: 纯文本的短信,QQ -> 空间,微博,朋友圈的图片文字结合 -> 微信语音 -> 各大直播软件 -&g ...

  4. Android 音视频入门/进阶教程

    后续的音视频文章,都会在这里更新 作为安卓开发仔,对音视频这块,一直是比较感兴趣的,所以,本着学习和记录的态度,我也把我所学的知识记录起来,希望对想音视频感兴趣的小伙伴有所帮忙. 一. 基础文章系列 ...

  5. 推荐几个堪称教科书级别的 Android 音视频入门项目

    公众号回复:OpenGL,领取学习资源大礼包 在 直播 中有提到几个不错的开源项目,这里再重点推荐一下: 目前,市面上关于音视频学习的相关书籍并不多,而且即使看了书籍学了理论,最终还是要回归到代码上来 ...

  6. Android音视频——MediaPlayerService

    MediaPlay一定不少人都知道,那MediaPlayerService呢?有多少人了解过呢,MediaPlayerService和MediaPlayer直接到关系是什么?那么接下来带着这些疑问往下 ...

  7. Android 音视频开发入门指南

    最近收到很多网友通过邮件或者留言说想学习音视频开发,该如何入门,我今天专门写篇文章统一回复下吧. 音视频这块,目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的,希望我后面能挤出时间整 ...

  8. Android音视频开发入门指南

    <Android 音视频从入门到提高 -- 任务列表> 1. 在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 Vi ...

  9. android音视频介绍(一)

    最近抽空回顾了下之前做过的一个音视频项目,突然发现曾经有踩过不少的坑,刚好这几天有时间就把这些东西整理了下,分享出来吧... 首先介绍下android中有关音视频播放使用到的类 : MediaPlay ...

最新文章

  1. 秀尔算法:破解RSA加密的“不灭神话” --zz
  2. Python几个简单好用的基础功能
  3. 自动批量修改linux用户密码
  4. 技术讨论 | 一次尚未完成的薅羊毛行动
  5. C/Cpp / 类中静态成员变量和普通成员变量的区别
  6. 爬虫的步骤解析内容xpath介绍_爬虫入门到精通-网页的解析(xpath)
  7. XmlPullParser
  8. linux内存平均值,linux下查看内存使用情况[转载]
  9. 简单的java信息显示_JSP实现简单的用户登录并显示出用户信息的方法
  10. 京瓷打印机更换墨盒后显示缺粉_京瓷1800打印机更换墨盒后仍然提示添加墨粉,怎么解决啊?...
  11. 数据结构课程设计———迷宫和哈夫曼编/译码器
  12. C#实现秒杀器之网站登录
  13. Solaris 查看系统信息命令
  14. 曲面映射的算法理论基础
  15. 今日杂谈---重用和程序员
  16. elementUI 日 周 月 季 年 时间选择控件封装
  17. 蓝牙音箱方案硬件架构介绍
  18. [日常训练] 联络网
  19. “熊孩子”乱敲键盘就攻破了Linux桌面,大神:17年前我就警告过你们
  20. 12款好用的Visual Studio插件,最后一款良心推荐

热门文章

  1. 笔记本做扩展屏的相关问题 —— spacedesk ,快捷键
  2. 11. spring-容器: @Value, @PropertySource详解
  3. 物联网操作系统HelloX已成功移植到MinnowBoard MAX开发板上
  4. access查找楼号为01_二级ACCESS模拟001
  5. qq音乐专辑封面 api
  6. 禁用viewpager的左右滑动功能
  7. Python实现系统桌面时钟
  8. 华为数通笔记-ISIS高级特性
  9. 基于深度学习的数据增广技术一览
  10. 天气预报的英语表达方式