如何在RTMP推送端和RTMP播放端支持Enhanced RTMP H.265(HEVC)

技术背景

时隔多年,在Enhancing RTMP, FLV With Additional Video Codecs And HDR Support(2023年7月31号正式发布)官方规范出来之前,如果RTMP要支持H.265,大家约定俗成的做法是扩展flv协议,CDN厂商携手给出的解决方案是给flv的videotag CodecID增加一个新类型(12)来表示h265(hevc),和h264不同的地方是要解析HEVCDecoderConfigurationRecord,从HEVCDecoderConfigurationRecord中解析出vps, sps, pps. 有了vps, sps, pps, 就可以解码。

遗憾的是,尽管CodecID可以自定义,但CodecID只有4个bits,增加H.265尚可,如果后续再新增VP8、VP9、 AV1甚至H.266就很尴尬,这种尴尬持续了数年,直到官方发布了 Enhancing RTMP新的规范。值得欣慰的是,SRS等开源组织在服务侧第一时间进行了适配兼容。

技术实现

本文以大牛直播SDK的Windows平台RTMP直播推送和RTMP直播播放模块为例,考虑到老的扩展CodecID 12的场景依然使用,我们添加了个设置接口:

RTMP推送端,对应文件为SmartPublisherSDK\nt_smart_publisher_sdk.h:

       /** disable enhanced RTMP, SDK默认是开启enhanced RTMP的* value: 1:disable, 0:enable*/NT_UINT32(NT_API *DisableEnhancedRTMP)(NT_HANDLE handle, NT_INT32 value);

RTMP播放端,对应文件为SmartPlayerSDK\smart_player_sdk.h:

		/** disable enhanced RTMP, SDK默认是开启enhanced RTMP的* value: 1:disable, 0:enable*/NT_UINT32(NT_API *DisableEnhancedRTMP)(NT_HANDLE handle, NT_INT32 value);

Enhanced RTMP针对flv原有VideoTagHeader中FrameType(4bits)做了如下调整:

| IsExHeader(1bit)FrameType(3bits) |

VideoTagHeader的第一个字节的第0位来判断是否是Enhanced RTMP格式,如果这一位是1,那就是扩展头,Enhanced-Rtmp格式。

RTMP推送端生成HEVC的FLV VideoTagHeader,对应的sample判断代码如下:

/*
* Author:daniusdk.com
*/
*p = 0x80;
if (key)*p |= (1<<4);
else*p |= (2 << 4);if (pts != dts)*p |= 1;
else*p |= 3;p++;*p++ = 'h';
*p++ = 'v';
*p++ = 'c';
*p++ = '1';//....

RTMP播放端,对应的sample判断代码如下:

