使用ffmpeg / mencoder / transcode等转储视频文件的最后一帧。人

时间:2011-03-09 15:48:45

标签: ffmpeg imagemagick transcoding mencoder video-editing

我想抓取视频中的最后帧(.mpg.avi,无论如何)并将其转储到图像文件中.jpg.png,等等。工具链是一个现代的Linux 命令行,所以像mencodertranscodeffmpeg& c。

干杯, 鲍勃。

5 个答案:

答案 0 :(得分:21)

这不是一个完整的解决方案,但它会指引你沿着正确的道路前进。

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

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

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

答案 1 :(得分:3)

我无法让尼尔森的解决方案奏效。这对我有用。 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

答案 2 :(得分:2)

我有一个 mp4 / h264 matroska输入视频文件。以上解决方案均不适合我。 (尽管我确定它们适用于其他文件格式)。

结合samrad's answer abovethis great answer并提出this working code

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

答案 3 :(得分:1)

我没有看到的一件事是,如果文件包含dupes,则可以关闭预期的帧数。如果你的帧计数方法导致你的图像提取命令空了,那么这可能就是它的错误。

我开发了一个简短的脚本来解决这个问题。它已发布here

答案 4 :(得分:0)

我发现必须添加-vsycn 2才能使其可靠运行。这是我使用的完整命令:

ffmpeg -y -sseof -3 -i $file -vsync 2 -update 1 -vf scale=640:480 -q:v 1 /tmp/test.jpg

如果您写入NFS文件夹,则结果将非常不一致。因此,我写入/tmp,然后在完成后复制文件。如果没有完成,我将在进程ID上执行kill -9