Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Since streaming in HEVC codec has been officially supported by Bilibili, maybe it's time to add support to HEVC codec. #470

Open
MiKayule opened this issue Mar 11, 2023 · 15 comments

Comments

@MiKayule
Copy link

Problem

Previously, though Bilibili will lively encode source stream to HEVC as a default quality choice (such as 超清PRO), streaming in HEVC directly to Bilibili is unavailable. However, I tried streaming in HEVC lately, and tested to play it on platforms as many as possible, and everything on all my platforms seems right. But when I was trying to record it with BililiveRecorder, all I got is a warning: [StandardRecordTask] 不支持此直播流的视频编码格式(只支持 H.264),本场直播不再自动启动录制。BililiveRecorder.Flv.Parser.UnsupportedCodecException: Unsupported Video Codec: 12 .

标题:考虑到B站官方已经支持了通过HEVC编码进行直播,也许是时候加入HEVC编码的支持了。

先前,尽管B站会实时把直播流转码到HEVC作为一个默认画质选项(例如“超清PRO”),但是直接用HEVC编码推流到B站是不可行的。然而,最近我尝试了通过HEVC直播,并在尽可能多的平台进行了播放测试,一切看起来都是正常的。但是当我尝试用录播姬录制它的时候,我收到了警告:[StandardRecordTask] 不支持此直播流的视频编码格式(只支持 H.264),本场直播不再自动启动录制。BililiveRecorder.Flv.Parser.UnsupportedCodecException: Unsupported Video Codec: 12

Proposal

I think it's time to add support to HEVC codec. Considering how this software works, adding HEVC support should not be a very difficult task I guess.

我认为现在是时候加入对HEVC编码的支持了。考虑到这个软件的运行原理,我觉得添加HEVC支持应该不会太难。

@Genteure
Copy link
Member

Genteure commented Mar 11, 2023

直接报错退出是比较简单的解决方法,之前因为没有检查视频编码格式出现了内存占用过高崩溃的问题。不支持 HEVC 的原因主要有:

  • FLV 文件本身就不支持 HEVC,codec id 12 是中国云厂商自己修改定义的,不是写在 FLV 标准里的
    • 因此也几乎没有播放器支持
    • ffmpeg 也不支持
    • 有改过的支持 HEVC FLV 的 ffmpeg 版本
  • 比较懒
  • 考虑到当时没有二压过的原画只会有 AVC,不支持也无所谓

不支持的原因是录播姬的数据修复部分要解析 FLV 数据进行处理。
现在用的话,修改录制模式为原始数据模式即可录制 HEVC 流。

