如何将视频文件(例如 mpeg)转换为图像集合?
理想的答案将涵盖使用可用库的 C++ 和 Java,以及如何手动从视频文件中删除单个帧以获取某些常见的视频格式。
要无损提取所有帧,请使用
ffmpeg -i "$input_file" -f image2 "outdir/%05d.png"
如果您喜欢不同的输出格式,只需更改.png
; 默认情况下ffmpeg
会从扩展名推断文件类型。
该选项-f image2
告诉ffmpeg
写入一系列图像。"outdir/%05d.png"
给出一个文件名模式,在本例中为“ ” 5-digit frame number.png
。
如果您只想每秒提取n帧,请在. (我认为n可以是浮点数。)-r n
"$input_file"
如果您的视频是 Motion JPEG (mjpeg),请改用:
ffmpeg -i "$input_file" -vcodec copy -f image2 "outdir/%05d.jpg"
这会直接从视频流中解压缩帧,这样更快,并且显然使用更少的磁盘空间。
有关更多信息/其他选项,请参阅手册页或文档(搜索image2
)。
您可以使用ffmpeg和-vcodec png
. 例如,这会将 my_video.avi 转换为具有五位数字的帧:
ffmpeg -i my_video.avi -vcodec png 帧%05d.png
您还可能需要指定所需的帧速率和分辨率。您可以运行ffmpeg -codecs
以查看所有可用格式。
可能您可以apiexample.c
在 ffmpeg 的libavcodec
库中使用它,它可以让您看到如何轻松地将帧缓冲区编码到 mpeg 流中。
或者,您可以使用Gstreamer,它是一个更简洁的框架。
对于 Java,请尝试使用Java Media Framework。