经过七年的酝酿和开发,SRS在6.0中终于正式支持了HEVC(H.265),几乎全面支持,包括RTMP、FLV、SRT、TS、HLS、DASH、GB28181、WebRTC(Safari)、DVR FLV、DVR MP4、WordPress SrsPlayer等等。
在大多数商业公司中,七年,黄花菜都凉了。开源项目只要能做出来,哪怕慢一些,也能活久见。
H.265比H.264的编码效率更高,不过一个编解码的更新换代,一般是以N个10年为基准的,现在也不能说H.265就能完全替换H.264,还有不少遗留问题。
H.265的收益就不用说了,可以用更少的带宽,传输同样的质量,这就是省钱啊。
此外,8K的朋友必须H.265,大约在9Mbps码率,而H.264得30Mbps而且最高分辨率无法支持8K。
但省钱的前提是不出问题,如果用户的设备支持H.265有问题,那就会引起投诉和体验问题,反而造成更大的成本。
当然了可以将 H.265转码一个H.264的流出来,给那些只支持H.264的设备用,不过这样一样会引入转码成本了。
而H.265正有这一堆的问题,所以如果你想要选择H.265,一定要想好了,看看你的场景下收益是否能超过要付出的成本。
下面是各种场景下,H.265的支持情况,可以阅读原文,看详细的Commit。
第一部分,推流,推流端基本是支持的,通过打Patch也可以支持:
第二部分,FFmpeg/ffplay拉流,支持度是比较完善的:
第三部分,浏览器H5播放流,MSE支持,但也需要上层播放器库支持:
第四部分,VLC播放流,对于TS和MP4封装支持比较好:
第五部分,辅助功能,关于HEVC的重要的辅助能力:
至于iOS或Android Native,可以用FFmpeg硬解码,早就可以自己支持了。
由于Chrome 105 MSE已经支持了HEVC,所以浏览器上的完善度就很高了,感谢头条的开发者。
我们看一个最简单的H.265直播的例子。
首先,编译SRS,注意开启HEVC(H.265)支持,SRS 6.0.31+:
git checkout develop./configure --h265=on && make
然后,启动SRS服务器,我们启动了SRT、HTTP-FLV和HLS:
env SRS_LISTEN=1935 SRS_DAEMON=off SRS_LOG_TANK=console \ SRS_SRT_SERVER_ENABLED=on SRS_VHOST_SRT_ENABLED=on SRS_VHOST_SRT_TO_RTMP=on \ SRS_HTTP_SERVER_ENABLED=on SRS_VHOST_HTTP_REMUX_ENABLED=on \ SRS_VHOST_HTTP_REMUX_MOUNT=[vhost]/[app]/[stream].flv SRS_VHOST_HLS_ENABLED=on \ ./objs/srs -e
接着,启动FFmpeg推流,我们选择SRT推流,天然兼容HEVC:
ffmpeg -stream_loop -1 -re -i doc/source.flv -acodec copy -vcodec libx265 \ -pes_payload_size 0 -f mpegts 'srt://127.0.0.1:10080?streamid=#!::r=live/livestream,m=publish'
就可以直接打开网页播放HTTP-FLV流了,也可以使用ffplay或VLC播放HLS:
Note: 注意不能用H5播放HLS,因为hls.js还不支持,但可以用H5播放HTTP-FLV或HTTP-TS,因为mpegts.js支持。
其他协议请参考SRS的文档开启即可。
特别解释下WebRTC H.265:只有Safari支持HEVC,Chrome和Firefox还不支持。
Safari默认没有开启,需要手动点下开发 > 实验性功能 > WebRTC H265 codec
。
具体使用方法,请参考#465的Safari WebRTC
部分的使用说明。
WebRTC对于AV1的支持更完善,Safari/Chrome/Firefox也都支持,具体请参考#1070,当然MSE对于AV1目前还没有支持。
Note: Media Source Extensions (MSE)是浏览器支持流媒体的底层接口,可以认为是把点播或直播转成fMP4切片送给H5 video对象,比如mpegts.js、hls.js和dash.js都是基于MSE,具体可以参考MDN: MSE。
众所周知,FFmpeg/ffplay是不支持HEVC over RTMP/HTTP-FLV,当然一般用FFmpeg的朋友都是有自己改代码的能力,下面是一些相关的Patch:
SRS提供了打过Patch的FFmpeg、ffplay和ffprobe,可以直接用SRS Docker推流:
# For macOSdocker run --rm -it ossrs/srs:encoder ffmpeg -stream_loop -1 -re -i doc/source.flv \ -acodec copy -vcodec libx265 -f flv rtmp://host.docker.internal/live/livestream# For linuxdocker run --net=host --rm -it ossrs/srs:encoder ffmpeg -stream_loop -1 -re -i doc/source.flv \ -acodec copy -vcodec libx265 -f flv rtmp://127.0.0.1/live/livestream
Note: 也可以把二进制拷贝出来使用,或者参考Dockerfile编译。
可以详细参考FFmpeg Tools
目前已知的问题,总结下:
在某些场景下,HEVC的应用完全成熟了,具体就需要各位开发者自己评估了。
H.265这个功能,核心的贡献都是社区的朋友,有可能会漏掉哈请多包涵,包括但不限于:
Note: 可以看到大家的工作是有交叉的,虽然有些PR没有直接合并到SRS,但是最终合并到SRS的代码,都参考了大家提交的PR,并且会把大家作为co-author写到Commit中的哈。
最后,特别感谢mpegts.js,谦谦大神的H5播放器,支持了HTTP-FLV和HTTP-TS的H.265能力,这是flv.js的延续的项目,我觉得大家都欠他一个Star哇。
欢迎加入SRS付费星球,你的支持可以让社区更健康的发展。社区也会给星球用户更多的时间和支持,会优先回答星球的问题,每年在各个城市的开发者线下交流,也会优先拜访付费用户。