上一篇讲了一幅画面怎样由预测和残差还原。这篇看编码后的数据:它采用什么规则,怎样组织,又能放到哪里。

设备界面可能同时写着“H.265、主码流、RTSP、国标”。这些设置可以同时生效,因为它们负责不同的事情。

第一次读这篇,不必把所有缩写一次记完。先读下面三部分即可:

  1. “先把常见名称放回各自的位置”:确定每个名称属于哪一层;
  2. “H.264 和 H.265 差在哪里”:知道它们是两套不同的压缩与解码规则;
  3. “MP4 与 .h264 文件里分别有什么”:分清容器和裸码流。

NAL、SPS/PPS/VPS、Annex B 是打开码流内部以后才会用到的名称。遇到设备对接、裸码流或解码错误时再读,不影响先理解 H.264、H.265 和 MP4。

先把常见名称放回各自的位置

层面解决的问题常见名称
像素格式解码后像素按什么精度和布局存放yuv420p、NV12、10-bit
编码标准(Codec)画面怎样压缩、解码器怎样还原H.264/AVC、H.265/HEVC、AV1
编码器(Encoder)谁来执行这套编码规则libx264、libx265、h264_nvenc
容器(Container)怎样组织视频、音频和时间信息MP4、MKV、MPEG-TS、MPEG-PS
会话与媒体传输怎样申请、发送、接收实时媒体RTSP、RTP、WebRTC
监控联网标准设备与平台怎样注册、控制、交换媒体GB/T 28181

例如,一台摄像机把画面编码为 H.264,客户端通过 RTSP 申请观看,画面数据按 RTP 规则发送;客户端收到后还可以保存成 MP4。H.264、RTSP、RTP 和 MP4 都出现在这条流程中。

H.264 和 H.265 差在哪里

H.264 也称 AVC;H.265 也称 HEVC。它们都采用前面讲过的帧内预测、帧间预测与残差编码,但码流语法和具体工具不同,不能拿 H.264 解码器直接解 H.265。

比较项H.264 / AVCH.265 / HEVC
画面分块以 16×16 宏块为基础,还可以细分用于预测用更灵活的树状分块,CTU 最大可为 64×64
预测与压缩工具较早一代的预测、变换和编码工具改进分块、预测、变换等,更适合利用大面积相似区域
同等主观质量下的数据量作为广泛使用的比较基线通常有机会更小;收益随场景、编码器和参数改变
运算与设备支持常见软硬件支持成熟编解码负担与支持情况要看设备和配置
解码配置常见 SPS、PPS常见 VPS、SPS、PPS
RTP 分包规范RFC 6184RFC 7798

“H.265 一定省一半”不能当成配置承诺。要对同一素材、相近画质、同样分辨率和帧率做比较,并记录编码耗时。相同 CRF 数字跨编码器也不等于相同画质。

H.265 的压缩收益不能直接推出“直播延迟更低”。如果设备解码跟不上,或者使用更长的预分析与参考等待,整体延迟可能增加。反过来,有硬件支持、参数合适时,H.265 也可以用于低延迟视频。

能解 H.265,还要看哪些条件

编码标准名称只是第一步。Profile 描述一组编码工具和约束,Level 对尺寸、速率等能力设定上限,还要看位深和色度采样。

比如设备声明支持 HEVC Main,并不能据此认定它也支持所有 Main 10、4:2:2 或超高分辨率视频。浏览器还受操作系统、硬件、容器和播放接口影响;本机 FFplay 能播放,也不能替浏览器完成兼容性验证。

Terminal window
ffprobe -v error -select_streams v:0 -show_entries stream=codec_name,profile,level,width,height,pix_fmt,avg_frame_rate -of json input.mp4

这条命令读取第一条视频的实际参数。input.mp4 替换成自己的文件;某些字段可能缺失,Level 的数值还要按对应编码规范解释。

MJPEG、AV1 又是什么

MJPEG 通常把每幅画面单独编码为 JPEG,帧间没有 H.264/H.265 那样的参考依赖,常见于部分采集设备。代价通常是数据量较大,是否适合还要看链路和画质要求。

VP9、AV1 也是视频编码格式,常见于网络视频。新编码的选择受终端解码能力和编码成本约束,不能只按发布时间排序。摄像机、转发服务器和浏览器必须能组成一条实际可用的链路。

H.265+、Smart Codec、h265.h 怎么理解

H.265+ 通常是厂商在 H.265 基础上提供的场景优化名称。例如海康威视的 H.265+ 文档介绍了针对监控场景的预测、噪声抑制和码率控制优化。具体策略和兼容性以该厂商、型号和固件说明为准,它不是另一套名为“H.266”的国际编码标准。

Smart Codec 也常用作厂商功能名,不同厂商的同名选项不保证行为相同。画面静止时省下数据、有人进入时增加分配,和减少细小运动细节,可能在观感上有不同结果。需要用实际监控场景检查,不能只比较文件大小。

h265.h 不是通用编码标准名称。它可能是 C/C++ 头文件名,也可能是设备私有标签或名称转写。没有具体出处时应保留原样,不将它自动等同于 H.265+。相近的 .h265 / .hevc 则常用作裸 HEVC 码流的文件扩展名,后缀本身仍不能证明文件内容。

