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. 第四章:if else switch使用

    /* * @Issue: 输入整数a和b,若a²+b²大于100,则输出a²+b²之和的百位以上的数字,否则直接输出a²+b²的和 * @Author: 一届书生 * @LastEditTime : ...

  2. 在windows电脑中安装redis

    1,github下载地址:https://github.com/MSOpenTech/redis/tags 2,下载完成后,解压到对应文件夹 3,打开redis.windows.conf,在#requ ...

  3. python 远程windows系统执行cmd命令

    如果你的服务器是windows系统,不想一台一台mstsc远程到桌面上去操作,python是有模块可以远程处理的:winrm pip install pywinrm 安装模块即可 windows系统服 ...

  4. 报错ORA-01830: date format picture ends before converting entire input string

    报错ORA-01830: date format picture ends before converting entire input string 原语句 select to_char(to_da ...

  5. 【实用教程】在配备持久内存的实例上部署Redis应用

    简介:配备持久内存的实例(例如re7p.r7p.re6p)提供了超大CPU内存配比,Redis应用运行在这类实例上可以大幅度降低单GiB内存的成本.本文以部分操作系统为例,介绍如何在这类实例上快速部署 ...

  6. [FAQ] VsCode 同时多行编辑

      [多光标自定义编辑] 按住 alt 键,鼠标左键点击,出现多个光标. [批量选中匹配编辑] 鼠标选中字符,按快捷键 ctrl + shift + L,字符的右侧都出现光标,可同时编辑. Tool: ...

  7. [Kali] Kali Linux 环境准备

      虚拟机和系统: Mac 的 Vmware Fusion:https://www.vmware.com/cn/products/fusion/fusion-evaluation.html  序列号去 ...

  8. [GPT] Unable to negotiate with xx.xx.xx.xx port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss

      这个错误通常发生在 SSH 客户端无法找到与 SSH服务器 匹配的主机密钥类型时. 这可能是因为SSH服务器配置为使用SSH客户端不支持的主机密钥类型. 要解决此问题,您需要将缺少的主机密钥类型添 ...

  9. [DApp] Moralis 生产阶段的服务安全设置 -锁定数据库

    Moralis 的基础设施数据库是使用的 MongoDB,其非常适合Dev阶段的快速开发. 如果进入生产环境,需要锁定数据库,防止任何用户可利用SDK向Mongo插入多余数据. 另外,Moralis ...

  10. [Go] 浅谈 gorm 执行 AutoMigrate 的两种时机

    第一种就是直接在操作 model 的逻辑中,执行 db.AutoMigrate,模型没有更新时不会有 schema 相关的 sql 被执行. 第二种就是单独定义一个属于 main 包的 go 文件,专 ...