音视频开发基础

FFmpeg 是市面上领先的多媒体框架,能够解码编码转码用、解复用、流式传输、过滤播放人类和机器创建的几乎任何内容。支持所有常见的音视资源,支持跨平台开发。

中文网站:https://ffmpeg.github.net.cn/about.html

英文网站:https://ffmpeg.org/download.html。截止2025年最新的ffmepg版本为7.1.1。2025年3月3日发布。

提供开发使用的库:

img

视频基础知识

视频的的本质是一张张图片在极短的时间内快速切换,形成的一种动态画面。

我们将组成视频的一张张画面称之为帧(Frame)。由此也产生了一个帧率(Frames per Second, FPS)的概念。即每秒显示的帧数。30FPS也就是 1 s内显示了30帧。帧率越高,视频显示也就越流畅。

帧的本质是图像,我们引入了分辨率概念去定义一张图片的质量高低,去描述包含像素数量。像素是数字图像里面的最小单元。在其他条件相同的情况下,分辨率越大,图片的质感越好。常见的分辨率有720p (1280x720)、1080p (1920x1080)、4K (3840x2160)等。

像素格式(色彩格式)用于定义像素的颜色信息存储方式。常见的格式有RGBA、RGB、YUV、HDR 等。

通过上面的介绍:

在24FPS帧率下,60s 的无压缩的RGBA格式的1080p视频应该占用磁盘空间为

  • 分辨率(1080p):通常指 1920×1080 像素(宽 × 高),即单帧画面的像素总数为: 1920 × 1080 = 2,073,600 像素 / 帧
  • 色彩格式(RGBA):每个像素包含 R(红)、G(绿)、B(蓝)、A(透明度)4 个通道,无压缩格式下每个通道通常占用 8 位(1 字节),因此单个像素的存储空间为: 4 通道 × 1 字节 / 通道 = 4 字节 / 像素

1920 × 1080 × 4 × 24= 199.0656 MB / 秒

200 MB / s× 60 s = 12 GB

img

比特速率(Bitrate):指每秒视频数据的传输速率,通常以kbps或Mbps表示。比特率越高,视频质量越好,但同时占用的存储和带宽资源也更多。

H.264 编解码

为了维持高分辨率的视频流畅播放,那么比特速率就得足够大。但是在实际生活中,尤其是播放高4k画质的网络视频,基本不会存在如此庞大的网络吞吐量。为了能够正常播放画面,我们不会直接传输原始视频数据,而是会对原始数据进行压缩,这种针对音视频的特殊压缩方式,我们称之为编码,反而言之,为解码。

常见的视频编码格式:

img

最通用的格式当属 H.264 .

img

一般来说,摄像头直接捕捉到的图像色彩格式都是RGB 或者Bayer 格式,常见于手机的摄像头和高分辨率摄像机。

对于这些原始数据,首先会转换成YUV格式的数据。主要原因就是H.264 标准本身是针对 YUV 色彩空间设计的,其核心压缩算法(如帧内预测、帧间运动补偿、变换量化等)均基于 YUV 的亮度(Y)和色度(U、V)分离的特性优化。

img

通过H.264 格式编码,我们会将编码帧区分为3种类型,I帧、P帧、B帧。

I 帧:帧内编码帧,帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)

I 帧的特点:

  • a. 它是一个全帧压缩编码帧,它将全帧图像信息进行JPEG压缩编码及传输
  • b. 解码时仅用I 帧的数据就可重构完整图像
  • c. I 帧描述了图像背景和运动主体的详情
  • d. I 帧不需要参考其他画面而生成
  • e. I 帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量)
  • f. I 帧不需要考虑运动矢量
  • g. I 帧所占数据的信息量比较大

P帧:前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)

P帧的特点:

  • a. P帧是 I 帧后面相隔1~2帧的编码帧
  • b. P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差)
  • c. 解码时必须将帧中的预测值与预测误差求和后才能重构完整的P帧图像
  • d. P帧属于前向预测的帧间编码。它只参考前面最靠近它的 I 帧或P帧
  • e. 由于P帧是参考帧,它可能造成解码错误的扩散
  • f. 由于是差值传送,P帧的压缩比较高