MP4 与 .h264 文件里分别有什么

MP4 可以装一条 H.264 视频、一条 AAC 音频,以及用于定位和同步的时间、索引信息。换成 H.265 视频后,它依然可以叫 .mp4。

裸码流文件主要保存某种编码的视频数据,通常没有 MP4 那种完整的多轨组织、索引与时间信息。播放工具有时能解析或推断部分属性,但跳转、时长和帧率不一定可靠。

flowchart TB
V[H.264 编码数据] --> MP[MP4<br/>视频轨道]
A[AAC 编码数据] --> MP
T[轨道信息与时间索引] --> MP
V --> ES[.h264 裸码流<br/>常见 Annex B 写法]

把 video.mp4 改名为 video.h264,文件内容完全没变。要改变包装方式,需要解析并重新写出数据。

NAL:编码数据怎样分成单元

前面一直说“编码数据”,现在再往里看一层。H.264/H.265 把数据组织成 NAL Unit(Network Abstraction Layer Unit),每个单元有头部和内容,头部说明这是什么类型的数据。

常见内容分两类:一类包含画面的编码块;另一类提供解码配置或补充信息。画面可以被切成多个 Slice,每个 Slice 的编码数据放在相应 NAL 中,因此一幅画面可能涉及多个 NAL。

与一幅画面有关的一组数据(示意)
├── 补充信息 NAL(不一定有)
├── Slice NAL:画面的一部分
└── Slice NAL:画面的另一部分

与一幅编码图像相关的一组 NAL 构成 Access Unit(访问单元),在这里的普通逐行视频例子中对应一幅画面。NAL 是编码组织单位,不能直接当成网络包:一个 NAL 还可能被拆成多个 RTP 包。

SPS、PPS、VPS:为什么光有画面数据还不够

解码器需要知道尺寸、编码工具和相关参数。参数集(Parameter Set)就是码流中保存这些配置的结构:

名称主要作用
SPS(Sequence Parameter Set)保存序列层面的解码参数,例如尺寸相关信息
PPS(Picture Parameter Set)保存图像解码使用的一组参数,并关联 SPS
VPS(Video Parameter Set)H.265 中的更高层配置,包括层与子层组织等

Slice 会通过编号引用配置。non-existing PPS 0 referenced 的意思是“当前数据引用了编号 0 的 PPS,但解码器没有找到它”。这既可能是参数没传到,也可能是重连后状态、数据拼接或损坏导致的引用错误。

参数集可以出现在码流内,也可能放在容器配置或会话描述里,由接收端送给解码器。它们不要求每个网络包重复一次;但从中途加入的接收端必须能获得自己需要的有效配置。

Annex B:给 NAL 标出边界

数据连续写成字节以后,读取端需要知道每个 NAL 在哪里开始、哪里结束。Annex B 使用起始码识别边界,常见 00 00 01,也会看到带前导零的 00 00 00 01。

MP4 中的 AVC/HEVC 视频样本通常用长度前缀表示 NAL 大小,解码配置另有记录。因此在 MP4 文件里搜不到这些起始码,不代表没有 H.264/H.265。

沿用上一篇的 frames-demo.mp4,提取视频并转换成 Annex B:

Terminal window
ffmpeg -n -i frames-demo.mp4 -map 0:v:0 -c:v copy -bsf:v h264_mp4toannexb frames-demo.h264

-map 0:v:0 选第一条视频,-c:v copy 保留压缩内容,-bsf:v 指定 Bitstream Filter,负责这里的码流转换。HEVC 对应 hevc_mp4toannexb,但输入必须确实是 HEVC,改选项不会把 H.264 变成 H.265。

FFmpeg 的 scale、overlay 等 Filter 处理解码后的 Frame;Bitstream Filter 处理编码数据,能与 Stream Copy 配合。两者在处理链上的位置不同。

GB 是编码吗

“GB”单独出现只表示国标这一类称呼,必须看完整编号。监控联网中常见的 GB/T 28181,规定视频监控系统之间的信息传输、交换和控制,包括设备注册、目录、会话和媒体传输等。

它和 H.264/H.265 不在同一层。常见 GB/T 28181 链路采用 SIP 处理信令,用 RTP 承载经过 MPEG-PS 封装的媒体。实际视频编码、传输方式和扩展能力,要按对接版本以及双方设备能力确定。

常见国标监控链路(示意)
SIP:注册、目录查询、邀请播放、结束会话
媒体:视频编码数据 → MPEG-PS 封装 → RTP → UDP 或 TCP

接收 PS 时,需要先重组 RTP 负载,再解析 PS,分出视频数据,最后交给相应解码器。把含 PS 头部的整段负载直接当 H.264 NAL,会把包装数据误当成画面编码。

有些“国标编码”讨论指的是 AVS、SVAC 等编码标准体系,不能用“GB”两个字确定是哪一种。判断设备兼容性时记录完整标准号、版本、实际编码和封装方式。

下一篇:RTSP 如何建立播放,网络上实际传了什么。

资料来源