YUV和RGB
YUV,RGB,包括YcbCr是色彩空间的模型,而平常所说的BMP、PNG、JPEG是文件的存储形式。而YUV是音视频(编解码)最常用的格式。
1.YUV的数据格式是如何呢?
YUV有两种分类方式,即“空间-间”和“空间-内”。“空间-间”的划分方式主要体现在Y、U、V的比例不同;“空间-内”的划分方式主要体现在Y、U、V的比例一定,存储格式不同。
RGB:即red,green,blue三色存储空间,因音视频主要用的是YUV的色彩空间,感兴趣的小伙伴可以拓展下RGB相关知识,本文不再详述。介绍下RGB和YUV的转换公式:
◆ RGB 转 YUV:
Y = 0.299R + 0.587G + 0.114B
U= -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
◆ YUV 转 RGB:
R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U
I帧、P帧和B帧
提到H.264,不得不提I帧、P帧、B帧、IDR帧、GOP。
◆ I帧(Intra-coded picture,帧内编码图像帧),表示关键帧,采用类似JPEG压缩的DCT(Discrete Cosine Transform,离散余弦变换)压缩技术,可达1/6压缩比而无明显压缩痕迹;
◆ P帧(Predictive-coded picture,前向预测编码图像帧),表示的是跟之前的一个关键帧或P帧的差别,P帧是参考帧,它可能造成解码错误的扩散;
◆ B帧(Bidirectionally predicted picture,双向预测编码图像帧),本帧与前后帧(I或P帧)的差别,B帧压缩率高,但解码耗费CPU;
◆ IDR帧(Instantaneous Decoding Refresh,即时解码刷新):首个I帧,是立刻刷新,使错误不致传播,IDR导致DPB(DecodedPictureBuffer参考帧列表——这是关键所在)清空;在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容;IDR具有随机访问的能力,播放器可以从一个IDR帧播放。
◆ GOP(Group Of Picture,图像序列):两个I帧之间是一个图像序列,一个GOP包含一个I帧
7.解码时间戳和显示时间戳
当然,H.264中还有两个重要的概念:DTS和PTS
◆ DTS(Decoding Time Stamp,解码时间戳解):读入内存中的比特流在什么时候开始送入解码器中进行解码
◆ PTS(Presentation Time Stamp,显示时间戳):解码后的视频帧什么时候被显示出来
什么是H.264
H.264是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。
2.H.264的数据格式是怎样的?
H.264由视频编码层(VCL)和网络适配层(NAL)组成。
◆ VCL:H264编码/压缩的核心,主要负责将视频数据编码/压缩,再切分。
◆ NALU = NALU header + NALU payload
3.VCL是如何管理H264视频数据?
◆ 压缩:预测(帧内预测和帧间预测)-> DCT变化和量化 -> 比特流编码;
◆ 切分数据,主要为了第三步。”切片(slice)”、“宏块(macroblock)”是在VCL中的概念,一方面提高编码效率和降低误码率、另一方面提高网络传输的灵活性。
◆ 包装成『NAL』。
◆ 『VCL』最后会被包装成『NAL』
PCM
一个是采集到的原始音频数据(比如PCM)和压缩后的音频数据(比如AAC)
1.什么是PCM?
PCM(Pulse Code Modulation,脉冲编码调制)音频数据是未经压缩的音频采样数据裸流,它是由模拟信号经过采样、量化、编码转换成的标准数字音频数据。
2.如何理解PCM?
PCM是一种用数字表示采样模拟信号方法。主要包括采样,量化,编码三个主要过程
采样率:每秒钟采样的样本数。比如我们常说的44.1kHz,即每秒钟采样44100次。
◆ 量化:将采样信号数据四舍五入到一个可用整数表示的过程。(位深)
3.描述PCM数据的6个参数:
◆ Sample Rate : 采样频率。8kHz(电话)、44.1kHz(CD)、48kHz(DVD)。
◆ Sample Size : 量化位数。常见值为8-bit、16-bit。
◆ Number of Channels : 通道个数。常见的音频有立体声(stereo)和单声道(mono)两种类型,立体声包含左声道和右声道。另外还有环绕立体声等其它不太常用的类型。
◆ Sign : 表示样本数据是否是有符号位,比如用一字节表示的样本数据,有符号的话表示范围为-128 ~ 127,无符号是0 ~ 255。
◆ Byte Ordering : 字节序。字节序是little-endian还是big-endian。通常均为little-endian。
◆ Integer Or Floating Point : 整形或浮点型。大多数格式的PCM样本数据使用整形表示,而在一些对精度要求高的应用方面,使用浮点类型表示PCM样本数据
AAC
1.什么是AAC?
AAC(Advanced Audio Coding,高级音频编码)是一种声音数据的文件压缩格式。AAC分为ADIF和ADTS两种文件格式。
2.什么是ADIF和ADTS?
◆ ADIF:Audio Data Interchange Format 音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中。
◆ ADTS:Audio Data Transport Stream 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。
字幕篇(SSA & ASS)
什么是SSA?
◆ SSA(SubStation Alpha),是由CS Low(亦称Kotus)创建,比传统字幕格式(如SRT)功能更加先进的字幕文件格式。
◆ 该格式字幕的外挂文件以*.ssa作为后缀。
2.什么是ASS?
◆ ASS(Advanced SubStation Alpha),是一种比SSA更为高级的字幕格式, 其实质版本是SSA v4.00+,它是基于SSA 4.00+编码构建的。
◆ ASS的主要变化就是在SSA编写风格的基础上增添更多的特效和指令。
◆ 该格式字幕的外挂文件以*.ass作为后缀。
3.SSA/ASS的基本结构
SSA/ASS字幕是一种类ini风格纯文本文件;包含五个section:[Script Info]、[v4+ Styles]、[Events]、[Fonts]、[Graphics]。
◆ [Script Info]:包含了脚本的头部和总体信息。[Script Info] 必须是 v4 版本脚本的第一行。
◆ [v4 Styles]:包含了所有样式的定义。每一个被脚本使用的样式都应该在这里定义。ASS 使用 [v4+ Styles]。
◆ [Events]:包含了所有脚本的事件,有字幕、注释、图片、声音、影像和命令。基本上,所有在屏幕上看到的内容都在这一部分。
◆ [Fonts]:包含了脚本中内嵌字体的信息。
◆ [Graphics]:包含了脚本中内嵌图片的信息。
视频封装格式篇(FLV)
FLV的封装格式
FLV(Flash Video),Adobe公司设计开发的一种流行的流媒体格式,由于其视频文件体积轻巧、封装简单等特点,使其很适合在互联网上进行应用。除了播放视频,在直播时也可以使用。采用FLV格式封装的文件后缀为.flv,格式如下(FLV = FLV Header + Body):
FLV Header
Header 部分记录了FLV的类型、版本、流信息、Header 长度等。一般整个Header占用9个字节,大于9个字节则表示头部信息在这基础之上还存在扩展数据。
FLV Body
Body 是由一个个Tag组成的,每个Tag下面有一块4个字节的空间,用来记录这个Tag 的长度。这个后置的PreviousTagSize用于逆向读取处理,表示的是前面的Tag的大小
FLV Tag
每个Tag 也是由两部分组成的:Tag Header 和 Tag Data。Tag Header 存放了当前Tag的类型,数据长度、时间戳、时间戳扩展、StreamsID等信息,然后再接着数据区Tag Data。
.Tag Data
Tag Data分成 Audio,Video,Script 三种。
5.1 Audio Tag Data
音频的Tag Data又分为 AudioTagHeader 和 Data 数据区
Video Tag Data
◆ Video Tag 由一个字节的VideoTagHeader 和 Video数据区部分组成
TS
.什么是TS?
TS(Transport Stream,传输流),一种常见的视频封装格式,是基于MPEG-2的封装格式(所以也叫MPEG-TS),后缀为.ts。
2.TS的分层结构
TS文件分为三层,如下所示(可以倒序看更好理解):
◆ TS层(Transport Stream):在PES层基础上加入了数据流识别信息和传输信息。
◆ PES层(Packet Elemental Stream):在ES层基础上加入时间戳(PTS/DTS)等信息。
◆ ES层(Elementary Stream):压缩编码后的音视频数据。
TS层
◆ ts包大小固定为188字节,ts层分为三个部分:ts header、adaptation field、payload。
◆ ts header固定4个字节;
◆ adaptation field可能存在也可能不存在,主要作用是给不足188字节的数据做填充。
◆ payload是 PES 数据,或者PAT,PMT等。
◆ ts Header + adaptation field
ES 层
◆ ES(Elementary Stream,基本码流),就是音视频编码数据流,比如视频H.264,音频AAC。
◆ 一个 ES 流中只包含一种类型的数据(视频,或音频,或字幕)。
6.easyice下载链接:
easyice:https://www.easyice.cn/archives/85
MP4
MP4(MPEG-4)
◆ MP4是一套用于音频、视频信息的压缩编码标准,由国际标准化组织(ISO)和国际电工委员会(IEC)下属的“动态图像专家组”(Moving Picture Experts Group,即MPEG)制定,第一版在1998年10月通过,第二版在1999年12月通过。MPEG-4格式的主要用途在于网上流、光盘、语音发送(视频电话),以及电视广播。
◆ MP4由许多box组成,每个box包含不同的信息,这些box以树形结构的方式组成,box 当中可以包含 box 如下所示:
box 由 header 和 body 组成,header 指明 box 的 size 和 type。size 是包含 box header 的整个 box 的大小。
◆ box type,通常是4个ASCII码的字符如“ftyp”、“moov”等,这些 box type都是已经预定义好的,表示固定的含义。如果是“uuid”,表示该box为用户自定义扩展类型,如果 box type 是未定义的,应该将其忽略。
◆ 如果 header 中的 size 为1,则表示 box 长度需要更多的bits位来描述,在后面会有一个 8自己 位的 largesize 用来描述 box 的长度。如果 size 为0,表示该 box 为文件的最后一个box,文件结尾(同样只存在于“mdat”类型的box中)。
◆ box 分为两种,Box 和 Fullbox。FullBox 是 Box 的扩展,Header 中增加了version 和 flags字段。
MP4分析工具:
◆ mp4box.js
◆ bento4:http://www.bento4.com
◆ mp4info:https://www.greenxf.com/soft/179781.html
◆qtauomviewer:https://api.256file.com/download/378144_qtatomviewer.exe
音视频核心参数
理解音视频,首先要掌握其核心参数,它们直接决定了媒体的体积、质量和体验。
| 参数类别 | 关键参数 | 简要说明 |
|---|---|---|
| 视频参数 | 分辨率 | 图像尺寸(如1920x1080),像素越多通常越清晰。 |
| 帧率 | 每秒显示的帧数,单位fps。越高视频越流畅。 | |
| 码率 | 每秒传输的数据量,单位bps。直接影响文件大小和清晰度。 | |
| 编码格式 | 如H.264, H.265,用于高效压缩数据。 | |
| 色彩空间 | 如YUV,通过分离亮度和色度来优化存储。 | |
| 音频参数 | 采样率 | 每秒采集声音信号的次数,单位Hz。越高音质越保真。 |
| 位深度 | 每个采样点的精度,单位bit。越高记录的声音细节越丰富。 | |
| 声道数 | 如单声道、立体声,表示独立的声音通道数量。 | |
| 音频码率 | 计算公式为:采样率 × 位深度 × 声道数。 | |
| 编码格式 | 如AAC, MP3,用于音频数据压缩。 | |
| 封装格式 | MP4, MKV, FLV等 | 容器格式,将编码后的音视频流、字幕等打包在一个文件中。 |
b站为例:
视频码率最高6000kbps(H264/AVC编码)
视频峰值码率不超过24000kbps
音频码率最高320kbps(AAC编码 )
分辨率最大支持1920x1080
关键帧平均至少10秒一个
色彩空间yuv420
位深8bit
声道数≤2
采样率=44100
逐行扫描
不满足条件的视频会被二次压缩
🔧 前后端技术栈选型
构建一个音视频应用,尤其是实时互动类应用,需要前后端技术的协同工作。
| 模块 | 可选技术/框架 | 说明 |
|---|---|---|
| 前端/客户端 | 跨平台开发: React Native, Flutter 。 Web端: React.js, Vue.js + WebRTC (核心,用于实时音视频采集和传输) 。 | 负责音视频的采集、预处理(如美颜、滤镜)、编码、推流,以及接收远端流进行解码和渲染/播放。 |
| 后端/服务端 | 业务逻辑: Node.js (高并发实时应用), Go (高性能), Java/Spring Boot 。 信令服务: WebSocket (如Socket.IO) ,用于协商连接、控制通话。 | 负责信令传输(建立连接)、流媒体服务(转发、录制、混流)、业务逻辑(房间管理)和数据存储。 |
| 媒体服务器 | SRS, Mediasoup (高性能SFU), Janus Gateway 。 | 流媒体系统的核心,处理音视频流的接收、转发、录制等。 |
| 音视频处理 | FFmpeg | 几乎是行业标准的音视频处理工具,用于转码、剪辑、格式转换等。 |
| 第三方服务 | 声网Agora, 腾讯云TRTC, ZEGO即构 | 提供封装好的SDK,可快速集成高质量音视频功能,节省自研成本。 |
🧪 质量评估与测试关注点
开发完成后,需要对音视频质量进行专项测试,以确保用户体验。
关键质量指标
- 流畅度:主要由帧率和卡顿率衡量。帧率越高越流畅。卡顿指画面停滞,通常由网络抖动或解码性能不足引起
- 清晰度:受分辨率和码率影响。在分辨率固定的情况下,码率越高,通常清晰度越好
- 延迟:数据从源到目的地所需的时间。对于实时音视频互动,端到端延迟最好控制在400毫秒以下
- 音画同步:音频和视频的时间一致性。一般通过为音视频帧添加时间戳 来实现同步
- 首屏耗时/秒开:从点击播放到看到第一帧画面的时间,是影响用户体验的关键指标,理想情况是实现“秒开”
- 稳定性:系统在长时间运行或弱网环境下,抵抗花屏、黑屏、自动中断等异常的能力
测试方法
- 主观测试:人眼观看、人耳聆听,直接评估音视频质量是否可接受。这是最直接的方法
- 客观测试:
- 延迟测试:一个经典方法是让推流端拍摄一个在线秒表,播放端同时观看该视频,计算两个时间显示的差值,即为端到端延迟
- 卡顿检测:通过工具记录视频播放过程中的帧渲染间隔。一般认为渲染间隔大于200毫秒(甚至有标准定义为1秒)即可感知为卡顿
- 性能监控:利用开发工具或专业性能测试工具,监控应用在运行时的CPU、内存、网络带宽占用情况
- 网络模拟测试:在弱网络(如高丢包、高延迟、低带宽)环境下测试应用的适应能力和表现
录播&点播&直播
录播:录播更侧重于“录”,比如录播系统,主要集成了音视频的采集、后期剪辑、工具软件的系统。通俗的讲录播就是生产音视频。
点播:点播从字面意义上讲是播放选择的视频,比如观看爱奇艺、腾讯等视频网站的电影和综艺,可以随意拖动视频进度,这些音视频共性特点是提前录制好的。通俗的讲点播就是播放录制好的视频,点播是消费音视频。
直播:直播相对好理解,虎牙、斗鱼等直播平台上的游戏、才艺直播,这些音视频共性言特点是实时的,观看者不能拖动音视频进度。通俗的讲直播就是播放实时直播视频,播既生产又消费音视频。
音视频协议
播放的原理主要分为:
解协议->解封装->解码->音视频同步->播放。
理解音视频中的“解协议”是掌握流媒体技术的关键一步。
| 协议类别 | 协议名称 | 主要特点与用途 |
|---|---|---|
| 专注于实时传输 | RTP/RTCP | RTP 在 UDP 上传输音视频数据,注重实时性,但不保证可靠性;RTCP 则负责监控网络质量(如丢包率、抖动)。 |
| RTSP | 用作网络摄像头的“遥控器”,通过 PLAY, PAUSE等命令控制媒体流的播放,但数据通常通过 RTP 传输 。 |
|
| RTMP | 基于 TCP,连接稳定,最初用于 Flash,现在主要用于直播的推流阶段 。 | |
| SRT | 基于 UDP 但增加了重传等机制,兼顾低延迟和高可靠性,适合在复杂公网中传输高质量视频 。 | |
| WebRTC | 支持网页浏览器点对点实时音视频通信,延迟极低 。 | |
| 适合大规模分发 | HLS | 将流切分成小 TS 文件,通过 HTTP 下载,兼容性好支持自适应码率,但延迟较高 。 |
| 用于会话控制 | SIP | 用于创建、修改和终止多媒体会话(如 VoIP 电话、视频会议),负责“邀请”和“应答”,不直接传数据 。 |
| 用于安防设备互联 | ONVIF | 解决不同品牌网络安防设备(如摄像头、录像机)之间的互操作性问题 。 |
流媒体数据->解协议(RTMP,HLS,HTTP-FLV)->封装格式数据(AVI,FLV,TS,mp4,)->解封装->音频压缩数据(ACC,mp3)-音频解码-音频原始数据(PCM):视频压缩数据(H.264,H.265,vp8,vp9)-视频解码-视频源视数据(YUV,RGB)->音视频同步->播放(SDL)。
解封装->解码->编码->封装。逻辑如下:
◆ 解封装:将音视频文件的封装格式去掉,获取视频流(H.264)和音频流(AAC)
◆ 解码:将视频流解码成原始图像数据(YUV),将音频流解码成原始音频数据(PCM)
◆ 编码:将原始图像(YUV)进行编码(MPG2),将音频流进行编码(MP3)
◆ 封装:将视频流和音频流封装成视频文件
音视频库:FFmpeg,WebRTC
FFmpeg地址
FFmpeg源码地址:https://github.com/FFmpeg/FFmpeg
FFmpeg可执行文件地址:https://ffmpeg.org/download.html
- 追求最低延迟的实时互动(如视频会议、连麦):WebRTC 是首选
- 需要稳定可靠的直播推流:RTMP 仍然非常常用
- 面对不稳定的公网传输环境:SRT 能提供很好的可靠性和安全性
- 需要广泛的兼容性和自适应码率(如点播和大部分直播):HLS 是稳妥的选择
- 控制网络摄像头或构建安防系统:需要支持 RTSP 和 ONVIF 协议
如果是本地播放,没有解协议这一步骤