ビデオ ファイル (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
」です。
1秒あたりnフレームのみを抽出する場合は、の後にオプションを追加します。( nは浮動小数点になる可能性があると思います。)-r n
"$input_file"
ビデオがMotionJPEG(mjpeg)の場合は、代わりに次を使用します。
ffmpeg -i "$input_file" -vcodec copy -f image2 "outdir/%05d.jpg"
これにより、ビデオストリームから直接フレームが解凍されます。これにより、より高速で、明らかに使用するディスク容量が少なくなります。
詳細/その他のオプションについては、マニュアルページまたはドキュメントを参照してください(を検索してくださいimage2
)。
ffmpegを使用してこれを行うことができます-vcodec png
。たとえば、これは my_video.avi を 5 桁の数字のフレームに変換します。
ffmpeg -i my_video.avi -vcodec png フレーム%05d.png
必要なフレームレートと解像度を指定する必要がある場合もあります。実行ffmpeg -codecs
して、使用可能なすべての形式を表示できます。
おそらくapiexample.c
、ffmpeg のlibavcodec
ライブラリ内で使用できます。これにより、フレーム バッファーを取得して mpeg ストリームで簡単にエンコードする方法を確認できます。
または、より優れたフレームワークであるGstreamerを使用することもできます。
Java の場合は、 Java Media Frameworkを使用してみてください。