B帧:双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别,换言之,要解码B帧。不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累。

B帧的特点:

  • a. B帧是由前面的 I 或P帧和后面的P帧进行预测的
  • b. B帧传送的是它与前面的 I 或P帧和后面的P帧之间的预测误差及运动矢量
  • c. B帧是双向预测编码帧
  • d. B帧压缩比最高,因为它只反映并参考帧间运动主体的变化情况,预测比较准确
  • e. B帧不是参考帧,不会造成解码错误的扩散

软/硬解码

视频设计编码和解码的环节,目前有软编解码和硬编解码,软编解码主要依靠CPU进行,硬编解码主要依靠特定的硬件资源加速器完成这个操作,一般来说硬件编解码效率高,更具备优势。

软编解码(Software Encoding/Decoding)通过CPU进行视频编码解码的原理和应用场景

优点:通用性强,不依赖硬件

缺点:性能消耗大,对CPU压力大

硬编解码(Hardware Encoding/Decoding)依赖GPU、VPU等硬件资源的加速解码

优点:解码效率高,性能功耗比更好

缺点:硬件兼容性有限,需特定设备支持

音频基础知识

参考文档:

https://zhuanlan.zhihu.com/p/161453747

https://blog.csdn.net/qq_28258885/article/details/120197122#PCM_6

暂时无法在iChery文档外展示此内容

PCM(Pulse Code Modulation,脉冲编码调制)是音频的原始数字数据格式,它是将模拟音频信号转换为数字信号的最基础、最直接的方式,没有经过任何压缩或编码处理,因此常被称为 “原始音频数据

img

我们之所以能够记录声音,实现的原理就是我们将模拟信号转化成了数字信号。模拟信号是连续不断的,这并不利于我们去记录声音的变化,所以会去对波形进行采样。

暂时无法在iChery文档外展示此内容

采样率

每秒钟的样本数也被称之为采样率(Sample rate)。在Sampling图示案例中,采样率为每秒34次。意味着在一秒的时间内,原始信号被采样了34次(也就是蓝色垂直线段的数量)。

通常,采样率的单位用Hz表示,例如1Hz表示每秒钟对原始信号采样一次,1KHz表示每秒钟采样1000次。1MHz表示每秒钟采样1百万次。

根据场景的不同,采样率也有所不同,采样率越高,声音的还原程度越高,质量就越好,同时占用空间会变大。

振幅

振幅(Amplitude)是描述声波振动幅度大小的物理量,直接决定了声音的响度(音量),是理解声音特性的核心参数之一。核心定义:振动的 “幅度”。声波是空气分子的周期性振动(疏密变化),振幅则是振动时偏离平衡位置的最大距离。

频率:

频率是声波在单位时间内的振动次数。频率(Frequency)的单位是赫兹(Hz),1Hz 表示每秒振动 1 次。例如:

  • 440Hz 的声波(标准 A 音)意味着每秒振动 440 次;
  • 1kHz(1000Hz)的声音则是每秒振动 1000 次。

它反映的是声波振动的 “周期性重复速率”,需要通过一个完整的振动周期(从一个波峰到下一个波峰的时间)来计算,而非单个时间点的状态。

在Frequency图示案例中,频率为5 Hz。

对音频而言,频率直接决定音调:频率越高,音调越高(如女声音频频率通常在 165255Hz,男声音频在 85180Hz)。这也是为什么播放速度加快会导致音调升高 —— 振动次数被压缩到更短时间内,频率变相升高。

声道数(channel number):

当前PCM文件中包含的声道数,是单声道(mono)、双声道(stereo),此外还有5.1声道(常用于影院立体环绕声)等。

如果单声道pcm数据,使用双声道播放?反之结果?

位深度(Bit-depth):

位深度用于描述每个采样点的振幅值被量化的精度。

  • 动态范围:位深度越高,能记录的振幅范围越大(从最微弱的声音到最响亮的声音),避免 “削波”(音量过大导致的失真)或 “底噪明显”(音量过小被噪声掩盖)。
    • 16 位足以覆盖人耳能感知的动态范围(约 90dB),是 CD 音质的标准;
    • 24 位常用于专业录音 / 混音,保留更多细节(如乐器泛音、微弱的环境声)。
  • 信噪比:位深度越高,量化误差(数字信号与原始模拟信号的偏差)越小,噪声越低。例如,24 位的信噪比远高于 16 位,适合录制交响乐、人声等需要高保真的场景。

