gpt4 book ai didi

bash - 使用ffmpeg在间隔的第一帧每分钟生成缩略图

转载 作者:行者123 更新时间:2023-12-04 22:55:47 38 4
gpt4 key购买 nike

当然,分钟可能不同(例如 30 秒或 2 分钟),但问题的逻辑保持不变。我目前有三个解决方案,都有自己的缺点。

我的第一个解决方案使用 fps 选择,如下所示:

ffmpeg -i <input> -vf scale=320:-1,fps=1/60 "img%04d.jpg"

这会遍历视频一次,但是帧的选择不是每 60 秒的第一帧,而是它们的中间帧。这会在 0:30 处生成帧, 1:30 , 2:30 ... 等等。

我的第二个解决方案通过 bash 计算缩略图的数量,并使用 ss选项以手动查找缩略图并检索它:
#durRaw: interval in seconds (this case: 60)
#end: the end index for the number of thumbnails needed
for t in $(seq 0 $end)
do
local time=$(bc -l <<< "(( $t * $durRaw ))")
ffmpeg -i <input> -ss $time -vframes 1 -vf scale=320:-1 "img$(printf "%04d" $t).jpg"
done

这会产生准确的帧,但会读取过多的视频,因为它通常必须搜索整个视频 30-60 次才能生成必要的缩略图。

最后,我的第三个解决方案恰好是快速和准确的,但随着视频的进行,质量会下降(伪像将开始变得可见,文件大小下降到可比文件的 25% 左右)。我知道视频是按比例缩放的,但质量比我按比例下降的还要低。我用了 select过滤并将帧率计算输入其中:
getFrameRate() {
ffmpeg -i "$1" 2>&1 | sed -n "s/.*, \(.*\) fp.*/\1/p"
}
local fr=$(getFrameRate <input>)
local sel=$(bc -l <<< "(( $fr * $durRaw ))") #in actual code, sel is floored
ffmpeg -i <input> -vf "scale=320:-1,select='not(mod(n,$sel))',setpts='N/($fr*TB)'" "img%04d.jpg"

enter image description here

如果没有某种巨大的缺点,我似乎无法生成缩略图。由于我需要运行此视频的数量,解决方案 2(虽然是最佳的)需要数周才能真正完成对所有所需视频的处理。如果不涉及降级,解决方案 3 将是理想的,并且在线指南似乎都指向我尝试过的相同解决方案。简而言之,我需要能够合理快速地生成缩略图(也就是一次通过),而不会不合理地损失质量。

最佳答案

使用 -ss解决方案#2 在输入之前的参数( -i ),以便更快地读取输入。作为摘录:
ss前:

The input will be parsed using keyframes, which is very fast.


ss后:

Here, the input will be decoded (and discarded) until it reaches the position given by -ss. This will be done very slowly



https://trac.ffmpeg.org/wiki/Seeking

花费时间来生成从几分钟/小时到毫秒/秒的信息。

关于bash - 使用ffmpeg在间隔的第一帧每分钟生成缩略图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43163271/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com