RTMP 协议与 H.265 编码
什么是 RTMP
RTMP(Real-Time Messaging Protocal), 中文名称实时消息传输协议, 最初是用来播放 Flash 视频的协议, 由 Macromedia 开发, 后来 Macromedia 被 Adobe 收购, 在2012年 Adobe 发布了 RTMP 协议规范 RTMP Specification 1.0, 自此之后再未更新, 目前在视频直播中广泛采用.
RTMP 与 FLV
准确的说, RTMP 是传输协议, 其承载的视频流封装格式为 FLV 格式, 编码多用 H.264. 实际上传输协议与视频编码无关, RTMP 协议不支持 H.265, 本质上还是因为 FLV 格式不支持 H.265.
RTMP 支持 H.265 的方案
由于 H.265 节省空间与带宽这些显而易见的好处, RTMP 必然需要支持 H.265, 但由于没有一个标准, 所以 RTMP对 H.265 的支持分为两种:
- 方案1: 通过自定义 FLV 文件头 CodecID 的方式来实现对 H.265 的支持.
国内很早就通过此方法实现了对 H.265 的支持, FLV 格式的 VideoTagHeader 中有一个 4 bit 的 CodecID 字段, 用于识别视频编码, FLV 标准中只使用了 1-7, 其中 CodecID=7 表示 H.264 编码. 国内厂商通过自定义 CodecID=12 表示 H.265 编码, 实现了 RTMP 对 H.265 编码的支持.
- 方案2: Enhanced RTMP
终于在 2023 年, 出现了一个 RTMP 支持 H.265 的标准, 即 Enhanced-RTMP, 此解决方案亦是通过修改 FLV 格式中文件头的方法实现了对 RTMP 的支持, 详细情况见规范文件.
软件支持情况
- 推流方面
国内厂商在 Enhanced-RTMP 标准之前都是采用方案1实现 RTMP 对 H265 的支持, 在有了 Enhanced-RTMP 标准之后应该也会很快跟进, 目前我使用的腾讯云对方案1和方案2均支持.
FFmpeg 从 6.1 版本开始, OBS 从 29 版本开始, 均通过 Enhanced-RTMP 标准实现了 RTMP 对 H.265 的支持.
- 拉流方面
不同于推流只需要在服务器端做兼容, 拉流需要客户端支持, 技术方案都是有惯性的, 不可能一刀切, 所以方案1应该还会存在一段时间, 然后逐渐转移到方案2.
目前腾讯云拉流得到的视频是使用方案1实现的.
ffplay 对方案1的支持
ffpaly6.1 是使用方案2实现 RTMP 对 H.265 支持的, 如果拉流得到的视频使用的是方案1, 会报 “Video code (c) not implemented”:
目前在 github 上有开源的解决方法: ffmpeg_rtmp_h265, 按照说明重新编译即可.
下面是编译好适用于 Windows 平台的 FFMpeg 二进制文件包, 如果你有需要的话可以下载使用:
提取码: dox8