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 前言 安防互联网化的需求已经越 ...
随机推荐
- 重新整理.net core 计1400篇[八] (.net core 中的依赖注入的深入理解)
生命周期策略 在实例Transient 和 Scoped 中,所以实现Idisposable 接口的服务实例会被当前IServiceProvider 对象保存起来,当IService 对象的Dispo ...
- Redis为什么是单线程还支持高并发
Redis为什么设计成单线程模式因为redis是基于内存的读写操作,所以CPU不是性能瓶颈,而单线程更好实现,所以就设计成单线程模式 单线程模式省却了CPU上下文切换带来的开销问题,也不用去考虑各种锁 ...
- Webpack Proxy工作原理?为什么能解决跨域?
一.是什么 webpack proxy,即webpack提供的代理服务 基本行为就是接收客户端发送的请求后转发给其他服务器 其目的是为了便于开发者在开发模式下解决跨域问题(浏览器安全策略限制) 想要实 ...
- 离线语音识别,vosk,离线流式实时静音噪声监测,支持多语言开发python c++ c# java等
#!/usr/bin/env python3 from vosk import Model, KaldiRecognizer, SetLogLevel import sys import os imp ...
- 对象数组(java)
如果程序需要某个类的若干个对象,例如Student类的10个对象,显然如下声明10个Student对象是不可取的: Student stul, stu2, stu3, stu4, stu5, stu6 ...
- 安装两个jdk Windows系统
安装两个jdk Windows系统 本来装的是Java 8,现在有一个新的项目要到手上,需要的环境是Java 7,想着还有别的要用,所以就装两个在电脑上 jdk的下载直接去官网就行,不知道怎么下就看这 ...
- 力扣141(Java)-环形链表(简单)
题目: 给你一个链表的头节点 head ,判断链表中是否有环. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示给定链表中的环,评测系统内部使用整数 pos ...
- 力扣35(java&python)-搜索插入位置(简单)
题目: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 请必须使用时间复杂度为 O(log n) 的算法. 示例 1: 输入: ...
- 如何在 ACK 中使用 MSE Ingress
简介: 本文将为大家分享一下 Ingress 标准 和 实现的趋势,介绍一下 MSE Ingress 在这个趋势下的优势和实践,为大家做关键入口选择多一些参考. 作者:彦林 随着云原生架构的普及,K8 ...
- 如何落地云原生DevOps?
简介: 什么是云原生DevOps?在阿里内部有怎样的实践?企业又该如何落地?阿里云云效专家团队提出了下一代精益产品开发方法体系--ALPD,提供了系统的云原生DevOps落地的方法支撑,帮助企业渐进式 ...