在nginx-http-flv-module中支持H.265(HEVC)

众所周知,FLV规范不支持H.265,并且近年来各大浏览器都逐渐不支持Flash,Adobe也宣布到2020年底不再支持Flash。作为FLV相关技术的所有者,Adobe估计也没动力更新规范来支持H.265;外加H.265标准的一些专利所有者的授权方案被指抢钱,更加打击了很多软件厂商的积极性。

从H.265标准出来没多久,就有人请求Adobe在FLV规范中加入对H.265的支持:

https://community.adobe.com/t5/Flash-Player/H265-support/td-p/5657976

https://tracker.adobe.com/#/view/FP-3650828

但是很遗憾,Adobe至今没有更新FLV规范。FFmpeg社区也曾提到,如果Adobe不更新规范,那么他们也不会在FLV中支持H.265。

那在FLV中支持H.265有什么难度吗?答案是几乎没什么难度,只要增加一个新的编码ID表示H.265就可以了。国内已经有支持封装/解封H.265的FLV的FFmpeg补丁,比较常见,不再列出,比较统一的编码ID是12。封装(推流)/解封(播放)的问题解决了,服务器也需要做相应的修改。除了增加一个编码ID外,还需要提取H.265视频编码中一个新增的结构VPS(Video Parameter Set),播放请求到来后,要把这个结构的内容发送给播放器。

网上已有不少支持H.265视频编码的FLV开源方案,基本上都能运行,但是对VPS结构的解析比较粗糙。前段时间在nginx-http-flv-module的基础上加入了对H.265的支持,测试没有问题,测试环境如下:

OS:Debian GNU/Linux 7.8

Publisher:最新版本的FFmpeg+支持H.265视频编码的FLV补丁

Player:B站的开源播放器ijkplayer,支持H.265视频编码的FLV补丁(只支持解封,不支持封装)

Server:nginx-http-flv-module+支持H.265视频编码的FLV补丁

测试截图如下:

在nginx-http-flv-module中支持H.265(HEVC)_第1张图片 推流 在nginx-http-flv-module中支持H.265(HEVC)_第2张图片 打开播放连接 在nginx-http-flv-module中支持H.265(HEVC)_第3张图片 流媒体详情1 在nginx-http-flv-module中支持H.265(HEVC)_第4张图片 流媒体详情2

注意,这部分代码没有开源,ijkplayer的demo原生也不支持输入网络URL,需要修改部分代码。

今天有网友问我修改过的代码是否支持HTTP-FLV方式播放H.265的视频,还真没测试过。刚才通过修改过的FFmpeg源代码,在configure时添加--enable-ffplay选项,编译出ffplay,测试是支持的,测试截图如下图所示:

在nginx-http-flv-module中支持H.265(HEVC)_第5张图片 HTTP-FLV方式支持H.265编码的视频

有需要的可以通过下面的联系方式联系我:

邮箱:[email protected],微信:SagitArrow。

因为之前跟很少几个网友闹了不愉快,在此重申一下,此部分代码不开源也不免费,我上文也提到过,网上支持H.265的方案很多,但是解析VPS很粗糙,所以在stat里看不到流的详情。另外,最新的HLS规范要求如果视频编码是H.265,那么封装格式必须是fMP4,所以网上很多支持H.265的HLS没用。

不过,如果给nginx-http-flv-module贡献过重要功能或者修复过重大bug的,我免费赠送。这么做的原因是nginx-http-flv-module开源已经3年多了,社区参与度并不高,大多数工作都是我一个人义务维护的(当然感谢很多网友的测试,bug反馈和PR),还有一些公司集成项目后对外宣称自主研发,BSD-2协议已经很宽松了,允许商用,但是起码得保留我的LICENSE吧。

最后,有问题请先看nginx-http-flv-module的README或者README.CN,前者是英文,后者是中文。之前有个网友问了个问题,我想着README上已经写明了,就回答README上有的我一概不予回答。结果该网友理直气壮地说我态度不好,一句话的事要用很多废话来包装。拜托,我的时间也是时间,问题多的时候我要面对的不只你一个人,你也没给我钱,我没义务给你解答各种问题。

你可能感兴趣的:(音视频,总结,nginx)