我想抓取视频中的最后一帧(.mpg
,.avi
等)并将其转储到图像文件中(.jpg
,.png
等)。Toolchain 是一个现代 Linux命令行,所以像mencoder
, transcode
, ffmpeg
&c 这样的东西。
干杯,鲍勃。
我想抓取视频中的最后一帧(.mpg
,.avi
等)并将其转储到图像文件中(.jpg
,.png
等)。Toolchain 是一个现代 Linux命令行,所以像mencoder
, transcode
, ffmpeg
&c 这样的东西。
干杯,鲍勃。
这不是一个完整的解决方案,但它会为您指明正确的道路。
用于ffprobe -show_streams IN.AVI
获取视频输入中的帧数。然后
ffmpeg -i IN.AVI -vf "select='eq(n,LAST_FRAME_INDEX)'" -vframes 1 LAST_FRAME.PNG
其中 LAST_FRAME_INDEX 是帧数减一(帧索引为零),将输出最后一帧。
我有一个mp4 / h264 matroska 输入视频文件。以上解决方案都不适合我。(尽管我确定它们适用于其他文件格式)。
结合上面samrad的答案和这个很好的答案,并提出了这个工作代码:
input_fn='output.mp4'
image_fn='output.png'
rm -f $image_fn
frame_count=`ffprobe -v error -count_frames -select_streams v:0 -show_entries stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 $input_fn`
ffmpeg -i $input_fn -vf "select='eq(n,$frame_count-1)'" -vframes 1 "$image_fn" 2> /dev/null
我无法让尼尔森的解决方案发挥作用。这对我有用。 https://gist.github.com/samelie/32ecbdd99e07b9d8806f
编辑(以防链接消失,这里是 shellscript-bobbogo):
#!/bin/bash
fn="$1"
of=`echo $1 | sed s/mp4/jpg/`
lf=`ffprobe -show_streams "$fn" 2> /dev/null | grep nb_frames | head -1 | cut -d \= -f 2`
rm -f "$of"
let "lf = $lf - 1"
ffmpeg -i $fn -vf select=\'eq\(n,$lf\) -vframes 1 $of
我没有看到提到的一件事是,如果文件包含重复项,则预期的帧数可能会关闭。如果您的计算帧数的方法导致您的图像提取命令返回空,这可能是它搞砸的原因。
我开发了一个简短的脚本来解决这个问题。它张贴在这里。
我发现我必须添加-vsycn 2
才能让它可靠地工作。这是我使用的完整命令:
ffmpeg -y -sseof -3 -i $file -vsync 2 -update 1 -vf scale=640:480 -q:v 1 /tmp/test.jpg
如果您写入 NFS 文件夹,则结果将非常不一致。所以我写信/tmp
然后在完成后复制文件。如果没有完成,我会kill -9
在进程 ID 上做一个。