【发布时间】:2011-07-12 00:30:51
【问题描述】:
我想抓取视频中的最后一个帧(.mpg、.avi 等)并将其转储到图像文件中(.jpg、.png 等) )。工具链是现代 Linux 命令行,所以像mencoder、transcode、ffmpeg 等。
干杯, 鲍勃。
【问题讨论】:
标签: ffmpeg imagemagick transcoding mencoder video-editing
我想抓取视频中的最后一个帧(.mpg、.avi 等)并将其转储到图像文件中(.jpg、.png 等) )。工具链是现代 Linux 命令行,所以像mencoder、transcode、ffmpeg 等。
干杯, 鲍勃。
【问题讨论】:
标签: ffmpeg imagemagick transcoding mencoder video-editing
这不是一个完整的解决方案,但它会为您指明正确的道路。
使用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'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
【讨论】:
我无法让 Nelson 的解决方案发挥作用。这对我有用。 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
【讨论】:
grep、head 或cut。 Just use ffprobe.
我没有看到提到的一件事是,如果文件包含欺骗,则预期的帧数可能会关闭。如果您的计算帧数的方法导致您的图像提取命令返回为空,那么这可能就是问题所在。
我开发了一个简短的脚本来解决这个问题。它发布在here。
【讨论】:
我发现我必须添加-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。
【讨论】:
scale=640:480。