音频封装格式一般由:多媒体信息+音频流+封面流+歌词流组成。有些音乐会包含封面和歌词,则对应有封面流、歌词流。多媒体信息包括:标题、艺术家、专辑、作曲、音乐风格、日期、码率、时长、声道布局、采样率、音频编码器等。而音频封装包括:mp3、m4a、ogg、amr、wma、aac、wav、flac、ape等。前面两篇文章介绍过相关概念:走进音视频的世界——音视频基本概念、走进音视频世界——视频封装格式。音频格式如下图所示:
以下面问题为出发点,揭开音频封装格式的面纱:
① 音乐封面如何获取?
② 音乐歌词如何获取与显示?
③ 有损格式与无损格式有什么区别?
④ 不同封装格式有什么联系,又有什么区别?
先从FFprobe检测到的音频metadata说起,如下图1所示:
从上图可以看出,前半部分是title标题、artist艺术家、album专辑、album_artist艺术家专辑、composer作曲者、genre音乐风格式;中间部分是lyrics歌词,每句歌词前面有对应的时间戳;后半部分是两个流,第0编号的流是音频轨,包含:音频编码器、采样率、声道布局、码率,第1编号的流是封面,其实是一帧图像,包含:图像编码器、像素格式、分辨率。接下来根据上面提出的问题进行展开分析。
1、获取音乐的封面
音乐封面保存在视频图像流中,先解析出图像编码器、像素格式、分辨率等参数,然后根据编码器去寻找对应的解码器,并打开解码器,对图像编码压缩数据进行解码,最终解码出来的图像就是封面了。
2、音乐歌词的获取与显示
上面有提及,每句歌词前面有显示的时间戳,以音频时钟为基准,歌词时间戳同步于音频时间戳。也就是根据音频时间戳来同步解析歌词,然后把歌词回调到应用层渲染显示。另外一个问题,当前歌词什么时候该消失呢?歌词没有具体的显示时长,等待下一个歌词的到来,把当前歌词覆盖。
3、有损格式与无损格式的区别
(1) 无损音乐格式
无损音乐格式有ape、wav、flac三种,其中ape、flac都是基于wav进行压缩。而wav是微软专门为Windows开发的一种标准数字音频文件,文件扩展名wav,是WaveForm的缩写,文件大小计算公式:size=(采样率*量化位数*声道/8)/时间(秒)。一般采样率是44100Hz,量化位数为16位,声道数为2(即立体声道),1分钟的音频占用存储空间约为10M。
在Windows环境下,大多数媒体文件都是按照资源互换文件格式(Resource Interchange File Format)来储存信息的,简称为RIFF格式。构成RIFF的基本单位成为块(Chunk),每个RIFF文件由若干块组成,wav基本结构如下表所示:
RIFF块 文件格式类型“WAVE”
fmt块fact 块(压缩编码格式要含有该块)data块
表1—wav基本结构
每个块由块标识、长度、数据组成,如下代码段:
struct chunk {
u32 id; //块标识
u32 size; //块大小
u8 data[size]; //块内容
};
其中fmt块由声道数、采样率、码率、块对齐、量化位数五个参数组成,如下表所示:
Num Channels 2 Bytes 小端存储 SampleRate 4 Bytes 小端存储 ByteRate 4 Bytes 小端存储 Block Align 2 Bytes 小端存储 BitsPerSample 2 Bytes 小端存储
表2—WaveForm的format参数
(2) 有损音乐格式
有损音乐格式包括:mp3、m4a、ogg、amr、wma、aac等。目前最为流行的是mp3(MPEG-1 audio layer3),有着mp3的下一代之称的是aac(Advance Audio Coding)。有损格式压缩率比无损的高,文件占用存储空间小,但是声音还原度不如无损格式。我们下载音乐时,碰到高品质或者无损音质的音乐,通常要VIP会员或按需收费,因为越高品质越接近原声。而无损音乐从理论上能够100%保留声音细节,100%还原原声。无损音质英文简称为SQ(Super Quality,超音质)。关于无损格式与有损格式对比如下表所示:
常见格式 是否有损 优点 缺点 mp3、m4a、ogg、amr、wma、aac 有损 音质相对差 占用空间小 wav、ape、flac 无损 音质相对好 占用空间大
表3—有损与无损格式对比
4、不同封装格式的联系与区别
封装格式共同点是基本结构是相同的,都是由多媒体信息+音频流+封面流+歌词流组成。区别是不同封装格式,采用编码方式不一样,压缩率不一样,音频流子结构不一样。下面是不同封装格式的多方位对比,如表4所示:
格式
发布者
年份
编码器
是否有损 描述
wav
微软
1991
pcm
无损 波形文件,直接存储声音波形
ape
Matthew
2000
ape
无损 压缩率约为55%,比flac高
flac
Josh Coalson
2000
flac
无损 抗损坏,快速定位,可用于流媒体
mp3
MPEG-1
1992
mp3
有损 压缩比1:10甚至1:12,占有存储空间小,有版权
aac
MPEG-2
1997
aac
有损 支持多声道,更高解析度,更高压缩率
m4a
MPEG-4
1998
aac
有损 MPEG-4的扩展名,由ipod采用m4a变得流行
ogg
Xiph.org
不详
vobis
有损 全称OGGVobis,支持多声道,支持流式播放
amr
欧盟通信
不详
amr_nb/amr_wb
有损 自适应多码率,占用存储空间特别小
wma
微软
1999
wma
有损 支持证书加密,主要应用于VOIP视频通话
表4—不同封装格式对比
音视频学习和音视频处理项目可参考:GitHub - xufuji456/FFmpegAndroid: android端基于FFmpeg音视频处理。实现音频剪切、拼接、转码、混音、均衡器音效;视频剪切、水印、截图、转码、编解码、转Gif动图;FFmpeg本地推流、H264与RTMP实时推流直播;FFmpeg滤镜,歌词解析,音视频学习路线,音视频知识总结、流媒体协议