SRS6.0: 七年长跑,全面支持H.265

2023-10-08 15:10

本文主要是介绍SRS6.0: 七年长跑,全面支持H.265,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

经过七年的酝酿和开发,SRS在6.0中终于正式支持了HEVC(H.265),几乎全面支持,包括RTMP、FLV、SRT、TS、HLS、DASH、GB28181、WebRTC(Safari)、DVR FLV、DVR MP4、WordPress SrsPlayer等等。

在大多数商业公司中,七年,黄花菜都凉了。开源项目只要能做出来,哪怕慢一些,也能活久见。

1、Why Important?

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,一定要想好了,看看你的场景下收益是否能超过要付出的成本。

2、Status of H.265

下面是各种场景下,H.265的支持情况,可以阅读原文,看详细的Commit。

第一部分,推流,推流端基本是支持的,通过打Patch也可以支持:

  • • 原生支持:使用FFmpeg推SRT流,目前支持得最好的方式。

  • • 原生支持:OBS推SRT流,需要有硬件支持。

  • • 原生支持:摄像头推GB28181流,基本上都支持。

  • • 补丁支持:使用FFmpeg推RTMP流,需要打Patch

  • • 配置支持:Safari浏览器推WebRTC流,需要手动点下菜单栏的选项才能开启。

  • • 不支持:Chrome/Firefox推WebRTC流。

  • • 不支持:使用OBS推流RTMP流。

第二部分,FFmpeg/ffplay拉流,支持度是比较完善的:

  • • 原生支持:使用FFmpeg拉HTTP-TS流。

  • • 原生支持:使用FFmpeg拉HLS流。

  • • 原生支持:使用FFmpeg拉MPEG-DASH流。

  • • 原生支持:使用FFmpeg拉SRT流。

  • • 原生支持:使用ffplay播放HTTP-TS流。

  • • 原生支持:使用ffplay播放HLS流。

  • • 原生支持:使用ffplay播放MPEG-DASH流。

  • • 原生支持:使用ffplay播放SRT流。

  • • 补丁支持:使用FFmpeg拉RTMP流。

  • • 补丁支持:使用FFmpeg拉HTTP-FLV流。

  • • 补丁支持:使用ffplay播放RTMP流。

  • • 补丁支持:使用ffplay播放HTTP-FLV流。

第三部分,浏览器H5播放流,MSE支持,但也需要上层播放器库支持:

  • • 原生支持:使用Chrome播放HTTP-TS流,需要硬解支持,SRS使用mpegts.js。

  • • 原生支持:使用Chrome播放HTTP-FLV流,需要硬解支持,SRS使用mpegts.js。

  • • 配置支持:使用Safari拉WebRTC流,需要手动点下菜单栏开启。

  • • 不支持:使用Chrome hls.js播放HLS流。底层MSE支持,但hls.js是负责将HLS转fMP4,也需要支持才行。

  • • 不支持:使用Chrome dash.js播放DASH流。底层MSE支持,但dash.js是负责将DASH转fMP4,也需要支持才行。

  • • 不支持:使用Chrome/Firefox拉WebRTC流。暂时没有看到有支持的可能,Chrome主要是在做AV1方向。

第四部分,VLC播放流,对于TS和MP4封装支持比较好:

  • • 原生支持:VLC播放HTTP-TS流。

  • • 原生支持:VLC播放SRT流。

  • • 原生支持:VLC播放HLS流。

  • • 原生支持:VLC播放MPEG-DASH流。

  • • 不支持:VLC播放RTMP流。暂时没看到支持的可能。

  • • 不支持:VLC播放HTTP-FLV流。暂时没看到支持的可能。

第五部分,辅助功能,关于HEVC的重要的辅助能力:

  • • 原生支持:录制为FLV/MP4文件。FLV是非标准的,MP4是标准的。

  • • 原生支持:解析HEVC元数据,通过HTTP API提供。

  • • 原生支持:黑盒测试支持HEVC。

  • • 原生支持:SRS镜像支持补丁的FFmpeg。可以不用自己编译FFmpeg,使用SRS镜像提供的FFmpeg即可。

  • • 原生支持:WordPress plugin SrsPlayer插件支持HEVC。由于云SRS使用的是4.0稳定版本,还需要几年才能切换到6.0。

  • • 不支持:Update srs-cloud for HEVC.

  • • 不支持:Edge server supports publish HEVC stream to origin.

  • • 不支持:Edge server supprots play HEVC stream from origin.

  • • 不支持:HTTP Callback takes HEVC metadata.

  • • 不支持:Prometheus Exporter supports HEVC metadata.

  • • 不支持:Improve coverage for HEVC.

  • • 不支持:Supports benchmark for HEVC by srs-bench.

至于iOS或Android Native,可以用FFmpeg硬解码,早就可以自己支持了。

由于Chrome 105 MSE已经支持了HEVC,所以浏览器上的完善度就很高了,感谢头条的开发者。

