nginx-rtmp-ffmpeg-flv支持h265数据

关于flv支持H265数据的ffmpeg扩展

前言

最近做项目时遇到rtmp不支持发送H265数据的问题。查找了相关资料,做了如下整理。方便自己和他人学习。
关于rtmp为什么不支持H265数据,其原因是flv封装格式不支持h265数据的封装。也就是说标准的ffmpeg是不支持flv封装h265数据的。有很多人奇怪,为什么国内大部分CDN厂商都采用的是RTMP协议,并且目前HLS和TS都已经支持H265,为什么flv不去友好的支持呢?相关原因
https://cloud.tencent.com/developer/news/720213 该链接解释的非常详细,简单阐述:并不是不能让FLV支持HEVC,只是因为Adobe(flv协议开发的公司)没有对FLV支持HEVC做出具体说明。因此,如果Adobe不扩展标准,FFMpeg是不会让FLV支持HEVC的。

一、对于如何扩展ffmpeg支持FLV封装H265数据呢?

源码参照网址:https://github.com/numberwolf/FFmpeg-QuQi-H265-FLV-RTMP
原理分析:flv封装格式不支持封装h265的数据,所以需要在flv头文件中新增加一个类型来代表封装的是h265的数据。众所周知:ffmepg对于一个视频文件的操作实际上从-解封装(封装格式例如MP4、flv、mpeg等)-解码(解码h264数据、H265数据)-编码(编码成H265或h264数据)-封装(封装成MP4、flv、mpeg等)。不难看出,只要在flv封装格式的时候支持封装h265和解封装时候对应类型去解封装就可以了。接下来上干货-代码:
flv头文件
flv头文件
增加FLV_CODECID_HEVC = 12代表flv封装的是h265数据。

封装flvenc.c中:
在这里插入图片描述
具体源码在上面的githup中可下载到。我这里只做原理分析:
封装时在写封装头flv_write_codec_header接口里面和flv_write_trailer接口里面增加了AV_CODEC_ID_HEVC 类型。在写每一包数据的时候也需要对H265的类型进行扩展。

解封装flvdec.c:
在解析包头的时候如何发现是新定义的类型FLV_CODECID_HEVC = 12时,将codec_id 赋值为AV_CODEC_ID_HEVC即可。注意需要在解码数据接口里面也有相关判断。

通过上述描述,是不是觉得flv支持h265原理也非常简单呢。

扩展

一、nginx-rtmp直播回放流的搭建参考优秀网址:

https://zhuanlan.zhihu.com/p/28009037

二、web.js解析h265格式参考网址:

https://github.com/numberwolf/h265web.js

总结

Nginx本身是一个非常出色的HTTP服务器,FFMPEG是非常好的音视频解决方案.这两个东西通过一个nginx的模块nginx-rtmp-module,组合在一起即可以搭建一个功能相对比较完善的流媒体服务器。站在巨人的肩膀上,路漫漫其修远兮~~ 欢迎大家一起讨论和学习。不足的欢迎评论,感觉有收获的,点个赞再走。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值