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

发布于 2024-10-21 05:05:42 字数 242 浏览 10 评论 0原文

我想抓取视频中的最后帧(.mpg.avi等)并将其转储到图像文件中( .jpg.png 等等)。 Toolchain 是一个现代 Linux 命令行,例如 mencodertranscodeffmpeg 和 c。

干杯, 鲍勃.

I'd like to grab the last frame in a video (.mpg, .avi, whatever) and dump it into an image file (.jpg, .png, whatever). Toolchain is a modern Linux command-line, so things like mencoder, transcode, ffmpeg &c.

Cheers,
Bob.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

套路撩心 2024-10-28 05:05:42

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

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

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

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

This isn't a complete solution, but it'll point you along the right path.

Use ffprobe -show_streams IN.AVI to get the number of frames in the video input. Then

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

where LAST_FRAME_INDEX is the number of frames less one (frames are zero-indexed), will output the last frame.

若言繁花未落 2024-10-28 05:05:42

我有一个 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

I have a mp4 / h264 matroska input video file. And none of the above solutions worked for me. (Although I sure they work for other file formats).

Combining samrad's answer above and also this great answer and came up with 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
ゝ杯具 2024-10-28 05:05:42

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

我开发了一个简短的脚本来解决这个问题。它发布在这里< /a>.

One thing I have not seen mentioned is that the expected frame count can be off if the file contains dupes. If your method of counting frames is causing your image extraction command to come back empty, this might be what is mucking it up.

I have developed a short script to work around this problem. It is posted here.

鹤仙姿 2024-10-28 05:05:42

我无法让纳尔逊的解决方案发挥作用。这对我有用。
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

I couldn't get Nelson's solution to work. This worked for me.
https://gist.github.com/samelie/32ecbdd99e07b9d8806f

EDIT (just in case the link disappears, here is the 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
∞觅青森が 2024-10-28 05:05:42

我发现我必须添加 -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

I found that I had to add -vsycn 2 to get it to work reliably. Here's the full command I use:

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

If you write to a NFS folder then the results will be very inconsistent. So I write to /tmp then copy the file once done. If it is not done, I do a kill -9 on the process ID.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文