工具库类软件
ffmpeg
FFMPEG是特别强大的专门用于处理音视频的开源库。 既可以使用它的API对音视频进行处理,也可以使用它提供的工具,如 ffmpeg, ffplay, ffprobe,来编辑音视频文件。
常用指令
| 指令 | 作用 |
|---|
| 视频信息相关 | |
| ffmpeg - i (material) | 查看视频信息 |
| 分离视频音频流 | |
| ffmpeg -i input_file -vcodec compy -an output_file_video | 分离视频流 |
| ffmpeg -i input_file -acodec copy -vn output_file_audio | 分离音频流 |
| ffmpeg -i input.mp4 -an output.mp4 | 去掉视频中的音频 |
| ffmpeg -i test.avi -vcodec copy -an output.avi | 去掉视频中的音频 |
| 视频转码相关 | |
| ffmpeg -i input.mp4 -vcodec h264 output.mp4 | 转为avc |
| ... | ... |
基础内容
基本概念
| 名词 | 解释 |
|---|
| 编码 | 以一个分辨率为19201080像素且帧率为30f/s的视频为例。每幅图片像素=19201080= 2 073 600像素,每个像素24b(假设采取RGB24),每幅图片为2 073 600 24 b=49 766 400b。8b(位)=1Byte(字节),每幅图片大小49766400/8=6.22MB(约等),即一副19201080图片的原始大小为6.22MB。每秒音视频大小=每幅图片大小帧率=6.22MB30,即每秒视频的大小为186.6MB,每分钟大约是11GB,一部90分钟的电影,约为990GB。这样存储容量太大了,所以要压缩编码。 |
| 解码 | 将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。 |
| 容器 | 把 MP4、 FLV、MOV等文件格式称之为容器。也就是在这些常用格式文件中,可以存放多路音视频文件。以 MP4 为例,就可以存放一路视频流,多路音频流,多路字幕流。 |
| 参数 | 解释 | 使用场景 |
|---|
| 采样率 | 在一段时间内对信号进行采样的次数,用于将连续的模拟信号转换为离散的数字信号。 | 在音频领域中,采样率通常以赫兹(Hz)表示,表示每秒采集的样本数。常见的音频采样率有44.1 kHz(CD音质)、48 kHz(DVD音质)等。 |
| 图像分辨率 | 指图像中像素的数量,类似于视频分辨率。它表示图像的清晰度和细节水平。 | 常见的图像分辨率有800x600、1920x1080、3000x2000等。与视频不同,图像通常是静态的,不涉及时间和帧率。 |
| 视频分辨率 | 指视频图像中像素的数量,通常以水平像素数乘以垂直像素数的形式表示。 | 720p(1280x720像素)、1080p(1920x1080像素,全高清)、4K(3840x2160像素)等 |
| 画面更新率fps | 画面更新率指的是每秒播放的图像帧数,用于表示视频的流畅度。它以帧每秒(fps)为单位进行测量。 | 常见的视频帧率有24 fps(电影标准)、30 fps(电视标准)和60 fps(高刷新率)。较高的帧率可以提供更平滑的运动效果,但也会增加视频文件大小和播放设备的要求。 |
| 名称 | 具体 | 解释 |
|---|
| 图像基础知识 | 像素? | 照片中的每一个小点,像素是图像显示的基本单位 |
| 分辨率? | 长度为x个像素点,宽度为y个像素点,则该图片的分辨率为x*y |
| PPI? | Pixels Per Inch,显示器上每英寸面积能放下多少个像素点 |
| 如何表示颜色? | 使用RGB值的组合表示,总共可以表达256 *256 *256 |
| YUV | 另外一种颜色数字化表示方式,Y-亮度,UV色度 |
| 视频编码基础知识 | 视频和图像的关系 | 视频是大量的图片连续起来 |
| 衡量视频? | 帧率(Frame Rate),FPS,Frame per second |
| 视频编码 | 按指定方法,将视频从一种格式转换为另一种格式(压缩视频,让体积更小,利于出传输和存储) |
| 基本原理 | 编码算法,寻找规律,构建模型 |
| 编码技术实现的方法 | 由不同的帧连续播放形成的(I帧,B帧,P帧) |
| I帧 | 自带全部信息的独立帧,最完整的画面,无需参考其他图像便可独立进行解码,视频序列中的第一个帧始终都是I帧 |
| P帧 | 帧间预测编码帧,需要参考前面的I帧/或p帧的不同部分,才能进行编码。P帧对前面的P和I参考帧有依赖性。但是P帧压缩率较高,占用空间较小 |
| B帧 | 双向预测编码帧,以前帧,后帧作为参考帧。压缩率最高可以达到200:1,依赖后面的帧,所以不适合实时传输(视频会议) |
| 编解码效果 | 信噪比/峰值信噪比 |
常见的编码方式与封装格式
主要作用是将像素数据(RGB,YUV等)压缩为视频码流,从而降低视频的数据量。
视频编码技术在整个音视频技术中是最复杂的技术。
视频编码
| 名称 | 推出机构 | 时间 | 特点 | 使用场景 |
|---|
| VVC/H.266 | 由国际电信联盟(ITU-T)和国际标准化组织(ISO/IEC)联合开发的一种先进的视频编码标准,旨在提供比以前的标准更高的压缩效率,以减少视频数据的传输和存储需求。 | 2021年9月 | 1.H.266在保持相同视频质量的情况下,比H.265可以减少约50%的比特率。2.更好的画面细节、更高的动态范围支持等 | |
| HEVC(H.265) | MPEG/ITU-T | 2013 | 1.H.265在保持相同视频质量的情况下,比H.264可以减少约50%的比特率。 | |
| AVC/H.264 | 由ISO/IEC与ITU-T组成的联合视频组(JVT)制定的新一代视频压缩编码标准。 | 2003 | 1.良好的压缩性能,可以提供较高的压缩率,减少传输和存储所需的数据量;2.编码和解码复杂度相对较低 | 互联网视频传输、视频会议、数字电视等。 |
| MPEG4 | MPEG | 2001 | MPEG-4标准提供了高效的视频压缩方法,能够在较低的比特率下提供良好的视频质量 | |
| MPEG2 | MPEG | 1994 | | 经典的视频编码标准,广泛应用于数字电视、DVD、蓝光光盘等媒体领域。它提供了良好的视频压缩性能和兼容性,适用于广播和存储等应用。 |
| VP8 | Google | 2013 | |
| VP9 | Google | 2013 | | 适用于在线视频传输和流媒体应用 |
| VC-1 | Microsoft Inc | 2006 | 微软开发,旨在提供高质量的视频压缩性能。 | 互联网视频、数字电视、蓝光光盘等。 |
音频编码
将音频采样数据(PCM等)压缩成为音频码流,从而降低音频的数据量。
| 种类 | 压缩比 | 支持声道数 | 优点 | 缺点 | 推出 |
|---|
| MP3 | 10~12 | 2个声道 | 压缩比高,适合用于互联网上的传播 | 在 128KBitrate 及以下时,会出现明显的高频丢失 | 1993 |
| WMA | 10~12 | | 当 Bitrate 小于 128K 时, WMA 最为出色且编码后得到的音频文件很小。 | 当 Bitrate 大于 128K 时, WMA 音质损失过大。 | 1999/Microsoft |
| OGG | | 支持多声道 | | OGG Vobis在压缩技术上比MP3好,而且它的多声道 | |
| AAC | 18~20 | 支持多声道 | 支持多种音频声道组合,提供优质的音质 | 与时下流行的APE、FLAC等无损格式相比音质存在“本质上”的差距。 | 1997 |
| APE | 无损压缩 | 用做网络音频文件传输,因为被压缩后的APE文件容量要比WAV源文件小一半多,可以节约传输所用的时间。 | | |
| FLAC | 2 | | | |
| WAV | 无损压缩 | 单声道和立体声 | WAVE文件作为最经典的Windows多媒体音频格式 | |
封装格式
| 名称 | 支持的视频编码 | 支持的音频编码 | 流媒体 |
|---|
| AVI | all | all | no |
| MP4 | MPEG-2,MPEG-4,H.264,H.263 | ACC,MPEG-1,Layers I,II,III,AC-3等 | yes |
| TS | MPEG-1,MPEG-2,MPEG-4,H.264 | MPEG-1,Layers I,II,III,ACC | yes |
| FLV | Sorenson,VP6,H.264 | MP3,ADPCM,Linear,PCM,ACC | yes |
| MKV | all | all | yes |
| RMVB | RealVideo8,9,10 | ACC,Cook,Codec,RealAudioLossless | yes |
各厂家编码协议
| MPEG | |
|---|
| MPEG-1 | mp3 |
| MPEG-2 | |
| MPEG-4 | |
| H.26x系列 | |
|---|
| H.261 | |
| H.262 | |
| H.263 | |
| H.264/AVC | MPEG-4 AVC |
| H.265/HEVC | 体积是264的一半,占用带宽也是比264少很多,浏览器目前不支持直接播放,需要用webassembly等技术 |
| H.266 | |
| Real 系列 | |
|---|
| RealVideo | 格式为.rm/.rvm/.rmvb |
| RealAudio | .ra/.ram |
| QuickTime系列 | |
|---|
| Audio Apple MPEG-4 ACC | |
| Ogg系列 | |
|---|
| Ogg Theora | |
| Ogg Vorbis | |
| Ogg Speex | |
| Ogg FLAC | |
| On2 VPX系列 | |
|---|
| VP3 | |
| VP4 | |
| VP5 | |
| VP6 | |
| VP7 | |
| VP8 | 2009年该公司被Google收购 |
| VP9 | |
| FlashVideo 系列 | |
|---|
| 在flv文件中支持的媒体类型 | On2 VP6 Sornesn Spark,H.264 |
| MP3,ACC,G.711,ADPCM,Linear |
| Flash传递的几种方式 | RTMP |
压缩
视频压缩算法是通过去除时间、空间的冗余来实现的。在一段时间内,相邻的图像的像素、亮度与色温的差别很小,我们没比要对每一个图像进行完成的编码,而是可以选取这段时间的第一张图(也就是第一帧)作为完整的编码,而后面一段时间的图像只需要记录与第一张图(第一帧)在像素、亮度、色温等方面的差别数据即可。
| 压缩方法 | 解释 | 用例 | 压缩算法 |
|---|
| 无损压缩 | 在压缩视频数据时不损失任何图像质量 | 医学影像、无损存档等 | 无损JPEG、PNG |
| 有损压缩 | 在压缩视频数据时会丢失一定的图像信息以降低文件大小 | 视频存储、传输和流媒体等领域广泛应用 | 1.基于变换编码的压缩方法,如基于离散余弦变换(DCT)的JPEG、MPEG-1、MPEG-2等。2.基于运动补偿的压缩方法,如MPEG-2、MPEG-4、H.264(AVC)、H.265(HEVC)、H.266(VVC)等。这些方法通过利用图像帧间的相似性来减少冗余信息。3.基于预测编码的压缩方法,如VP8、VP9、AV1等。这些方法通过预测当前帧的像素值来减少冗余信息。 |
| 帧内压缩 | 帧内压缩方法主要针对单个视频帧进行压缩,每个帧被视为独立的图像。 | | 1.JPEG(Joint Photographic Experts Group):主要用于静态图像的压缩,通过离散余弦变换(DCT)和量化来减少数据量。2.H.264/AVC(Advanced Video Coding):使用了帧内编码和帧间编码相结合的方式,帧内编码用于压缩单个视频帧的图像信息。3.HEVC(High Efficiency Video Coding):H.264的继任者,提供更高效的帧内压缩方法。 |
| 帧间压缩 | 帧间压缩方法通过利用视频帧之间的相关性来减少数据量,通常使用差分编码和运动估计 | | 1.运动补偿(Motion Compensation):通过估计当前帧与参考帧之间的运动矢量,以及预测误差(残差),来减少数据量。常用的方法有帧间预测(Inter-frame prediction)和运动补偿编码(Motion Compensation Coding)。2.时域压缩(Temporal Compression):通过利用连续帧之间的时间相关性来进行压缩,例如使用帧间差分编码、帧间预测等技术。 |
视频播放器
原理
视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。
| 名词 | 解释 | 列子 |
|---|
| 解协议 | 将流媒体协议的数据,解析为标准的相应的封装格式数据。视音频在网络上传播的时候,常常采用各种流媒 体协议,例如HTTP,RTMP,或是MMS等等。这些协议在传输视音频数据的同时,也会传输一些信令数据。这些信令数据包括对播放的控制(播放,暂停,停止),或者对网络状态的描述等。解协议的过程中会去除掉信令数据而只保留视音频数据。例如,采用RTMP协议传输的数据,经过解协议操作后,输出FLV格式的数据。 | http,rtmp |
| 解封装 | 将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。封装格式种类很多,例如MP4,MKV,RMVB,TS,FLV,AVI等等,它的作用就是将已经压缩编码的视频数据和音频数据按照一定的格式放到一起。例如,FLV格式的数据,经过解封装操作后,输出H.264编码的视频码流和AAC编码的音频码流。 | MP4,AVI,TS,FLV,MKV,RMVB |
| 解码 | 将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。音频的压缩编码标准包含AAC,MP3,AC-3等等,视频的压缩编码标准则包含H.264,MPEG2,VC-1等等。解码是整个系统中最重要也是最复杂的一个环节。通过解码,压缩编码的视频数据输出成为非压缩的颜色数据,例如YUV420P,RGB等等;压缩编码的音频数据输出成为非压缩的音频抽样数据,例如PCM数据。 | 音频的压缩编码标准:AAC,MP3,AC-3;视频:H.264,MPEG2,VC-1 |
| 视音频同步 | 就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。 | |

