我想抓取视频中的最后帧(.mpg
,.avi
,无论如何)并将其转储到图像文件中.jpg
,.png
,等等。工具链是一个现代的Linux 命令行,所以像mencoder
,transcode
,ffmpeg
& c。
干杯, 鲍勃。
答案 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 above和this 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
。