使用 FFMPEG 将所有视频帧提取为图像

Posted

技术标签:

【中文标题】使用 FFMPEG 将所有视频帧提取为图像【英文标题】:Extract all video frames as images with FFMPEG 【发布时间】:2016-04-19 14:33:40 【问题描述】:

我正在尝试使用 FFMPEG 将 MP4 视频文件转换为一系列 jpg 图像(out-1.jpg、out-2.jpg 等),

mkdir frames
ffmpeg -i "%1" -r 1 frames/out-%03d.jpg

但是我不断收到类似的错误,

[image2 @ 00000037f5a811a0] 无法打开文件: 帧/输出-C:\Applications\FFMPEG\toGIF.bat3d.jpg av_interleaved_write_frame():输入/输出错误帧= 1 fps=0.0 q=5.9 Lsize=N/A 时间=00:00:01.00 比特率=N/A 视频:63kB 音频:0kB 字幕:0kB 其他流:0kB 全局标题:0kB 复用开销: 未知 转换失败!

如果我取出 %03d 部分,转换工作,但它只输出第一帧,程序因错误而停止。

如何使用 FFMPEG 正确提取视频的所有帧?

【问题讨论】:

【参考方案1】:

使用

ffmpeg -i "%1" frames/out-%03d.jpg

图像文件序列没有帧率。如果要对视频文件进行欠采样,请在输入前使用-r

编辑

ffmpeg -i "C:\Applications\FFMPEG\aa.mp4" "frames/out-%03d.jpg"

【讨论】:

好吧终于找到问题了,看来windows需要%%,如out-%%03d.jpg 是的,它是一个 Windows .bat 文件 是的,在脚本中,您需要转义特殊字符。 我怎样才能得到帧为 .h264 ? 到change framerate-i之前,输入-framerate。要在-i 之后指定输出的帧率,请输入-r【参考方案2】:

%04d 将生成 4 位数字的图像名称,如 0001、0002 等。而 %03d 将生成名称为 001、002 等的图像。

【讨论】:

【参考方案3】:

试试:

ffmpeg -i file.mpg -r 1/1 $filename%03d.bmp

ffmpeg\ffmpeg -i file.mpg test\thumb%04d.jpg -hide_banner

注意:

    要在-i 之前更改帧率,请输入-framerate。要在-i 之后指定输出的帧率,请输入-r -filter:v -fps=fps=...-vf fps=...-r 更准确

例如。

ffmpeg -i myvideo.avi -vf fps=<NO. of images>/<per no. of seconds> img%0<padding No. of digits>d.jpg

【讨论】:

%04d 和 %03d 有什么区别? %04d -> 4 位(0000、0001、0002 等)%03d -> 3 位(000、001、002 等)。 @CristianSepulveda:您的问题的答案在提供的代码示例中:“-vf fps=NO. of images>/per no. of seconds> img%0padding No. of digits>d.jpg ”。干得好 JavDomGom【参考方案4】:

不可能在 Windows 批处理文件中执行,因为每个 %x 都被解释为传递给批处理文件的参数

【讨论】:

“不可能”是一个如此苛刻的词......很容易克服:用另一个% 逃避%%%x 有效(因为提问者已经发现7 years ago)。

以上是关于使用 FFMPEG 将所有视频帧提取为图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 ffmpeg 实现 MP4 与 GIF 的互转

如何映射用ffmpeg和视频字幕提取的帧? (帧精度问题)

前端视频帧提取 ffmpeg + Webassembly

FFmpeg 跳过渲染帧

ffmpeg4版本,提取视频帧保存成ppm图片

ffmpeg4版本,提取视频帧保存成ppm图片