/** Author:daniusdk.com */
bool is_ex_header;if (p[0]&0x80)is_ex_header = true;
elseis_ex_header = false;if (is_ex_header) {auto video_fourcc = (p[1] << 24)|(p[2] << 16)|(p[3] << 8)|p[4];if (HEVC == video_fourcc) {// hevc处理}else if (VP9 == video_fourcc) {// vp9处理}else if (AV1 == video_fourcc ) {// AV1处理}
}

启动Windows平台窗体采集,设置H.265硬编码,输入RTMP推流URL,实现Enhanced RTMP推送,播放端拉流播放,整体延迟如下:

可以看到,尽管开启了Enhanced RTMP,整体延迟还在毫秒级。

技术总结

鉴于目前RTMP扩展265这块,大多还是用的老的CodecID设置为12的模式,如果需要支持新的Enhanced RTMP,除了推送端和播放端外,RTMP服务端也需要做响应的调整,来适配这种情况,好在SRS等一线开源组织已经做了适配,我们也自己调整了nginx的代码,做了简单的测试,整体延迟满足预期,感兴趣的开发者可以单独跟我交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/735054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0103n阶行列式-行列式-线性代数

文章目录 一 n阶行列式二 三阶行列式三 特殊行列式结语 一 n阶行列式 ∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋯ ⋯ ⋯ ⋯ a n 1 a n 2 ⋯ a n n ∣ \begin{vmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\cdots&\cdots…

知名比特币质押协议项目Babylon确认参加Hack.Summit()2024区块链开发者大会

Babylon项目已确认将派遣其项目代表出席2024年在香港数码港举办的Hack.Summit()2024区块链开发者大会。作为比特币生态的领军项目&#xff0c;Babylon积极参与全球区块链领域的交流与合作&#xff0c;此次出席大会将为其提供一个展示项目进展、交流技术与创新思路的重要平台。B…

深入了解二叉搜索树:原理、实现与应用

目录 一、介绍二叉搜索树 二、二叉搜索树的基本性质 三、二叉搜索树的实现 四、总结 在计算机科学中&#xff0c;数据结构是构建算法和程序的基础。其中&#xff0c;二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;作为一种常见的数据结构&#…

Java开发从入门到精通(一):Java的进阶语法知识

Java大数据开发和安全开发 Java的方法1.1 方法是什么1.1.1 方法的定义1.1.2 方法如何执行?1.1.3 方法定义时注意点1.1.4 使用方法的好处是? 1.2 方法的多种形式1.2.1 无参数 无返回值1.2.2 有参数 无返回值 1.3 方法使用时的常见问题1.4 方法的设计案例1.4.1 计算1-n的和1.4.…

uniapp隐藏状态栏并强制横屏

uniapp隐藏状态栏并强制横屏 1.manifest.json中&#xff1a; "screenOrientation": ["landscape-primary", //可选&#xff0c;字符串类型&#xff0c;支持横屏"landscape-secondary" //可选&#xff0c;字符串类型&#xff0c;支持反向横屏]…

表单进阶(5)-文本域

默认文本框可以用自由拖动控制大小 通过设置在css中设置控制&#xff1a; resize:重新设置文本框大小 horizontal&#xff08;水平&#xff09;&#xff0c;vertical&#xff08;垂直&#xff09;&#xff0c;none&#xff08;不能控制大小&#xff09;&#xff0c;默认both&…

部署LVS+Keepalived高可用群集(抢占模式,非抢占模式,延迟模式)

目录 一、LVSKeepalived高可用群集 1、实验环境 2、 主和备keepalived的配置 2.1 yum安装ipvsadm和keepalived工具 2.2 添加ip_vs模块并开启ipvsadm 2.3 修改keepalived的配置文件 2.4 调整proc响应参数&#xff0c;关闭linux内核的重定向参数响应 2.5 将主服务器的kee…

23 经典卷积神经网络 LeNet【李沐动手学深度学习v2课程笔记】 (备注:提到如何把代码从CPU改到在GPU上使用)

目录 1. LeNet 2. 实现代码 3. 模型训练 4. 小结 本节将介绍LeNet&#xff0c;它是最早发布的卷积神经网络之一&#xff0c;因其在计算机视觉任务中的高效性能而受到广泛关注。 这个模型是由AT&T贝尔实验室的研究员Yann LeCun在1989年提出的&#xff08;并以其命名&…

VMware下载与安装

准备一个Linux的系统&#xff0c;成本最低的方式就是在本地安装一台虚拟机&#xff0c;VMware是业界最好用的虚拟机软件之一 官网&#xff1a;https://www.vmware.com/ 下载页面&#xff1a;https://www.vmware.com/products/workstation-pro/workstation-pro-evaluation.html …

小文件问题及GlusterFS的瓶颈

01海量小文件存储的挑战 为了解决海量小文件的存储问题&#xff0c;必须采用分布式存储&#xff0c;目前分布式存储主要采用两种架构&#xff1a;集中式元数据管理架构和去中心化架构。 (1)集中式元数据架构&#xff1a; 典型的集中式元数据架构的分布式存储有GFS&#xff0…

【深度学习笔记】7_1 优化与深度学习

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 7.1 优化与深度学习 本节将讨论优化与深度学习的关系&#xff0c;以及优化在深度学习中的挑战。在一个深度学习问题中&#xff0c;我们…

SQL 注入攻击 - delete注入

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、注入原理: 对于后台来说,delete操作通常是将对应的id传递到后台,然后后台会删除该id对应的数据。 如果后台没有对接收到的 id 参数进行充分的验证和过滤,恶意用户可能会…

数据治理实践——YY 直播业务指标治理实践

目录 一、问题背景 1.1 问题场景 1.2 问题小结 二、治理方案 2.1 治理目标 2.2 团队协同&#xff0c;共建规范 2.3 指标管理的定位 2.4 指标管理的目标及思路 2.5 指标管理&#xff0c;规范内容落地 2.6 数仓设计-关联指标维度 2.7 数据报表开发-配置口径说明 2.8 …

StableDiffusion3 官方blog论文研究

博客源地址&#xff1a;Stable Diffusion 3: Research Paper — Stability AI 论文源地址&#xff1a;https://arxiv.org/pdf/2403.03206.pdf Stability.AI 官方发布了Stable diffusion 3.0的论文研究&#xff0c;不过目前大家都沉浸在SORA带来的震撼中&#xff0c;所以这个水…

chrome插件chrome.storage数据写入失败QUOTA_BYTES_PER_ITEM quota exceeded

Unchecked runtime.lastError while running storage.set: QUOTA_BYTES_PER_ITEM quota exceeded at Object.callback 在开发浏览器插件的时候&#xff0c;报错提示&#xff1a;超出存储限制&#xff0c;浏览器插件存储官方文档&#xff1a;https://developer.chrome.com/docs…

Golang-channel合集——源码阅读、工作流程、实现原理、已关闭channel收发操作、优雅的关闭等面试常见问题。

前言 面试被问到好几次“channel是如何实现的”&#xff0c;我只会说“啊&#xff0c;就一块内存空间传递数据呗”…所以这篇文章来深入学习一下Channel相关。从源码开始学习其组成、工作流程及一些常见考点。 NO&#xff01;共享内存 Golang的并发哲学是“要通过共享内存的…

【AI辅助研发】-开端:未来的编程范式

编程的四种范式 面向机器编程范式 面向机器编程范式是最原始的编程方式&#xff0c;它直接针对计算机硬件进行操作。程序员需要了解计算机的内部结构、指令集和内存管理等细节。在这种范式下&#xff0c;编程的主要目标是编写能够直接控制计算机硬件运行的机器代码。面向机器…

redis使用笔记

redis使用笔记 1、Redis简介1.1 含义1.2 功能1.3 特点 2. 常用的数据结构2.1 HASH 3 redis接口定义3.1 redisReply3.2 redisContext3.3 redisCommand 4 实践操作4.1 遇到问题4.1.1 Get哈希的时候返回error4.1.2 长度一直为0&#xff0c;str没法打印&#xff08;未解决&#xff…

java正则表达式概述及案例

前言&#xff1a; 学习了正则表达式&#xff0c;记录下使用心得。打好基础&#xff0c;daydayup! 正则表达式 什么是正则表达式 正则表达式由一些特定的字符组成&#xff0c;代表一个规则。 正则表达式的功能 1&#xff1a;用来校验数据格式是否合规 2&#xff1a;在一段文本…

2024,互联网打工人最终没能逃得过 AI

时间很快就来到了三月份&#xff0c;回首看过去的一年&#xff0c;如果要选择最令人着迷的新技术&#xff0c;那非 ChatGPT 莫属。 从美国的硅谷、华尔街到中国的后厂村、中关村&#xff0c;几乎所有的科技大厂们都在讨论“AIGC”。 既 ChatGPT 之后&#xff0c;几乎每天都有…