img

有损音频编码格式:

1. AAC(Advanced Audio Coding)

  • 特点:
    • 作为 MP3 的继任者,相同码率下音质优于 MP3(尤其在 128-320kbps 范围),支持多声道(最高 7.1 声道)和可变码率(VBR)。
    • 编码效率高,能在低码率(如 64kbps)下保持较好听感,适合移动端和网络传输。
  • 变种:
    • LC-AAC(Low Complexity):最常用,平衡音质和复杂度,手机、流媒体默认选择。
    • HE-AAC(High Efficiency):针对低码率优化(如 32-64kbps),适合语音 + 音乐混合场景(如播客)。
  • 应用场景:
    • 苹果生态(iPhone 录音、iTunes 音乐)、YouTube、微信语音(部分版本)、视频配乐(MP4、MKV 容器常用)。
  • 缺点:高码率(>320kbps)下音质提升有限,不如 OPUS 灵活。

2. OPUS

  • 特点:
    • 近年崛起的 “全能型” 编码,支持超宽码率范围(6kbps-510kbps),从低码率语音到高码率音乐均表现优异。
    • 延迟极低(默认 20ms 以内),适合实时通信;同时支持多声道和无损模式(需配合特定容器)。
  • 优势:
    • 低码率(如 16-64kbps)下语音清晰度远超 AAC 和 MP3,接近电话音质但体积更小。
    • 高码率(如 128-320kbps)下音乐音质接近 FLAC,细节还原优于 AAC。
  • 应用场景:
    • 实时通信(Discord、Zoom、微信语音通话)、流媒体(Spotify 部分曲库)、游戏语音、VoIP 电话。
  • 缺点:部分老设备 / 软件兼容性略差(但主流平台已全面支持)。

3. MP3(MPEG-1 Audio Layer III)

  • 特点:
    • 最经典的有损编码,普及度极高,几乎所有设备都支持。
    • 码率范围通常 64-320kbps,128kbps 为 “标准音质”,320kbps 为 “高质量”。
  • 缺点:
    • 技术老旧,低码率(<128kbps)下高频损失严重(如小提琴、镲片声音发闷),高码率下不如 AAC/OPUS 高效。
  • 应用场景:老歌库、低成本设备(如老年机)、对兼容性要求极高的场景。

4. OGG Vorbis

  • 特点:
    • 开源免费,无专利限制,相同码率下音质略优于 MP3,支持可变码率和多声道。
  • 应用场景:开源软件(如 Firefox 浏览器)、Linux 系统、部分游戏配乐(如《魔兽世界》)。
  • 缺点:普及度低于 AAC,苹果设备原生支持有限。

无损编码格式

1. FLAC(Free Lossless Audio Codec)

  • 特点:
    • 开源无损编码,压缩率约 50%-70%(比原始 WAV 小,但远大于有损格式),保留原始音频所有细节(如 CD 抓轨文件常用 FLAC)。
    • 支持元数据(歌词、封面)和多声道,兼容性好(主流播放器、手机均支持)。
  • 应用场景:音乐收藏、Hi-Fi 设备播放、专业音频编辑。

2. ALAC(Apple Lossless Audio Codec)

  • 特点:
    • 苹果自研无损格式,与 FLAC 音质相同,压缩率略低(文件稍大),但在苹果生态(iTunes、iPhone)中无缝兼容。
  • 应用场景:苹果用户的无损音乐库(如 Apple Music 无损音质选项)。

3. WAV(Waveform Audio File Format)

  • 特点:
    • 无压缩的原始 PCM 数据容器,体积巨大(1 分钟立体声 CD 音质约 10MB),但兼容性极强(所有设备可直接播放)。
  • 应用场景:音频编辑原始素材、硬件测试信号。

音视频播放流程

img

FFmepg APi 接口

img


音视频开发基础
https://tangerine-kitten-lux.netlify.app/音视频开发基础/
作者
lux
发布于
2025年7月3日
许可协议