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. css 你真的了解padding吗?

    前言 padding 简写属性在一个声明中设置所有内边距属性,实际上在使用过程中它对block元素和内联元素的处理是不一样的. 正文 对于block元素 如果宽度非auto那么容器会变大,如果容器宽度 ...

  2. Flink Standalone集群jobmanagers高可用配置

    上篇文章简单叙述了Flink standalone集群的基础部署,在生产环境中假如只有1个jobmanager的话,那么这个节点一旦挂掉,所有运行的task都会中断,带来的影响比较大,因此在生产环境至 ...

  3. 最简编译CockroachDB 21.2

    编译CockroachDB比较麻烦,尤其是从git下载代码编译还需要关联项目的下载,本文整理从官网下载代码的编译过程,非常简单,几乎没有异常,供大家参考. 编译CockroachDB 21.2 1.安 ...

  4. 他来了他来了,.net开源智能家居之苹果HomeKit的c#原生sdk【Homekit.Net】1.0.0发布,快来打造你的私人智能家居吧

    背景介绍 hi 大家好,我是三合,作为一个非著名懒人,每天上完班回到家,瘫在沙发上一动都不想动,去开个灯我都嫌累,此时,智能家居拯救了我,只需要在手机点点点,开关灯,空调,窗帘就都搞定了,一开始我用的 ...

  5. ajax,axios和fetch三者间的区别.

    ajax: 1. 传统 Ajax 指的是 XMLHttpRequest(XHR), 最早出现的发送后端请求技术,隶属于原生js中,核心使用XMLHttpRequest对象,多个请求之间如果有先后关系的 ...

  6. 使用Git向Gitee仓库推送项目的完整流程

    1.安装git 如果没有特殊需求,直接下一步即可:安装链接如下:Git - Downloads (git-scm.com) 2.在Gitee上新建仓库,初始化仓库 3.保存仓库的链接,如下图标记所示 ...

  7. 3.CSS三种基本选择器

    三种选择器的优先级: id选择器 > class选择器 > 标签选择器 1.标签选择器:会选择到页面上所有的该类标签的元素 格式: 标签{} 1 <!DOCTYPE html> ...

  8. 阿里巴巴云数据仓库 MaxCompute 数据安全最佳实践

    ​简介:MaxCompute作为企业级SaaS模式云数据仓库,正在为客户业务及其数据提供持续的安全保护. MaxCompute 近期对产品的安全能力进行了全面升级 ,结合数据生命周期,针对数据误用.数 ...

  9. [PHP] Laravel auth:airlock 更名 auth:sanctum

    本以为有了一种改善型的服务出来了,没想到不是. 关于 Laravel 现有的三大验证方式看这里:[PHP] 浅谈 Laravel 三大验证方式的区别, auth:api, passport, auth ...

  10. 快速部署 微软开源的 Garnet 键值数据库

    快速部署 微软开源的 Garnet 键值数据库 Garnet 是 Microsoft Research 推出的一种新型远程缓存存储,其设计速度极快.可扩展且延迟低. Garnet 在单个节点内是线程可 ...