【学习地址】:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发

【文章福利】:免费领取更多音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击1079654574加群领取哦~

3、Usage: Live

我们看一个最简单的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:

  • • http://localhost:8080/live/livestream.flv

  • • http://localhost:8080/live/livestream.m3u8

Note: 注意不能用H5播放HLS,因为hls.js还不支持,但可以用H5播放HTTP-FLV或HTTP-TS,因为mpegts.js支持。

其他协议请参考SRS的文档开启即可。

4、Usage: WebRTC

特别解释下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。

5、FFmpeg Patch

众所周知,FFmpeg/ffplay是不支持HEVC over RTMP/HTTP-FLV,当然一般用FFmpeg的朋友都是有自己改代码的能力,下面是一些相关的Patch:

  • • 施维(runner365),支持FFmpeg 4/5/6版本的patch,参考ffmpeg_rtmp_h265,SRS使用的是这个Patch。

  • • Intel 0001-Add-SVT-HEVC-FLV-support-on-FFmpeg.patch

  • • 金山云修改的FLV的specfication以及对应的usage。

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

6、Known Issues

目前已知的问题,总结下:

  1. \1. Safari HEVC WebRTC只支持WebRTC,不支持转换其他协议。SRS可以实现,但目前使用的场景比较少,有需要会在未来完善。

  2. \2. Chrome/Firefox WebRTC是不支持HEVC的,也没有计划支持。

  3. \3. 几乎浏览器都支持MSE,除了iOS。注意HEVC MSE是依赖硬件解码的。

  4. \4. H5播放器目前mpegts.js支持,hls.js和dash.js还没有支持。

在某些场景下,HEVC的应用完全成熟了,具体就需要各位开发者自己评估了。

7、Thanks

H.265这个功能,核心的贡献都是社区的朋友,有可能会漏掉哈请多包涵,包括但不限于:

  • • runner365 施维大神,最初的PR的提交者,RTMP、HLS和SRT支持265。

  • • yinjiaoyuan 解决了265的bug,GB28181支持265的Patch。

  • • PieerePi 解决了265的bug。

  • • qichaoshen82 解决了265的bug。

  • • ZSC714725 解决了265的bug。

  • • bluestn MP4和GB28181录制支持265。

  • • mapengfei53 MP4录制支持265。

  • • chundonglinlin SRT支持265。

  • • duiniuluantanqin GB28181支持265。

  • • panda1986 WordPress SrsPlayer插件支持265。

Note: 可以看到大家的工作是有交叉的,虽然有些PR没有直接合并到SRS,但是最终合并到SRS的代码,都参考了大家提交的PR,并且会把大家作为co-author写到Commit中的哈。

最后,特别感谢mpegts.js,谦谦大神的H5播放器,支持了HTTP-FLV和HTTP-TS的H.265能力,这是flv.js的延续的项目,我觉得大家都欠他一个Star哇。

原文链接:SRS6.0: 七年长跑,全面支持H.265

这篇关于SRS6.0: 七年长跑,全面支持H.265的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/166165

相关文章

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

C++第四十七弹---深入理解异常机制:try, catch, throw全面解析

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】 目录 1.C语言传统的处理错误的方式 2.C++异常概念 3. 异常的使用 3.1 异常的抛出和捕获 3.2 异常的重新抛出 3.3 异常安全 3.4 异常规范 4.自定义异常体系 5.C++标准库的异常体系 1.C语言传统的处理错误的方式 传统的错误处理机制:

sqlite不支持中文排序,采用java排序

方式一 不支持含有重复字段进行排序 /*** sqlite不支持中文排序,改用java排序* 根据指定的对象属性字段,排序对象集合,顺序* @param list* @param field* @return*/public static List sortListByField(List<?> list,String field){List temp = new ArrayList(

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

Science Robotics 首尔国立大学研究团队推出BBEX外骨骼,实现多维力量支持!

重复性举起物体可能会对脊柱和背部肌肉造成损伤,由此引发的腰椎损伤是工业环境等工作场所中一个普遍且令人关注的问题。为了减轻这类伤害,有研究人员已经研发出在举起任务中为工人提供辅助的背部支撑装置。然而,现有的这类装置通常无法在非对称性的举重过程中提供多维度的力量支持。此外,针对整个人体脊柱的设备安全性验证也一直是一个缺失的环节。 据探索前沿科技边界,传递前沿科技成果的X-robot投稿,来自首尔国立

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

QtC++截图支持窗口获取

介绍 在截图工具中你会发现,接触到窗口后会自动圈出目标窗口,个别强大一点的还能进行元素识别可以自动圈出元素,那么今天简单分析一下QTc++如何获取窗口并圈出当前鼠标下的窗口。 介绍1.如何获取所有窗口2.比较函数3.实现窗口判断 结尾 1.如何获取所有窗口 1.我们需要调用windows接口EnumWindowsProc回调函数来获取所有顶级窗口,需要包含windows.