从硬件采集到播放的整个流程
graph TD
摄像机 -->预处理-A/D转换-->预处理-YUV转换 -->压缩编码 -->数据封装以及传输 -->解码 -->图像格式变换 -->播放
流媒体协议
| 名称 | 基于协议 | 本质 | 特点 |
|---|
| RTP/SRTP | TCP+UDP | RTP是一种实时传输音视频数据的协议,通常与RTSP(Real-Time Streaming Protocol)结合使用。RTP负责传输媒体数据,而RTSP用于控制流媒体会话的建立、控制和结束。 | |
| RTCP | UDP | RTCP的主要功能是提供关于RTP会话的统计和控制信息 | |
| RTSP | TCP/UDP | RTSP协议的设计目标是实现对流媒体的控制和管理,而不是传输媒体数据本身。它通常与RTP(Real-Time Transport Protocol)协议配合使用,其中RTSP负责控制会话的建立和媒体操作,而RTP负责实际的媒体数据传输。 | 1.实时传输:RTSP旨在实现实时的音视频传输,能够在客户端和服务器之间传递实时的音视频数据。2.媒体会话管理:RTSP支持对媒体会话的管理和控制,可以控制媒体的播放、暂停、停止、快进、倒退等操作。3.媒体描述和协商:RTSP可以通过SDP(Session Description Protocol)协议描述媒体的属性和参数,并通过协商过程确定客户端和服务器之间的传输方式和参数。4.控制命令:RTSP定义了一系列控制命令,如PLAY、PAUSE、SETUP、TEARDOWN等,用于控制媒体的传输和播放。5.网络传输:RTSP通常使用TCP作为传输协议,也可以使用UDP或者混合模式进行传输 6.支持多种媒体格式:RTSP可以用于传输各种音视频格式,如H.264、AAC、MP3等。 |
| RTMP/RTMPS | TCP | RTMP是一种实时消息传输协议,用于实现音视频的实时传输和流媒体的点播和直播。广泛应用于流媒体服务、视频直播和互动应用等场景。 | |
| mms | TCP/UDP | MMS是微软开发的流媒体传输协议,用于在Windows平台上实现音视频的传输和流媒体的播放。MMS使用TCP协议进行传输,支持多种音视频格式和流媒体协议。 | |
| HLS | | HLS是一种基于HTTP协议的流媒体传输协议,由苹果公司提出。它将整个媒体文件切分为小的TS(Transport Stream)分段文件,并使用M3U8索引文件进行描述和控制。HLS适用于在Web浏览器和移动设备上进行流媒体播放。 | 视频封装格式ts,文件m3u8 |
| WebRTC | RTP、RTCP、SDP、ICE、STUN、TURN | WebRTC是一种基于Web技术的实时通信协议,支持在Web浏览器之间直接进行音视频通信。它使用了一系列协议和技术,包括RTP、SRTP(Secure Real-time Transport Protocol)等 | |
| DASH | HTTP | DASH是一种基于HTTP的动态自适应流媒体传输协议,由MPEG提出。它将媒体内容切分为多个小的分段文件,并使用MPD(Media Presentation Description)文件进行描述和控制。DASH能够根据网络条件和设备能力动态调整视频质量和码率。 | |
mp4 flv文件格式
flv
FLV封装格式是由一个FLV Header文件头和一个一个的Tag组成的。Tag中包含了音频数据以及视频数据。FLV的结构如下图所示。
- 文件头(File Header):位于文件的开头,包含了文件的标识和版本信息。
- Tag 数据(Tag Data):存储了 FLV 文件的实际视频和音频数据,以及其他元数据信息。
- Tag 类型(Tag Type):表示当前 Tag 数据的类型,可以是音频、视频或其他元数据。
- Tag 长度(Tag Length):表示当前 Tag 数据的长度。
- Tag 数据(Tag Data):存储了当前 Tag 的实际数据,如音频样本、视频帧等。
- 时间戳(Timestamp):记录了当前 Tag 数据的时间戳信息,用于同步音视频数据。
- 其他元数据(Meta Data):存储了与视频相关的元数据信息,如视频尺寸、编码参数等。

