上一篇讲了一幅画面怎样由预测和残差还原。这篇看编码后的数据:它采用什么规则,怎样组织,又能放到哪里。
设备界面可能同时写着“H.265、主码流、RTSP、国标”。这些设置可以同时生效,因为它们负责不同的事情。
第一次读这篇,不必把所有缩写一次记完。先读下面三部分即可:
- “先把常见名称放回各自的位置”:确定每个名称属于哪一层;
- “H.264 和 H.265 差在哪里”:知道它们是两套不同的压缩与解码规则;
- “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 / AVC | H.265 / HEVC |
|---|---|---|
| 画面分块 | 以 16×16 宏块为基础,还可以细分用于预测 | 用更灵活的树状分块,CTU 最大可为 64×64 |
| 预测与压缩工具 | 较早一代的预测、变换和编码工具 | 改进分块、预测、变换等,更适合利用大面积相似区域 |
| 同等主观质量下的数据量 | 作为广泛使用的比较基线 | 通常有机会更小;收益随场景、编码器和参数改变 |
| 运算与设备支持 | 常见软硬件支持成熟 | 编解码负担与支持情况要看设备和配置 |
| 解码配置 | 常见 SPS、PPS | 常见 VPS、SPS、PPS |
| RTP 分包规范 | RFC 6184 | RFC 7798 |
“H.265 一定省一半”不能当成配置承诺。要对同一素材、相近画质、同样分辨率和帧率做比较,并记录编码耗时。相同 CRF 数字跨编码器也不等于相同画质。
H.265 的压缩收益不能直接推出“直播延迟更低”。如果设备解码跟不上,或者使用更长的预分析与参考等待,整体延迟可能增加。反过来,有硬件支持、参数合适时,H.265 也可以用于低延迟视频。
能解 H.265,还要看哪些条件
编码标准名称只是第一步。Profile 描述一组编码工具和约束,Level 对尺寸、速率等能力设定上限,还要看位深和色度采样。
比如设备声明支持 HEVC Main,并不能据此认定它也支持所有 Main 10、4:2:2 或超高分辨率视频。浏览器还受操作系统、硬件、容器和播放接口影响;本机 FFplay 能播放,也不能替浏览器完成兼容性验证。
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:
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”两个字确定是哪一种。判断设备兼容性时记录完整标准号、版本、实际编码和封装方式。
资料来源
- ITU-T H.264、ITU-T H.265、RFC 7798 §1.1:编码工具与结构差异。
- FFmpeg Bitstream Filters、像素格式定义。
- 海康威视 H.265+ 技术说明:厂商功能示例,不用于推断其他厂商实现。
- 国家标准全文公开系统:检索 GB/T 28181:核对标准名称、版本和正文。本文只介绍常见媒体链路,不替代具体版本的对接规范。
评论