logo资料库

RTMP_H265推流直播技术研讨.pdf

第1页 / 共30页
第2页 / 共30页
第3页 / 共30页
第4页 / 共30页
第5页 / 共30页
第6页 / 共30页
第7页 / 共30页
第8页 / 共30页
资料共30页,剩余部分请下载后查看
目录
openHEVC在Windows下构建vs32/
从网络rtp封包中分离hevc/h265
从网络抓包中提取RTP包,RTP解包为HEVC/H
flv的格式
RTMP 直播 H265 推流适配总结
srs流媒体服务器(simple rtmp ser
基于nginx做了个RTMP H.265的扩展
如何实现rtsp h265 转 rtmp (rt
金山云直播SDK提供了业内一流的H.265编解码
CDN-Union__flv265
ffmpeg+nginx+rtmp+web实现视
windows下ffmpeg命令+nginx +
FFmpeg+Nginx搭建RTMP直播推流服务
FFmpeg+Nginx搭建HLS直播服务
FFmpeg RTMP推HEVC/H265流
rtmp数据封装三-视频(H264&H265)
rtmp数据封装四-音频(AAC&G711)
web无插件解码播放H264/H265(js解码H
h264视频流,aac音频流(g711a转码)推
openHEVC在Windows下构建vs32/64位工程(vs2013)
从网络rtp封包中分离hevc/h265
从网络抓包中提取RTP包,RTP解包为HEVC/H265裸流
flv的格式
srs流媒体服务器(simple rtmp server)如何支持h265
在srs 地址 (
on_video函数中增加h265类型判断:
其中SrsCodecVideoHEVC = 13,也是自定义的,264的是7,为了避免将来标准出来之
然后。。就没有然后了,话说服务器端真的没啥好改的啊
基于nginx做了个RTMP H.265的扩展
如何实现rtsp h265 转 rtmp (rtsp hevc 转 rtmp)并转发到CDN或自建服
金山云直播SDK提供了业内一流的H.265编解码
CDN-Union__flv265
ffmpeg+nginx+rtmp+web实现视频直播网站
windows下ffmpeg命令+nginx + rtmp实现推流,拉流。
FFmpeg+Nginx搭建RTMP直播推流服务
FFmpeg+Nginx搭建HLS直播服务
FFmpeg RTMP推HEVC/H265流
rtmp数据封装三-视频(H264&H265)
rtmp数据封装四-音频(AAC&G711)
web无插件解码播放H264/H265(js解码HTML5播放)
h264视频流,aac音频流(g711a转码)推送至rtmp服务器
目录 目录..................................................................................................................................................... 1 openHEVC 在 Windows 下构建 vs32/64 位工程(vs2013)...............................................................2 从网络 rtp 封包中分离 hevc/h265.....................................................................................................2 从网络抓包中提取 RTP 包,RTP 解包为 HEVC/H265 裸流........................................................ 2 flv 的格式............................................................................................................................................3 RTMP 直播 H265 推流适配总结................................................................................................... 6 srs 流媒体服务器(simple rtmp server)如何支持 h265..................................................................... 9 基于 nginx 做了个 RTMP H.265 的扩展........................................................................................ 11 如何实现 rtsp h265 转 rtmp (rtsp hevc 转 rtmp)并转发到 CDN 或自建服务器...................... 11 金山云直播 SDK 提供了业内一流的 H.265 编解码.................................................................... 14 CDN-Union__flv265.........................................................................................................................15 ffmpeg+nginx+rtmp+web 实现视频直播网站................................................................................15 windows 下 ffmpeg 命令+nginx + rtmp 实现推流,拉流。......................................................... 15 FFmpeg+Nginx 搭建 RTMP 直播推流服务................................................................................... 15 FFmpeg+Nginx 搭建 HLS 直播服务.............................................................................................. 15 FFmpeg RTMP 推 HEVC/H265 流..................................................................................................16 rtmp 数据封装三-视频(H264&H265)............................................................................................. 22 rtmp 数据封装四-音频(AAC&G711)..............................................................................................26 web 无插件解码播放 H264/H265(js 解码 HTML5 播放)............................................................. 27 h264 视频流,aac 音频流(g711a 转码)推送至 rtmp 服务器...................................................30
openHEVC 在 Windows 下构建 vs32/64 位 工程(vs2013) https://blog.csdn.net/listener51/article/details/53363516 从网络 rtp 封包中分离 hevc/h265 https://blog.csdn.net/andyshengjl/article/details/79330610 从网络抓包中提取 RTP 包,RTP 解包为 HEVC/H265 裸流 https://download.csdn.net/download/andyshengjl/10252397 解析 rtpdump 文件获取 rtp 包。 2、将 rtp 包解为 hevc/h265 裸流并存为 265 文件。 资源是一个完整的 vs2012 工程。 对应的 CSDN 博文 http://blog.csdn.net/andyshengjl/article/details/79330610
flv 的格式 https://blog.csdn.net/Jacob_job/article/details/79432774 SRS 代码分析【FLV 文件解析】 https://blog.csdn.net/weixin_39799839/article/details/78638721?utm_source=blogxgwz0 流媒体-FLV 格式详解及数据分析 https://blog.csdn.net/mm792261167/article/details/69396493?utm_source=blogxgwz2 flv 封装单元是以 tag 来表示的,一个 tag 可以是音频 tag 或者视频 tag,或者脚本 tag 及其其 他类型。 一、flv 的格式 flvheader 脚本 tag(metadata) 第一个视频 tag(h264_spspps) 第一个音频 tag(aac_header) 第二个视频 tag(h264 第一个关键帧) 后面就是音频和视频 tag 交互存在 … 二、tag 的格式: [TYPE] (1byte) [body size] (3byte) [timestamp] (4byte) [stream ID] (3byte) [body data] [previousTagSize] (4byte) 三、flv header 文件头由 9 bytes 组成 [1-3] 前 3 个 bytes 是文件类型,总是“FLV”,也就是(0x46 0x4C 0x56)。 [4] 第 4 btye 是版本号,目前一般是 0x01。 [5] 第 5 byte 是流的信息:倒数第一 bit 是 1 表示有视频(0x01),倒数第三 bit 是 1 表示 有音频(0x4),有视频又有音频就是 0x01 | 0x04(0x05),其他都应该是 0。 [6-9] 最后 4 bytes 表示 FLV 头的长度,3+1+1+4 = 9。 四、flv body 由若干个 tag (tag header+tag data)组成 [4 bytes 记录着上一个 tag 的长度]+[11 bytes 的 tag header]+[tag data]
4.1 tag header [1] 第 1 个 byte 为记录着 tag 的类型,音频(0x8),视频(0x9),脚本(0x12); [2-4] 第 2 到 4 bytes 是数据区的长度,也就是 tag data 的长度; [5-7] 再后面 3 个 bytes 是时间戳,单位是毫秒,类型为 0x12 则时间戳为 0; [8] 时间戳后面一个 byte 是扩展时间戳,时间戳不够长的时候用; [9-11] 最后 3 bytes 是 streamID,但是总为 0 第一个 tag 的前面没有 tag,所以第一个 tag 前面的 previousTagSize 就是 00 00 00 00 4.2 tag data 4.2.1 脚本 tag data 该类型 Tag 又通常被称为 Metadata(元数据) Tag,会放一些关于 FLV 视频和音频的参数信 息,如 duration、width、height 等。通常该类型 Tag 会跟在 File Header 后面作为第一个 Tag 出现,而且只有一个。 包含两个 AMF 包。AMF(Action Message Format)是 Adobe 设计的一种通用数据封装格 式,在 Adobe 的很多产品中应用,简单来说,AMF 将不同类型的数据用统一的格式来描 述。 第一个 AMF 包封装字符串类型数据,用来装入一个“onMetaData”标志 第二个 AMF 包封装一个数组类型,这个数组中包含了音视频信息项的名称和值 第一个 AMF 包: [1] 第 1 个字节表示 AMF 包类型,一般总是 0x02,表示字符串,其他值表示意义请查阅文 档。 [2-3] 第 2-3 个字节为 UI16 类型值,表示字符串的长度,一般总是 0x000A(“onMetaData” 长度)。 [4-…] 后面字节为字符串数据,一般总为“onMetaData”。 第二个 AMF 包: [1] 第 1 个字节表示 AMF 包类型,一般总是 0x08,表示数组。 [2-5] 第 2-5 个字节为 UI32 类型值,表示数组元素的个数。 [6-…] 后面即为各数组元素的封装, 数组元素为元素名称和值组成的对。表示方法如下: [1-2] 第 1-2 个字节表示元素名称的长度,假设为 L。 [3- L+2] 后面跟着为长度为 L 的字符串。 [L+3] 第 L+3 个字节表示元素值的类型。 [L+4-…] 后面跟着为对应值,占用字节数取决于值的类型。 4.2.2 音频 tag data
tag data 如果是音频数据,第一个 byte 记录 audio 信息: 前 4 bits 表示音频格式(全部格式请看官方文档): 0 – 未压缩 1 – ADPCM 2 – MP3 4 – Nellymoser 16-kHz mono 5 – Nellymoser 8-kHz mono 10 – AAC 下面两个 bits 表示 samplerate: 0 – 5.5KHz 1 – 11kHz 2 – 22kHz 3 – 44kHz 下面 1 bit 表示采样长度: 0 – snd8Bit 1 – snd16Bit 下面 1 bit 表示类型: 0 – sndMomo 1 – sndStereo 之后是数据。 4.2.3 视频 tag data 如果是视频数据,第一个 byte 记录 video 信息: 前 4 bits 表示类型: 1 – keyframe 2 – inner frame 3 – disposable inner frame (h.263 only) 4 – generated keyframe 后 4 bits 表示解码器 ID: 2 – seronson h.263 3 – screen video 4 – On2 VP6 5 – On2 VP6 with alpha channel 6 – Screen video version 2 7 – AVC (h.264) 之后是数据。 五、实例代码
RTMP 直播 H265 推流适配总结 https://www.cnblogs.com/doudouyoutang/p/7998929.html 1、在 iOS11 的系统之上,苹果逐渐放开 H265 硬编硬解的能力,硬解码的能力只要升级到 iOS11 之后,iPhone6+以上的机型就支持了(印象中); H265 硬编码的能力对设备要求较高,不仅要求系统版本在 iOS11 以上,并且设备在 iPhone8 以上(目前验证到),部门 ipad 设备在调用系统 API 检测是否支持 HEVC 编码的时 候, 虽然返回 True,但是依然编码返回错误。 所以我使用了一段真实的硬编代码进行测试机器到底是否支持硬编码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 //尝试创建 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) { kCMTimeInvalid); VTCompressionSessionCompleteFrames(_encodingSession,
31 32 33 34 35 36 37 38 39 40 // 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 清晰
分享到:
收藏