一、音视频基础概念:采样率、比特率、编码格式、封装格式、音视频同步基础
各位同学,欢迎来到《Android音视频处理实战》的第一章。
说实话,音视频处理的门槛并不低。很多新手一上来就对着FFmpeg的命令行发懵,或者被一堆术语绕晕。我个人习惯是,先把地基打牢。今天我们就来聊聊音视频世界里最核心的几个概念:采样率、比特率、编码格式、封装格式,还有那个让人头疼的音视频同步。
这些概念,说白了就是音视频的“身份证”和“打包方式”。你搞懂了它们,后面写代码、调参数、修bug,心里就有底了。
核心观点: 音视频处理的本质,就是“采集→编码→封装→传输→解封装→解码→渲染”这条流水线。今天讲的每个概念,都是这条流水线上的一颗螺丝钉。
1. 采样率:声音的“像素”
采样率,单位是Hz(赫兹)。它表示一秒钟内,从连续的声音信号里采集了多少个样本点。
你可以把声音想象成一条连续的曲线。计算机没法直接处理曲线,只能每隔一小段距离取一个点。取的点越多,曲线还原得越精细。这就是采样率。
常见的采样率:
- 8000 Hz:电话语音。够用,但别指望听出歌手的换气声。
- 44100 Hz (44.1kHz):CD音质。音乐制作的标准。
- 48000 Hz (48kHz):电影、视频常用。Android MediaRecorder 默认就是这个。
- 96000 Hz (96kHz):高解析度音频。说实话,人耳能分辨的差异很小。
我的经验: 在Android上做语音识别或VoIP,用16000Hz就够了,省带宽省存储。但做音乐App,至少得44.1kHz。我曾经为了省流量把采样率降到8000Hz,结果用户反馈“声音像在水里说话”……嗯,后来再也不敢乱降了。
2. 比特率:数据量的“水龙头”
比特率,单位是bps(比特每秒)。它决定了音视频流每秒占用多少数据量。
比特率越高,画质/音质越好,文件也越大。比特率越低,画质/音质越差,但适合网络传输。
比特率的两种类型:
- CBR(固定比特率):全程保持同一个比特率。简单粗暴,但效率低。静态画面也浪费带宽。
- VBR(可变比特率):根据画面复杂程度动态调整。复杂场景给高码率,简单场景给低码率。效率高,但编码时间稍长。
| 场景 | 推荐视频比特率 | 推荐音频比特率 |
|---|---|---|
| 短视频(720p) | 1-2 Mbps | 128 kbps |
| 直播(1080p) | 3-5 Mbps | 128-192 kbps |
| 本地高清(1080p) | 8-15 Mbps | 256-320 kbps |
避坑指南: 我曾经在直播项目里,把视频比特率设成10Mbps,结果用户手机发热、卡顿、掉帧。后来才意识到,移动端网络和硬件解码能力有限。建议直播场景控制在2-4Mbps,配合自适应码率。
3. 编码格式:压缩的“魔法”
原始音视频数据量巨大。一段1分钟的1080p视频,不压缩的话可能几个GB。编码格式就是用来压缩的算法。
视频编码:
- H.264 (AVC):目前兼容性最好的编码。几乎所有设备都支持。我建议你把它作为默认选项。
- H.265 (HEVC):比H.264压缩率提升约50%。但部分老旧设备不支持硬解。
- VP9 / AV1:开源编码。YouTube在用。但编码速度慢,移动端硬解支持有限。
音频编码:
- AAC:目前最通用的音频编码。Android、iOS、Web都支持。比MP3效率高。
- MP3:老牌编码。兼容性极好,但效率不如AAC。
- Opus:开源、低延迟、高质量。适合VoIP和实时通信。
我的建议: 做Android音视频App,视频首选H.264,音频首选AAC。这两个组合在兼容性和压缩率之间取得了最好的平衡。除非你有特殊需求(比如4K、HDR),否则别轻易尝试H.265——你想想看,用户手机不支持硬解,你就要软解,那功耗和发热……
4. 封装格式:音视频的“集装箱”
封装格式,也叫容器。它把视频流、音频流、字幕、元数据(比如封面、章节信息)打包在一起。
常见的封装格式:
- MP4:最通用的格式。几乎所有平台都支持。我90%的项目都用它。
- MKV:开源、功能强大。支持多音轨、多字幕、章节。适合本地收藏。
- AVI:老古董。不支持B帧,索引容易坏。除非维护老项目,否则别用。
- TS / M3U8:流媒体直播常用。支持切片和分段。
小技巧: 在Android上,MediaCodec解码器对MP4的支持最好。如果你用MKV,可能会遇到某些设备无法硬解的问题。所以,发布到应用市场的视频,一律封装成MP4。
5. 音视频同步基础:别让嘴型和声音“打架”
音视频同步,简称“A/V sync”。说白了,就是让画面和声音在时间上对齐。
为什么会不同步?因为视频解码和音频解码的速度不一样。音频解码快,视频解码慢,或者反过来。时间一长,偏差就累积起来了。
核心机制:时间戳(PTS / DTS)
- PTS (Presentation Time Stamp):显示时间戳。告诉播放器这个帧应该在什么时候显示。
- DTS (Decode Time Stamp):解码时间戳。告诉解码器什么时候开始解码这个帧。
对于视频,B帧的存在会导致PTS和DTS不一致。音频一般只有PTS。
同步策略:
- 以音频为基准:音频时钟更稳定。视频跟着音频走。这是最常用的方法。
- 以视频为基准:视频时钟更稳定。音频跟着视频走。较少用。
- 外部时钟:用一个独立的时钟源。适合直播场景。
我曾经踩过的坑: 在做一个播放器时,我直接用系统时间戳来同步,结果发现音频和视频的时钟漂移不一样。播放10分钟后,口型差了半秒。后来改用音频驱动的时钟作为主时钟,问题才解决。记住:永远不要依赖系统时间来做音视频同步,要用媒体流自带的时间戳。
好了,这一章的基础概念就讲到这里。这些概念会贯穿整个课程。后面我们写代码、调参数的时候,我会反复提到它们。你先把这些“砖块”认清楚,后面盖楼才稳当。
一句话总结: 采样率决定声音精细度,比特率决定数据量大小,编码格式决定压缩方式,封装格式决定打包方式,时间戳决定同步精度。把这五样东西刻在脑子里,你就算入门了。