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 选项,但是这样其实更慢了,我觉得更像是重编码了一样,虽然降低了分辨率,可是中间一定是有一个再转码的过程导致吃的损耗更多了
6424 次点击
所在节点    FFmpeg
54 条回复
xeathen
2023-06-12 08:48:21 +08:00
不太了解但想知道答案
hello2090
2023-06-12 08:49:32 +08:00
很久没做这个了,你用下载器下载再合成?合成以后出现问题?那你查查合成哪里出问题不就行了,解决了以后就不会有问题了,不需要每个文件都这么搞一次啊

不知道你要求的要多快,光解码不播放挺快的吧,ffmpeg 提供选项每帧输出到一张图片,或者你试试能不能隔几帧生成一张?
wy315700
2023-06-12 08:50:40 +08:00
>某些解码器可以通过降低解码质量从而让低配机器也可以流畅播放高质量视频

应该用的方法是丢帧
sunxiaping521
2023-06-12 08:51:58 +08:00
你需要这个项目 https://github.com/ZLMediaKit/ZLMediaKit ,如果不想开发,可以调用对应的 REST API 接口,超级方便省事。
SenseHu
2023-06-12 08:55:31 +08:00
-hwaccel 试下 qsv, d3d11va, dxva2, linux 的话试下 vaapi
参考 https://ffmpeg.org/ffmpeg.html
lisxour
2023-06-12 09:24:26 +08:00
@hello2090 确实解决的思路就走歪了,每一帧每一帧查完全不现实,我要是下载了一个很大很长的 4k 视频,这么搞那不完犊子了。而且怎么定义一帧有没有损坏?有黑块?有雪花?还是解码报错才算?
newmlp
2023-06-12 09:27:56 +08:00
@wy315700 丢帧并不能加快解码速度
wy315700
2023-06-12 09:30:31 +08:00
@newmlp

丢帧为啥不能加快解码速度,把 B 帧都丢了速度能快不少吧
OblivionStaff
2023-06-12 09:34:41 +08:00
@wy315700 我咋记得解码 b 帧也必须依赖前一帧
OblivionStaff
2023-06-12 09:35:56 +08:00
我知道的唯一快速解码的方式是抽取 i 帧,但这样 i 帧之间的图像全没了
SenseHu
2023-06-12 09:40:47 +08:00
感觉思路歪了,
> 下载器下载的视频合成的时候总是出现破损的视频文件
应该要定位这个过程中哪里出了问题,
给个实际的案例看下是哪个操作步骤导致的破损,不一定原视频就有问题
minami
2023-06-12 09:49:20 +08:00
瓶颈在磁盘,上内存盘吧
MarginK
2023-06-12 09:53:23 +08:00
解码的本质就是解压缩,这似乎无关你的解码质量,而验证每一帧的完整性也是需要解码来验证的,否则其他一切都只是表面级别的验证,所以我觉得好像无解。
1054850490
2023-06-12 09:54:10 +08:00
@SenseHu 11#
@hello2090 2#
@lisxour 6#
思路没有歪,这并不是下载阶段可以避免的,首先第一个就是无法避免的就是服务器端提供的源文件就破损的,但是换一个分辨率就没事,这存在于 youtube 上,视频在某个分辨率无论你下载多少遍,就算在源页面播放都是破损的,但是换一个分辨率就正常了,其次,并不一定的花瓶,而是某个片段丢失,列如丢失片段在 1.30 秒到 1.35 秒处,播放到这里就会花屏,过了这个时间段才正常,为什么会出现这个问题呢?这也是多线程下载的缺点,源服务器并没有提供校验,所以我下载也并不能校验文件完整性,源视频是 100%有问题的,在我之前就发过帖子了,不会是我解码的问题,对于这个问题我不想过多的展开,因为我已经有相当多的案例了,已经确认视频确实是有问题,如果想在下载端解决这个问题,不显示,你哪怕跟我说以后下载都不怕没事了,我也得全部拆开看看是不是真的无损了
imoru
2023-06-12 09:55:35 +08:00
借楼问个问题,有办法提高 ffmpeg 生成 sprites 的速度吗?我试过无论用不用硬件加速,调小 fps 数值或者 scale 数值,消耗的时间几乎是固定的,很奇怪
ffmpeg -hwaccel auto -i demo.mp4 -vf "fps=1,scale=320:180,tile=15x15" demo-%02d.jpg -y
1054850490
2023-06-12 09:55:55 +08:00
@minami 12# 瓶颈不在于磁盘,我解码的时候读取硬盘才不到 50MB 每秒,远不如机械硬盘的 180MB 每秒( 8T 以上的硬盘读取是有这么高的)
1054850490
2023-06-12 09:57:17 +08:00
@MarginK 13# 我刚开始也这么想的,可是当我看到某些解码器可以通过降低质量来让低配置机器也可以播放 hevc 的时候,我就想,我是不是也可以这样,所以才来问问
1054850490
2023-06-12 09:58:35 +08:00
@hello2090 2# 你对于我视频的数量量级可能没什么概念,我现在收集的视频已经有 8W 多部了,视频大小高达 45TB
zsxzy
2023-06-12 09:59:56 +08:00
降低解码质量, 一般的做法就是丢掉 B 帧, 比如 ijkplayer 在低配手机就这样做
1054850490
2023-06-12 10:00:21 +08:00
@SenseHu 11# https://www.v2ex.com/t/919129#reply13
你可以看一下我这个帖子,里面详细说明了视频的情况

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

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

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

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

© 2021 V2EX