ffmpeg 如何加快解码速度?算力不变的情况下,不在乎解码质量

2023-06-12 08:41:03 +08:00
 1054850490
`ffmpeg -stats -hwaccel none -i "1.mp4" -map v -fps_mode cfr -stats_period 0.04 -f null -
`
如上述代码所示,如何在同等算力条件下,加快“解码”速度,注意,这里不是编码,是解码,而且据我测试,12490F 对比 3080 的解码器也快不过 CPU ,这是因为视频文件需要在显存和内存之间频繁交换,反而导致解码变慢了。虽然在 av01 以及 8K 的情况下比不过显卡的解码,但是 6 核的 12490f 已经是比 3080 的解码器快了,(虽然 3080 支持双路,单路性能限制一半,暂且按下不表),所以让我换显卡解码加快这个提议已经 pass 了

我为什么要这样做是因为,我需要一帧一帧拆开看看视频有没有损坏,因为我用下载器下载的视频合成的时候总是出现破损的视频文件,而用重封装查损并不适用于大多场景,所以还是回到最稳的一帧一帧的拆包看,可是这个方案还是太慢了,如果升级机器也不太现实,只能是寻求歪路子,我看到某些解码器可以通过降低解码质量从而让低配机器也可以流畅播放高质量视频的时候就在想,我是否也可以按照这个方法来?我问过 GPT ,但是 GPT 给出的答案是让我降低分辨率,也就是-s 1280p-720p 选项,但是这样其实更慢了,我觉得更像是重编码了一样,虽然降低了分辨率,可是中间一定是有一个再转码的过程导致吃的损耗更多了
6430 次点击
所在节点    FFmpeg
54 条回复
alz5113
2023-06-12 13:45:57 +08:00
如果是纯软解的话 可靠考虑自己重新编译 ffmpeg 针对当前 cpu 环境的选项都开上 ,优化选项开-O3 加上运行时 profile 优化
MrKrabs
2023-06-12 14:07:36 +08:00
我也有点这个需求
我的命令是
["-loglevel", "+level+warning", "-hide_banner", "-nostdin", "-i", "VOL_1.mkv", "-map", "0:v?", "-map", "0:a?", "-f", "null", "-"]
MrKrabs
2023-06-12 14:10:35 +08:00
硬解速度不如 cpu 解码结果也不靠谱也不知道会不会真的报错,我是不用的
zmcity
2023-06-12 16:51:11 +08:00
凭我的经验,软解不太可能在 12490F 上比 3080 的 nvcodec 快。
解码可调参数很少,纯软解的优化我能想到就是上面说的 dct 降采样,yuv2rgb 降采样,或者直接输出灰度视频。
然后就是直接调 api 提高一点性能,提高点灵活性,比如做个边下边解。
进一步判断是不是下载 /封装问题的话不需要解码,先读一下流,如果流有问题就不用解码了。
1054850490
2023-06-12 18:32:10 +08:00
@hikigaya58 31#
<amp-youtube data-videoid="UUrJ0bMsLCY" layout="responsive" width="480" height="270"></amp-youtube>在上面这个视频里,破损发生在 4k 分辨率,vp9 编码的,9.43 分处,这就是源就有问题的视频,更换一个分辨率就正常了,虽然只是缺了几秒
1054850490
2023-06-12 18:36:55 +08:00
@zmcity 44#我虽然没有 3080 ,但是我花钱让另一个拥有 3080 的人和我去解码同一批视频测试了解码速度,结果显示在低分辨率情况下是可以吊打 GPU 解码的,也就是 4k 以下的分辨率,8k vp9 以及 8K av1 就显得乏力了
1054850490
2023-06-12 18:38:59 +08:00
@zmcity 44# 另外,我不止是在下载阶段发生破损,还有很多其他方面发生破损,所以让我去解决下载以及合成这个阶段发生的破损并不适用于所有场景
1054850490
2023-06-12 18:42:22 +08:00
@Jakarta 39# 40# 我不知道你是什么 CPU ,但是我花钱让一个拥有 3080 的人去跟我测试同一批视频了,命令只是单独添加了-hwaccel cuda ,结果显示 4K 以下的分辨率是 CPU 胜出,而 8k vp9 av01 被摁着打,3080 解码 8k AV1 速率只是 1.45x ,而我 CPU 只是刚好徘徊在 1X ,而且 3080 这时候的解码占用也只有 60%,我查了一下,这是因为 3080 支持双路 8K AV1 ,所以并没有把解码吃光,而 3070 以下的卡并不支持双路 8k AV1
1054850490
2023-06-12 18:44:05 +08:00
@laqow 32# 这不失为一种方法,只是我遇到的破损并不只是下载合成阶段产生的,所以我需要寻找一个可靠的能够找出视频破损的招
ameizing
2023-06-12 19:59:14 +08:00
@1054850490 谷歌转码成 vp9 的时候,编码出错了吧。ffmpeg 是能识别出这种错误的。
bitdepth
2023-06-12 23:33:41 +08:00
FFmpeg 的 DMA buffer 支援有問題,還有是單一輕量行程的。用 Gstreamer 吧
kice
2023-06-13 09:49:55 +08:00
我感觉怎么解决视频合成会出现坏帧的问题收益更大。不过不清楚你坏帧是怎么坏。

或者就是你 GPU 解码然后 GPU 上查,这样就只是要折腾一波 GPU 程序。
1054850490
2023-06-13 16:17:39 +08:00
@kice 52# 因为我不只是一个下载器,网盘下载的呢?要知道百度网盘到现在都没有下载校检,这种闭源的我又该如何解决呢?我需求的是一整套的查损流程,而不是对下载进行纠错,因为有些下载器并不是我能够修改的
tangtang369
2023-06-20 11:43:32 +08:00
没有用过显卡的解码 你这个用的是带不带核显的 cpu 我试过 ffmpeg 用 intel 的核显大概能以 4 ~ 10 倍的速度解码视频文件 当然我在其他 arm 平台的 ai 盒子上也测出过 1080P 1000fps 没秒的解码

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

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

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

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

© 2021 V2EX