17

我想抓取视频中的最后一帧(.mpg,.avi等)并将其转储到图像文件中(.jpg,.png等)。Toolchain 是一个现代 Linux命令行,所以像mencoder, transcode, ffmpeg&c 这样的东西。

干杯,鲍勃。

4

5 回答 5

23

这不是一个完整的解决方案,但它会为您指明正确的道路。

用于ffprobe -show_streams IN.AVI获取视频输入中的帧数。然后

ffmpeg -i IN.AVI -vf "select='eq(n,LAST_FRAME_INDEX)'" -vframes 1 LAST_FRAME.PNG

其中 LAST_FRAME_INDEX 是帧数减一(帧索引为零),将输出最后一帧。

于 2011-11-03T23:53:04.397 回答
3

我有一个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
于 2019-02-21T08:44:49.347 回答
2

我无法让尼尔森的解决方案发挥作用。这对我有用。 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
于 2015-02-18T09:51:09.667 回答
1

我没有看到提到的一件事是,如果文件包含重复项,则预期的帧数可能会关闭。如果您的计算帧数的方法导致您的图像提取命令返回空,这可能是它搞砸的原因。

我开发了一个简短的脚本来解决这个问题。它张贴在这里

于 2013-11-18T16:54:59.177 回答
1

我发现我必须添加-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 上做一个。

于 2020-08-19T19:24:01.777 回答