目前B站 FLV 直播流的稳定性和质量很差,录制效果很不好,之后考虑开发 HLS 录制并作为主要录制方法。
部分直播间的 FLV 流延迟了 2 分钟多(当时看的时候这个直播间没有 HLS 流)。
近期甚至出现了部分直播间只有 HLS 流的情况,虽然怀疑不是故意没有的(因为B站内部上游接口报错了,调用bvc-play-url-one出错
开发了 HLS 录制之后输出 m3u8/m4s/mp4 文件,自然也就支持 HEVC 了,不过这个近期应该还做不出来。

关于录制自己的直播:推荐使用 OBS 自带的录制功能,目前B站直播服务器的稳定程度比较差,录制效果不好。

关于 SRT (TS) 推流:目前B站直播使用 OBS SRT 协议推流的时候经常会遇到缺帧的问题,音频视频都会缺,通常是 60 FPS 变成 57-58 FPS。视频会每 1-2 秒顿一下、音频也会同步卡顿一下,遇到之后比较明显,浏览器console里也会有调试信息输出,建议多注意一下。
B站直播姬使用的是B站自己实现的 RTMP-over-SRT 没有这个问题。

@MiKayule
Copy link
Author

MiKayule commented Mar 11, 2023

  • 考虑到当时没有二压过的原画只会有 AVC,不支持也无所谓
    • 如上所述,现在的 B 站已经接受直接通过 HEVC 推流,在这种情况下没有二压的原画也将是 HEVC
  • 关于录制自己的直播
    • 我是为了测试才用录播姬录制的hhh
    • 平时是会用 OBS 录制的
  • 关于 SRT (TS) 推流
    • 这点之前确实是不知道,多谢提醒

你提到 FLV 标准不支持 HEVC,这点我刚刚确实没有考虑到,我以为处理起来就像用 ffmpeg 混流一样简单快速,或至少可以借鉴其他开源项目的代码,没想到 ffmpeg 都不支持;但是既然 B 站直播在使用 HEVC FLV 这种文件,我很好奇实现解析 HEVC FLV 数据的工作量,以及如果工作量不太大,有没有可能在后续版本加入这个特性

P.S. 我倒是想通过PR来做些贡献,奈何我确实不太会C#,只能做伸手党了,十分抱歉

@Genteure
Copy link
Member

文件结构上区别不大,给录播姬加支持应该不需要太多改动,回头可以改一下试试看。
录出来的视频需要用支持 HEVC FLV 的魔改版 ffmpeg 转封装成 MP4 或其他格式之后才能在播放器里播放。

@mengguyi
Copy link

金山有魔改版的ffmpeg
https://github.com/ksvc/FFmpeg/wiki/hevcpush

@cxumol
Copy link
Contributor

cxumol commented Mar 29, 2023

OBS 已支持 HEVC RTMP 推流 obsproject/obs-studio#8522

@Genteure
Copy link
Member

OBS 已支持 HEVC RTMP 推流

@cxumol 看了一下 enhanced-rtmp-v1.pdf 和对应的 PR,它的实现方式和目前国内厂商的实现方式不一样(更巧妙更合理一点)

现在国内各云服务商、直播平台 HEVC FLV/RTMP 是直接用 12 作为 video codec id,其他不变。这个是违反标准的(或者说是与标准不兼容的?),也是为什么 ffmpeg 不支持这样搞的原因。

国内各个云服务商、直播平台定义的 HEVC over RTMP 协议和 OBS 新加的、enhanced rtmp 定义的这个协议不兼容。

说回来我认为B站直播现在支持 HEVC 也只是凑巧因为用 SRT 协议推流的时候能推上去,并且现有的直播服务器系统支持它 (比如像 https://github.com/ossrs/srs ),并不是专门作为一个受支持的 use case 实现的。

Tested using FFmpeg as the RTMP server, and FFplay as the client.

目前我看 ffmpeg master branch 里还没有支持 enhanced rtmp,可能是他们还没发布出来或还没被合并。

@shugen002
Copy link
Member

shugen002 commented Mar 29, 2023

2023年3月29日 21点37分 OBS 29.1.0-beta1 HEVC over RTMP 推流侧B站成功,但播放端无法播放,CDN返回404
2023年4月12日 00点56分 OBS 29.1.0-beta3 HEVC over RTMP 推流侧B站成功,但播放端无法播放,CDN返回404

@cxumol
Copy link
Contributor

cxumol commented Mar 31, 2023

@Genteure
Copy link
Member

@cxumol 这是直接用 12 作为 HEVC 的 codec id 的,和 OBS 新加的、在 enhanced rtmp 里定义的不是同一个协议。

@Ricky2576
Copy link

支持加一 非常希望尽快采用高效编码节省空间占用 两块8T硬盘空间已经告急了

@MiKayule
Copy link
Author

MiKayule commented Apr 9, 2023

支持加一 非常希望尽快采用高效编码节省空间占用 两块8T硬盘空间已经告急了

@Ricky2576 这个issue讨论的是关于录播姬对HEVC直播流的支持的相关问题,和你的需求并不符合。录播姬的原理是从B站抓取直播流、简单处理后直接存储,并不会对进行重新编码,这意味着录播姬以高效编码保存录播的前提是主播以高效编码向B站推流,而目前真正以HEVC推流的主播其实是非常少见的。因此,即使录播姬支持了这个特性,除非你是在用录播姬录制自己的直播,或有能力要求主播改变推流配置,否则这其实并不能节约你的磁盘占用

@Ricky2576
Copy link

支持加一 非常希望尽快采用高效编码节省空间占用 两块8T硬盘空间已经告急了

@Ricky2576 这个issue讨论的是关于录播姬对HEVC直播流的支持的相关问题,和你的需求并不符合。录播姬的原理是从B站抓取直播流、简单处理后直接存储,并不会对进行重新编码,这意味着录播姬以高效编码保存录播的前提是主播以高效编码向B站推流,而目前真正以HEVC推流的主播其实是非常少见的。因此,即使录播姬支持了这个特性,除非你是在用录播姬录制自己的直播,或有能力要求主播改变推流配置,否则这其实并不能节约你的磁盘占用

感谢解释
我了解直播姬不会对视频重新编码 但是我的需求也不是要求直播姬进行重新编码 而同样是"采用高效编码"

  1. 关于空间占用:
    我通过对比带宽和流量间接估计进行过粗略对比 同一直播同分辨率的视频流 HEVC的码率会更低 压缩大约在三成到五成 包括没有二压的原画和1280P分辨率(即所谓的"超清pro")视频流
    编码压缩率确实对空间占用没有直接影响 但是叔叔为了节省带宽 会把采用高效编码的视频流的码率压到更低 包括直播和视频 包括av1(不是avc)和hevc的视频流
    而如果直播视频流的码率更低 那录制生成文件的空间占用自然会更小 所以 虽然我的需求之一"降低空间占用"不直接和"支持HEVC"相关 但是会从支持受益
  2. 关于需求
    我说"采用高效编码节省空间" 节省空间只是我期望从高效编码带来的益处中的一个 还有更多益处 比如节省带宽 比如新技术的生命周期 只是其他方面我不是特别急迫地需要 所以我并没有提及其他
    我提及节省空间 不是想将空间占用和高效编码混为一谈 而是描述我想要录播姬支持HEVC的原因
  3. 关于直播间支持HEVC情况
    我理解目前很少主播以HEVC推流 但是录制直播生成的视频时长通常较长 只要进行录制 在时间累计下三成的压缩率带来的影响也会很大 所以只要录播姬有支持 那么对已经采用hevc的直播间进行录制 就会有很大改善

@Airlwuqing
Copy link

1.HEVC直播问题
截止2023年7月20日,b站开播通过srt码,obs推流设置使用main的情况下,调用hvc1.1.2解码器(Nvidia RTX 3060Ti推流HEVC),Chrome不安装微软商店提供的HEVC视频拓展,可以观看直播无问题,但使用main10配置会调用hvc1.2.4解码器,需要安装HEVC视频拓展才可以观看。
Edge无论main或main10都需要安装HEVC视频拓展才能观看。
2.我个人使用HEVC推流 2560x1440 1.8mpbs码率 二次编码1/4 预设P6能获得比AVC编码更好的画质,希望能够添加HEVC录制功能

@Genteure
Copy link
Member

FLV codec 12 的可以用录播姬的原始数据模式录,直播服务器发的数据原样写到硬盘。

HLS FMP4 本身原生就支持 HEVC,录播姬之后加了 HLS 支持之后也自然直接就支持 HEVC。现在录 HLS 的话个人推荐是用 https://github.com/acgnhiki/blrec

自己直播自己录的情况强烈推荐使用直播软件自带的录制功能,效果绝对比从B站绕一圈好不知道多少倍。如果有其他限制无法在推流设备上录制,可以考虑自建直播服务器转发一下然后在转发服务器上另存一份文件,效果也会比从B站录要好。

@Airlwuqing
Copy link

我这边最近也通过其他信息渠道知晓了使用直播软件自带的录制功能,列如OBS既可以使用HEVC录制也可以使用直播编码器(直播预设),很方便也不吃配置,还能分大小和时间段进行分割文件.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

7 participants