我想要提取视频(
.mpg
,.avi
或其他格式)中的最后一帧并将其转储到图像文件(.jpg
,.png
或其他格式)中。使用的工具链是现代Linux 命令行,例如mencoder
,transcode
,ffmpeg
&c.
祝好, 鲍勃。
.mpg
,.avi
或其他格式)中的最后一帧并将其转储到图像文件(.jpg
,.png
或其他格式)中。使用的工具链是现代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是帧数减1时(帧从0开始编号),将输出最后一帧。
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
#!/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
我看到没有人提到一个问题,如果文件中有重复帧,那么预期的帧数可能会出错。如果您计算帧数的方法导致图像提取命令返回空值,那么这可能是问题所在。
为解决此问题,我编写了一个简短的脚本。可在这里找到。
-vsync 2
才能使其可靠地工作。这是我使用的完整命令:ffmpeg -y -sseof -3 -i $file -vsync 2 -update 1 -vf scale=640:480 -q:v 1 /tmp/test.jpg
/tmp
,然后在完成后复制文件。如果没有完成,我会对进程ID执行kill -9
。scale=640:480
。 - tommy.carstensen