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 推流适配总结的更多相关文章

  1. LAL v0.35.4发布,OBS支持RTMP H265推流,我跟了

    Go语言流媒体开源项目 LAL 今天发布了v0.35.4版本. LAL 项目地址:https://github.com/q191201771/lal 老规矩,简单介绍一下: ▦ 一. OBS支持RTM ...

  2. Android流媒体开发之路二:NDK开发Android端RTMP直播推流程序

    NDK开发Android端RTMP直播推流程序 经过一番折腾,成功把RTMP直播推流代码,通过NDK交叉编译的方式,移植到了Android下,从而实现了Android端采集摄像头和麦克缝数据,然后进行 ...

  3. day122:MoFang:OSSRS流媒体直播服务器&基于APICloud的acLive直播推流模块实现RTMP直播推流

    目录 1.docker安装OSSRS流媒体直播服务器 2.基于APICloud的acLive直播推流模块实现RTMP直播推流 3.直播流管理 1.docker安装OSSRS流媒体直播服务器 1.OSS ...

  4. EasyRTMP+EasyRTSPClient实现的多路(支持断线重连)RTSP转RTMP直播推流工具

    本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/73441405 介绍 EasyRTMP是Eas ...

  5. OSX安装nginx和rtmp模块(rtmp直播服务器搭建)

    1.安装Homebrew,执行命令 1 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/ma ...

  6. 搭建rtmp直播流服务之3:java开发ffmpeg实现rtsp转rtmp并实现ffmpeg命令的接口化管理架构设计及代码实现

    上一篇文章简单介绍了java如何调用ffmpeg的命令:http://blog.csdn.net/eguid_1/article/details/51777716 上上一篇介绍了nginx-rtmp服 ...

  7. Nginx学习之配置RTMP模块搭建推流服务

    写在开始 小程序升级实时音视频录制及播放能力,开放 Wi-Fi.NFC(HCE) 等硬件连接功能.同时提供按需加载.自定义组件和更多访问层级等新特性,增强了第三方平台的能力,以满足日趋丰富的业务需求. ...

  8. 极速搭建RTMP直播流服务器+webapp (vue) 简单实现直播效果

    在尝试使用webRTC实现webapp直播失败后,转移思路开始另外寻找可行的解决方案.在网页上尝试使用webRTC实现视频的直播与看直播,在谷歌浏览器以及safari浏览器上测试是可行的.但是基于基座 ...

  9. iOS:基于RTMP的视频推流

    iOS基于RTMP的视频推流 一.基本介绍 iOS直播一出世,立马火热的不行,各种直播平台如雨后春笋,正因为如此,也同样带动了直播的技术快速发展,在IT界精通直播技术的猴子可是很值钱的.直播技术涉及的 ...

  10. 将EasyRTMP_RTSP移植到Android平台实现的RTSP拉流转推RTMP直播流功能

    本文转自EasyDarwin开源团队成员Kim的博客:http://blog.csdn.net/jinlong0603/article/details/73253044 前言 安防互联网化的需求已经越 ...

随机推荐

  1. docker 应用篇————具名挂载和匿名挂载[十三]

    前言 简单整理一下具名挂载和匿名挂载. 正文 来看一下匿名挂载. 这里-v指定了容器内部的路径,但是没有指定容器外部的路径,那么挂载到了什么地方. 用inspect 查看一下. 挂载到这个位置了. 然 ...

  2. docker 应用篇————日志、元数据、进程查看[五]

    前言 简单介绍一下dokcer的日志.元数据.进程查看 正文 查看日志命令: docker logs -f -t --tail 10 32ae 我这里的一个日志就是: 这个一直输出hello word ...

  3. 力扣240(java&python)-搜索二维矩阵 II(中等)

    题目: 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target .该矩阵具有以下特性: 每行的元素从左到右升序排列.每列的元素从上到下升序排列. 示例 1: 输入:ma ...

  4. 跨模态学习能力再升级,EasyNLP电商文图检索效果刷新SOTA

    简介: 本⽂简要介绍我们在电商下对CLIP模型的优化,以及上述模型在公开数据集上的评测结果.最后,我们介绍如何在EasyNLP框架中调用上述电商CLIP模型. 作者:熊兮.欢夏.章捷.临在 导读 多模 ...

  5. 轻松搭建基于 Serverless 的 ThinkPHP 应用

    ThinkPHP 是什么? ThinkPHP 是一个免费开源的,快速.简单的面向对象的轻量级 PHP 开发框架,是为了敏捷 WEB 应用开发和简化企业应用开发而诞生的.ThinkPHP 从诞生以来一直 ...

  6. Flink 如何实时分析 Iceberg 数据湖的 CDC 数据

    简介: 数据湖的架构中,CDC 数据实时读写的方案和原理 本文由李劲松.胡争分享,社区志愿者杨伟海.李培殿整理.主要介绍在数据湖的架构中,CDC 数据实时读写的方案和原理.文章主要分为 4 个部分内容 ...

  7. AI让边缘更智能 边缘让AI无处不在

    ​简介: 城市管理和城市服务逐步走向智能化,智慧化.到2019底,全国100%的副省级城市,95%以上的地级市,以及50%以上的县级市均提出建设新型智慧城市,并已经有32个主要城市成立了专门的大数据管 ...

  8. Dubbo 和 HSF 在阿里巴巴的实践:携手走向下一代云原生微服务

    ​简介: HSF 和 Dubbo 的融合是大势所趋.为了能更好的服务内外用户,也为了两个框架更好发展,Dubbo 3.0 和以 Dubbo 3.0 为内核适配集团内基础架构生态的 HSF 3 应运而生 ...

  9. Fiddler 将插件放在独立子文件夹

    我的 Fiddler 安装了许多插件,有一些插件存在 DLL 名冲突问题,比如多个不同的插件都存在名为 PluginCore.dll 但实际实现逻辑完全不相同的程序集.这就导致了多个插件的安装之间,如 ...

  10. k8s-1.28版本多master部署

    一.环境准备 k8s集群角色 IP 主机名 安装相关组件 kubernetes版本号 控制节点 192.168.10.20 master apiserver.controller-manager.sc ...