Android音视频入门及架构介绍
目录
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,免费的无损音频格式,比较常用。
软/硬编解码
软编解码,又称软件解码,由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进行渲染,之后再推到屏幕显示。