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 选项,但是这样其实更慢了,我觉得更像是重编码了一样,虽然降低了分辨率,可是中间一定是有一个再转码的过程导致吃的损耗更多了
6428 次点击
所在节点    FFmpeg
54 条回复
1054850490
2023-06-12 10:00:44 +08:00
@zsxzy 19# 我尝试一下
1054850490
2023-06-12 10:03:31 +08:00
@SenseHu 5# 这个也试过,但是对于我来说,还是软解最快,ffmpeg 技术文档里面也解释了,硬解由于需要频繁和 GPU 显存交换,所以在某种时刻会更慢,比如对于低分辨率的情况下, 通常都是 CPU 赢,但是对于 8K av1 就吃力了,这方面得硬解
ttvast
2023-06-12 10:03:59 +08:00
为啥不用 intel 核显,不比 3080 快多了?
hello2090
2023-06-12 10:06:25 +08:00
@lisxour 为啥不能试试?如果下载是好的问题在合成阶段,运气好第一分钟就能看到坏的帧呢?你非要找个适合几百 T 文件的方法就为了解决也许很快能解决的问题?
hello2090
2023-06-12 10:07:51 +08:00
@lisxour 有没有损坏问楼主啊又不是我的问题
JeromeCui
2023-06-12 10:09:20 +08:00
拆成很多段,然后并发用 aws 的 lambda 来做解码校验
Jimmyisme
2023-06-12 10:13:14 +08:00
不是很懂,但是想知道为什么任何关于视频编解码的任务都是用 ffmpeg ?感觉网上有什么视频音频开源项目都绕不开
1054850490
2023-06-12 10:15:09 +08:00
@hello2090 24# 既然你追问,那我就说一下吧,这过程中不只是合成阶段,也发生在下载阶段,也出现在源服务器提供的源就有问题的,
1:合成阶段的情况大多是在移动的时候出现了错误,比如我合成完成后,自动移动到另一个盘的时候,发生了宕机,或者资源管理器停摆,导致文件破损,这种情况下产生的破损文件通常是头部没问题,但是尾部有问题
2:下载阶段的情况,由于的 aria2 多线程下载,我也采用了“等待次数过长不要丢弃片段”的选项,但是依旧不能阻止破损的发生,我也阅读了技术文档采用了各种方法,但是产生破损的文件是超级多原因的,我不能一并概述,
3:youtube 的源服务器提供的文件有损坏,有部分视频文件只要换一个分辨率就正常了,或者换一个编码(目前 youtube 有三个编码,avc vp9 av01 ),我筛查出来再重新替换就好了,这部分是无法避免的。

这些文可能有点混乱,主要还是我不太想描述太详细,太费脑子了,因为我说得再详细也并没有什么帮助,这些问题并不是从根源能解决的
1054850490
2023-06-12 10:17:35 +08:00
@ttvast 23# 硬解并没有快很多,如果你面对的是几十 T 级别的视频,你就不会觉得这点算力够用了,而且论解码器,那还得是 nvidia 的牛逼,intel 的只能说是解码全,这个全,并不是相对 nvidia 来说,只是很多的意思
ljsh093
2023-06-12 10:23:18 +08:00
不懂视频的问一嘴没有专门校验错误的指令或者程序吗?
hikigaya58
2023-06-12 10:36:39 +08:00
YouTube 源文件有损坏?是指在网页播放视频就有问题吗?能不能给个例子?第一次听说这种情况。
laqow
2023-06-12 10:45:56 +08:00
如果存在问题合成的时候 ffmpeg 就会报错吧,它只是默认 skip warning ,可能是加-xerror 能让它遇到错误退出。如果有合成前的文件只重下片段不是方便的多。
如果只需要软解那就并行一下,有多少线程并行多少 ffmpeg ?
sl0000
2023-06-12 10:50:04 +08:00
换硬件治本
SenseHu
2023-06-12 10:53:48 +08:00
1. `ffmpeg 通常需要将解码后的帧从 GPU 内存复制到系统内存中`. 纯命令不知道有没有办法跳过这个复制过程,c++ 的 api 是有一个明确的复制函数调用的, 我写硬解的 demo 时用过.
2. 考虑一种充分利用资源的编排方式。一部分 cuda 解码, 一部分 intel qsv 解码, 一部分 d3d11va 解码, 一部分 CPU 解码
SenseHu
2023-06-12 10:56:28 +08:00
> '合成阶段的情况大多是在移动的时候出现了错误'
给合成好的文件就地生成个 md5, 移动的时候带着一起 ?
sl0000
2023-06-12 10:58:02 +08:00
可以试试 8 通道内存工作站 ECC DDR4 3200:25.6 GB/s*8 即 200GB/s
JusticeLanding
2023-06-12 11:37:35 +08:00
我们做的播放器,有改造 ffmpeg ,解码过程中把错误帧、坏帧发现不送去渲染,达到丢帧显示不花屏的效果。
JusticeLanding
2023-06-12 11:38:38 +08:00
另外在研究解码效率,正在做降采样解码,一种是解码完的 YUV 降采样,另外一种是 DCT 降采样。
Jakarta
2023-06-12 13:09:22 +08:00
既然 gpu 硬件做不到加速解码,那干脆以后“硬件加速”改名叫“硬件减速”好了。

我的建议是检查确认自己使用的 gpu 加速命令是否有误。
Jakarta
2023-06-12 13:13:18 +08:00
没有经过充分测试,但我用-hwaccel cuda -hwaccel_output_format cuda 代替你的指令中的-hwaccel none ,使用显卡加速后,同一个视频的解码速度从 15x 提高到了 50x 。

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

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

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

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

© 2021 V2EX