如何用 ffmpeg 压分层可伸缩视频(SVC)啊

2021-05-27 09:42:35 +08:00
 fl2d

一个亲戚孩子的毕设需要用到的,本打算用 h.265 ,但昨天发了个贴,没人回。于是我想那就 h.264 吧。。

如果消耗了脑细胞,解决问题了我给您发个红包喝杯咖啡?

想把一个 4k/60p 视频压成 H.264 SVC 。

・不要 B 帧

・时间不用伸缩,所有层都是 60p

・base 层极低分辨率

・提供多个分辨率 /清晰度的层

ffmpeg 不太熟,而且关于 svc 的资料网上也很少,有知道怎么设 ffmpeg 参数的老兄么?

1383 次点击
所在节点    问与答
13 条回复
hello2060
2021-05-27 10:30:50 +08:00
首先你要确定能用 FFMPEG 压,H.264 fmpeg 有自带的 encoder, 也有用 X264 也就是 libx264.

最简单的,下载源码,找到那两个 encoder 的文件,看接受那些参数就行了。或者看看 x264 是否接受制定一个 svc 相关的 profile
minami
2021-05-27 10:55:59 +08:00
x264 不支持 svc,你需要用 openh264 。但我看了下 ffmpeg 关于 openh264 的文档,我建议你直接用 openh264,doge
fl2d
2021-05-27 11:09:59 +08:00
@hello2060 @minami
我是在网上的只言片语里,发现似乎 x264 不支持 svc,需要用 openh264 。
svc 资料真不多啊,说实话,openh264 的文档找了一圈都没找到。。。
minami
2021-05-27 11:14:12 +08:00
@fl2d 找不到是正常的,因为思科自己就没好好写文档。。。所有资料就是注释和 doxygen 文档
fl2d
2021-05-27 12:13:43 +08:00
@minami
这就不好整了🤦‍♂️
为啥建议直接用 openh264 而不是用 ffmpeg ?
minami
2021-05-27 12:30:52 +08:00
@fl2d #5 因为 ffmpeg 没有封装 SVC 相关参数,源码里面( libopenh264enc.c )也是写死的,你折腾这个要改源码,还不如直接用 openh264

源码 179 、180 行,写死了没有使用 SVC:
param.iTemporalLayerNum = 1;
param.iSpatialLayerNum = 1;
fl2d
2021-05-27 17:16:55 +08:00
@minami
那就是说,openh264 可以直接命令行来编解码视频?
完全找不到资料啊😢。。。你知道哪里能找到命令行操作的相关资料么?
minami
2021-05-27 17:42:21 +08:00
@fl2d 你去 openh264 的 github 页面,命令行操作的 demo 在 testbin 目录下,资源文件在 res 目录下。顺带一提上面说的 doxygen 文档就在 wiki 页面,里面有通过 API 调用的 demo
fl2d
2021-05-28 07:15:26 +08:00
@minami 非常感谢!!🙏 我研究一下!!
fl2d
2021-05-28 17:55:50 +08:00
@minami
testbin 里的例子跑通了。
尽管是唯一能找到的工具了,但是 openh264 对 svc 的支持相当不行啊。
比如,命令行只能解出来最高层,issue 里说用 c 倒是可以分开各层,但 spatial 层之间竟然是完全独立的。
fl2d
2021-05-29 17:09:52 +08:00
@minami
请问你了解 svt-av1/svt-vp9 么?
这个名字里有 svt,实际上支不支持 scalable video?
minami
2021-05-29 17:54:26 +08:00
@fl2d 据我所知 svt 的名字来源应该是 Intel 自家的 Xeon Scalable 产品线。支不支持 scalable video 是看编码器支持的标准内有没有 scalable 相关的东西。我们常说 x264 不支持 scalable video,是因为 x264 只支持 H264/AVC 标准,不支持 H264 的 Scalable Extension 即 SVC ; x265 只支持 HEVC 标准,不支持 HEVC 的 Scalable Extension 即 SHVC (顺便提一嘴,x265 也不支持 HEVC 的 Screen Content Coding Extensions 即 SCC,这个也是大痛点)。
根据 webrtc 的文档,VP8 、VP9 、AV1 标准的非扩展部分都已经有 scalable video ( VP8 只支持时间伸缩),所以完整实现标准的编码器都应该支持。就是说你拿 libvpx 就可以编了,不信可以看 libvpx 内的 examples/vp9_spatial_svc_encoder.c 。svt-vp9 你也可以去看看,大概率也是有的
不过恕我直言,SVC 这玩意之所以一直不温不火,确实是因为实际应用中没有什么用。。。。
fl2d
2021-05-30 11:15:32 +08:00
@minami
多谢!原来如此,是重名😂 查 svt 系列编解码器资料时,我也注意到 scalable 这个词常常被用在 cpu 上,我还纳闷儿呢。。
是想做增量传视频。我以前听过 svc 的概念,觉得直接把 svc 跑通了就可以把故事说成增量传输了,所以让亲戚孩子选了这个题目。然而万万没想到,找不到工具🤦‍♂️

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/779488

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX