Android音视频入门及架构介绍

一、多媒体基础

音视频格式

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

如下为一个视频文件的信息,是asf封装的wmav2音频+mpeg4视频。

Android音视频入门及架构介绍_第1张图片

常用的视频格式

  • 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)进行编解码库的开发与集成。

Android音视频入门及架构介绍_第2张图片

 

三、解码数据流向

音频解码数据流向

  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处理后转成模拟信号播放出来。

Android音视频入门及架构介绍_第3张图片 

 

视频解码流向

  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音视频入门及架构介绍_第4张图片 

 

你可能感兴趣的:(音视频,ffmpeg,android,音视频)