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