FFmpeg」タグアーカイブ

FFmpegで連番画像から動画を作成する際のTIPS

FFmpegで連番画像から動画を作成する際のTIPSをまとめてみました。

※一部、過去記事と重複する内容もあります。

画像ファイルから動画ファイルを作成するコマンド

0001.png0002.png0003.png …という連番画像から動画ファイル(MP4)を作成するには以下のようなコマンドを実行します。

$ ffmpeg -i %04d.png -c:v libx264 output.mp4

%04d.pngの部分が連番画像ファイルを指定する部分になっています。

例えば、image_001.pngimage_002.pngimage_003.png …というファイル名になっている場合はimage_%03d.pngのような感じにします。

関連記事: アニメーションGIFの作り方

フレームレートの設定

オプションを指定していない場合、フレームレートが25fpsの動画ファイルが作成されます。変更したい場合は-rコマンドでフレームレートを設定してください。

$ ffmpeg -r 30 -i %04d.png -c:v libx264 output.mp4

画質の設定

動画の画質を設定する場合は-crfオプションを使います。デフォルトでは23になっています。画質を上げたい場合はより小さな値を、画質を下げたい(ファイルサイズを小さくしたい)場合はより大きな値を設定します。

$ ffmpeg -i %04d.png -c:v libx264 -crf 20 output.mp4

関連記事: FFmpegでYouTube向けにエンコード

ループの設定

動画を何周かループさせたい場合は-stream_loopオプションを使います。例えば、-stream_loop 2とすると、最初の1周分とあわせて同じ内容が3回表示される動画ファイルになります。

$ ffmpeg -stream_loop 2 -i %04d.png -c:v libx264 output.mp4

YouTubeなどのサイトにアップロードする場合

YouTubeなどの動画サイトにアップロードする場合は-pix_fmt yuv420pを付けないと正常に再生できない場合があります。アップロードしてみて、正常に再生できないようであれば、設定を見直してみてください。

$ ffmpeg -i %04d.png -c:v libx264 -pix_fmt yuv420p output.mp4

関連記事: FFmpegでYouTube向けにエンコード

FFmpegでYouTube向けにエンコード

FFmpegでYouTube向けにエンコードしたい場合は

$ ffmpeg -i input.avi -c:v libx264 -preset slow -crf 18 -c:a copy -pix_fmt yuv420p output.mkv

のようなコマンドでエンコードできます。

ポイントは-pix_fmt yuv420pの部分だと思います。-pix_fmt yuv420pのオプションを消してエンコードするとChroma subsamplingが4:4:4になるみたいです。ローカルPCでは正常に再生できますが、アップロードすると映像が乱れる場合があるようです。(YouTube以外でも動画アップロードに対応しているWebサービスでは-pix_fmt yuv420pのオプションを付けておいた方が良いみたいです。)

オプションについての簡単な説明

-c:v libx264は動画をx264でエンコードするという設定です。出力するファイルをoutput.mkvの代わりにoutput.mp4にする場合は、デフォルトでx264でエンコードの設定になるので省略できます。

-preset slowはエンコード速度に関する設定です。エンコードに時間を掛けてでも圧縮率を上げてファイルサイズを減らしたい場合はslow/slower/veryslowを使います。逆に少しでも短時間でエンコードを終わらせたい場合はmedium/fast/faster/veryfastを使います。

-crf 18の部分は動画のクオリティに関する部分になっています。画質を落としてでもファイルサイズを減らしたい場合は18より大きな値を設定します。逆に、ファイルサイズを増やして画質を上げたい場合は18より小さな値を設定します。

-c:a copyはオーディオについては再エンコードしないという設定です。AACで再エンコードしたい場合は-c:a aac -b:a 192kのような感じで設定します。(192kはオーディオのビットレートです。)

リンク

Encode/YouTube – FFmpeg
https://trac.ffmpeg.org/wiki/Encode/YouTube

FFmpegでボトムフィールドファーストのインターレース形式にエンコード

ボトムフィールドファーストでエンコード

FFmpegでBottom Field First(BFF)のInterlace形式のx264にエンコードする方法を調べてみました。

とりあえず自分の環境でうまくいったコマンドは次のような感じです。

$ ffmpeg -i input.avi -flags +ilme+ildct -top 0 -c:v libx264 -x264opts "interlaced=1:bff=1" -c:a copy output.mp4

-flags +ilme+ildct -top 0の設定を追加するとInterlaceでエンコードはできているようなのですが、Top Field First(TFF)になってしまうため-x264opts "interlaced=1:bff=1"も追加してみました。

+ilme+ildctのあたりも含めて、よく分かっていませんので、うまくいかない場合はいろいろ試してみてください。

トップフィールドファーストでエンコード

ちなみに、トップフィールドファーストでエンコードしたい場合は-top 0-top 1bff=1tff=1に変えるとエンコードできます。

$ ffmpeg -i input.avi -flags +ilme+ildct -top 1 -c:v libx264 -x264opts "interlaced=1:tff=1" -c:a copy output.mp4

Avidemux

GUIで操作したい場合はAvidemuxを使うのも便利です。

Video OutputMpeg4 AVC (x264)に設定して、InterlacedのオプションをTop Field FirstBottom Field Firstに設定します。Avidemuxは内部でFFmpegを使ってエンコードしているらしいですが、カット編集とかする場合はFFmpegを直接使うより便利な場合もあるかと思います。

リンク

FFmpeg-users – Interlaced x264
http://www.ffmpeg-archive.org/Interlaced-x264-td4675482.html

Avidemux – Main Page
http://fixounet.free.fr/avidemux/