RTMP 直播 H265 推流适配总结
1、在iOS11的系统之上,苹果逐渐放开H265硬编硬解的能力,硬解码的能力只要升级到iOS11之后,iPhone6+以上的机型就支持了(印象中);
H265硬编码的能力对设备要求较高,不仅要求系统版本在iOS11以上,并且设备在iPhone8以上(目前验证到),部门ipad设备在调用系统API检测是否支持HEVC编码的时候,
虽然返回True,但是依然编码返回错误。
所以我使用了一段真实的硬编代码进行测试机器到底是否支持硬编码:
//尝试创建H265硬编码器检测是否支持H265
bool SurpportHW265()
{
if (@available(iOS 11.0, *)) {
if(VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC))
{
VTCompressionSessionRef _encodingSession = nil;
CFMutableDictionaryRef sessionAttributes = CFDictionaryCreateMutable(
NULL,
0,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
// 创建编码
OSStatus status = VTCompressionSessionCreate(kCFAllocatorDefault,
(int32_t)640,
(int32_t)1136,
kCMVideoCodecType_HEVC,
sessionAttributes,
NULL,
NULL,
NULL,
NULL,
&_encodingSession); NSLog(@"H264: VTCompressionSessionCreate %d", (int)status); if (status == 0)
{
VTCompressionSessionCompleteFrames(_encodingSession, kCMTimeInvalid);
// End the session
VTCompressionSessionInvalidate(_encodingSession);
CFRelease(_encodingSession);
_encodingSession = NULL;
return true;
}
}
}
return false;
}
2、RTMP推流 扩展支持 H265
RTMP协议是基于TCP协议的,RTMP协议中推流中目前广泛使用了一种类似FLV Tag的格式,FLV的格式相对非常简单,从开始到结束一般分为
FLV FILE HEADER + FLV FILE BODY
其中 FLV FILE HEADER 一般9个字节,标记了后面的FLV数据中是否包含音频或者视频的一些信息;头三个字节对应FLV的ascii码
其中 FLV FILE BODY 又分为下面的结构
prev_tag_size + NextTagHeader + NextTagData | prev_tag_size + NextTagHeader + NextTagData | prev_tag_size + NextTagHeader + NextTagData | 。。。。
以上的结构不停循环
prev_tag_size 为4个字节,标记前面一个TagHeader + TagData 的大小, 第一个Tag因为之前没有,所以四个字节为0,这里4个字节为大端序
NextTagHeader 一般为11个字节,里面包含 tag类型,时间戳, 数据大小等等
NextTagData 是真正的数据,也就是H264或者H265的NALU的裸数据(去掉开始码)
3、一个完整的FLV 结构类型
一个推流完整的FLV ,在RTMP建立连接之后会:
先发一个 MetaData的包,这个包对应TagType 为 Script Tag
发一个 Video SequenceHeader 的Tag, 这个Tag 在RTMP的payload 对应的帧类型和编码类型【是17或者27】 + 【NALU类型是00】+【000000】(三个字节无意义)+ ConfigurationRecord(二进制数据)
发一个 Video 视频数据的Tag, 这个Tag 在RTMP的payload 对应的帧类型和编码类型【是17或者27】 + 【NALU类型是01】+【000000】(三个字节无意义)+ 【nalu size】(四个字节)+ 【nalu data】
注意上面音视频的格式不一样,视频数据的封包头多了4个字节标记每个NALU的大小;如果视频中payload包含多个NALU,那么每个NALU前面都需要加上 【nalu size】(四个字节)
5、推H265和H264做了哪些改变
1、音频保持不变
2、视频的metadata 的 script tag中有一个编码类型,H264的时候为7 , H265的时候需要改成自定义类型
3、视频的 Video SequenceHeader 的Tag 中的 ConfigurationRecord 需要更新为 HEVCDecoderConfigurationRecord 类型,这个结构体是公开的
4、 Video 视频数据的Tag 中, 帧类型和编码类型【是17或者27 后四个比特,标记编码类型,需要自己制定类型
6、一些经验
因为FLV目前没有兼容H265的标准,所以建议在VideoTag中每个关键帧的数据之前加上 VPS NALU| PPS_NALU|SPS_NALU|VIDEO_NALU 格式;每个NALU = NALU Size(4个字节)+ NALU Raw Data
H265相比H264更省带宽,而且编码输出的质量更高,相等码率下面的流,H265明显比H264清晰
RTMP 直播 H265 推流适配总结的更多相关文章
- LAL v0.35.4发布,OBS支持RTMP H265推流,我跟了
Go语言流媒体开源项目 LAL 今天发布了v0.35.4版本. LAL 项目地址:https://github.com/q191201771/lal 老规矩,简单介绍一下: ▦ 一. OBS支持RTM ...
- Android流媒体开发之路二:NDK开发Android端RTMP直播推流程序
NDK开发Android端RTMP直播推流程序 经过一番折腾,成功把RTMP直播推流代码,通过NDK交叉编译的方式,移植到了Android下,从而实现了Android端采集摄像头和麦克缝数据,然后进行 ...
- day122:MoFang:OSSRS流媒体直播服务器&基于APICloud的acLive直播推流模块实现RTMP直播推流
目录 1.docker安装OSSRS流媒体直播服务器 2.基于APICloud的acLive直播推流模块实现RTMP直播推流 3.直播流管理 1.docker安装OSSRS流媒体直播服务器 1.OSS ...
- EasyRTMP+EasyRTSPClient实现的多路(支持断线重连)RTSP转RTMP直播推流工具
本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/73441405 介绍 EasyRTMP是Eas ...
- OSX安装nginx和rtmp模块(rtmp直播服务器搭建)
1.安装Homebrew,执行命令 1 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ma ...
- 搭建rtmp直播流服务之3:java开发ffmpeg实现rtsp转rtmp并实现ffmpeg命令的接口化管理架构设计及代码实现
上一篇文章简单介绍了java如何调用ffmpeg的命令:http://blog.csdn.net/eguid_1/article/details/51777716 上上一篇介绍了nginx-rtmp服 ...
- Nginx学习之配置RTMP模块搭建推流服务
写在开始 小程序升级实时音视频录制及播放能力,开放 Wi-Fi.NFC(HCE) 等硬件连接功能.同时提供按需加载.自定义组件和更多访问层级等新特性,增强了第三方平台的能力,以满足日趋丰富的业务需求. ...
- 极速搭建RTMP直播流服务器+webapp (vue) 简单实现直播效果
在尝试使用webRTC实现webapp直播失败后,转移思路开始另外寻找可行的解决方案.在网页上尝试使用webRTC实现视频的直播与看直播,在谷歌浏览器以及safari浏览器上测试是可行的.但是基于基座 ...
- iOS:基于RTMP的视频推流
iOS基于RTMP的视频推流 一.基本介绍 iOS直播一出世,立马火热的不行,各种直播平台如雨后春笋,正因为如此,也同样带动了直播的技术快速发展,在IT界精通直播技术的猴子可是很值钱的.直播技术涉及的 ...
- 将EasyRTMP_RTSP移植到Android平台实现的RTSP拉流转推RTMP直播流功能
本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/73253044 前言 安防互联网化的需求已经越 ...
随机推荐
- 抓包整理————tcp 三次握手[九]
前言 简单抓包一下3次握手. 正文 握手的目标: 同步sequence 序列化 初始化序列化ISN(Initial Sequence Number) 交换tcp 通信参数 如MSS.窗口比例因子.选择 ...
- spring boot yaml 配置[三]
前言 我们知道java 因为历史的原因,一直有一个配置地狱的痛点.那么如何解决掉它呢? spring boot 是一柄利器,但是呢,还是要配置. 看来配置的避免不了的了. 那么如何可以减轻这种痛苦呢? ...
- spring boot @propertySource @importResource @Bean [六]
@propertySource 指定property的配置源. 创建一个person.property: 然后修改person注解; 在运行test之后,结果为: @importResource 这个 ...
- linux 连接wifi
前言 我使用树莓派的时候实际过的. 正文 第一步扫描wifi: iwlist wlan0 scan 然后配置: vim /etc/wpa_supplicant/wpa_supplicant.conf ...
- drf——基于apiview写过滤、排序和分页
基于APIView带过滤和排序 from rest_framework.views import APIView from .models import Book from .serializer i ...
- Linux基础-01:Linux命令的基本格式
2.1.1 命令提示符 在CentOS 7操作系统中,Linux命令提示符就像是你与电脑交流的一个小标志,告诉你系统已经准备好接受你的指令了. 它通常会显示在你打开的终端窗口或控制台的最前面. 让我们 ...
- 如何迁移 Flink 任务到实时计算
简介: 本文由阿里巴巴技术专家景丽宁(砚田)分享,主要介绍如何迁移Flink任务到实时计算 Flink 中来. 通常用户在线下主要使用 Flink run,这会造成一些问题,比如:同一个配置因版本而变 ...
- 如何避免JS内存泄漏?
简介: 很多开发者可能平时并不关心自己维护的页面是否存在内存泄漏,原因可能是刚开始简单的页面内存泄漏的速度很缓慢,在造成严重卡顿之前可能就被用户刷新了,问题也就被隐藏了,但是随着页面越来越复杂,尤 ...
- [FAQ] 没有docker用户组,怎么让普通用户有权限操作docker
如果没有docker用户组,可以通过以下步骤让普通用户有权限操作docker: 创建一个名为docker的用户组: sudo groupadd docker 将当前用户添加到docker用户组中: ...
- 探索 WPF 的 ITabletManager.GetTabletCount 在 Win11 系统的底层实现
本文将和大家介绍专为 WPF 触摸模块提供的 ITabletManager 的 GetTabletCount 方法在 Windows 11 系统的底层实现 本文属于 WPF 触摸相关系列博客,偏系统底 ...