mp4
MP4文件由多个box组成,每个box存储不同的信息,且box之间是树状结构,如下图所示。
MP4(MPEG-4 Part 14)是一种常见的视频文件格式,它采用了一种容器格式,可以存储多种类型的媒体数据,如视频、音频、字幕和元数据。以下是 MP4 文件的一般结构和格式:
- 文件类型和版本(File Type Box):位于文件的开头,用于识别文件类型和版本信息。
- 媒体数据(Media Data Box):存储实际的媒体数据,如视频和音频帧。
- 媒体信息(Movie Box):包含了媒体数据的相关信息,如时间轴、采样率、播放顺序等。
- 媒体头(Movie Header Box):包含了整体的媒体信息,如时长、时间刻度等。
- 视频信息(Video Box):存储视频相关的信息,如视频编码格式、分辨率等。
- 音频信息(Sound Box):存储音频相关的信息,如音频编码格式、采样率等。
- 音频和视频样本(Sample Box):存储实际的音频和视频样本数据。
- 视频样本(Visual Sample Entry):包含视频样本数据以及相关的编码参数。
- 音频样本(Audio Sample Entry):包含音频样本数据以及相关的编码参数。
- 其他附加数据(Metadata Box):存储附加的元数据信息,如标题、作者、描述等。

box类型有很多,下面是3个比较重要的顶层box:
- ftyp:File Type Box,描述文件遵从的MP4规范与版本;
- moov:Movie Box,媒体的metadata信息,有且仅有一个。
- mdat:Media Data Box,存放实际的媒体数据,一般有多个;

解析封装格式
function parseMP4(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = function (event) {
const buffer = event.target.result;
const dv = new DataView(buffer);
resolve(mp4Data);
};
reader.onerror = function (event) {
reject(event.target.error);
};
reader.readAsArrayBuffer(file);
});
}

小结
音视频学无止境