ffmpegで動画の切り取りやリサイズ・静止画変換・フレーム補間するコマンドのメモ
ffmpeg(エフエフエムペグ)を使って、動画ファイルを処理する方法をいくつか調べてみました。
ffmpegはコマンドラインで使用することができる動画処理関連のフリーのプログラムです。
wikipedia
FFmpeg
FFmpeg(エフエフエムペグ)は動画と音声を変換することのできるUNIX系OS生まれのフリーソフトウェアであり、コマンドラインから使用することができる。対応コーデックが多く、多彩なオプションを使用可能なため、幅広く利用されている。
今回調べてたのは次のような動画処理です。
- 動画の情報を取得する
- 動画を静止画に切り出す
- 動画の指定時間を切り出す
- 動画の画面サイズを変更する
- フレームレートを擬似的に増やす(フレーム補間)
ffmpegで出来ることは多岐に亘りますので、今回は上記の使い方に絞って、コマンドの解説をまとめてみたいと思います。
目次
ffmpegで動画の情報を取得する(動画の幅や高さなど)
まずは、動画の情報を取得してみたいと思います。情報の取得にはffprobe
を使います。以下の例では、動画ファイルinputMovie.mp4
の情報を取得しているコマンドです。
コマンドの基本的な操作方法については別の記事をご覧ください。
1 | $ ffprobe inputMovie.mp4 |
コマンドを実行すると動画ファイルの長さやビットレートが確認できます。
1 | $ ffprobe inputMovie.mp4 |
少し感覚的ではないので、JSON形式で一部の情報を取得してみます。以下のコマンドの例では、動画の幅や高さが含まれているstreams
という情報のみを表示させています。
1 | $ ffprobe -show_streams -print_format json inputMovie.mp4 |
コマンドを実行すると、返ってくるJSONのstreams
の中に、width
(動画の幅)とheight
(高さ)が含まれています。
1 | $ ffprobe -show_streams -print_format json inputMovie.mp4 |
ffmpegで動画を静止画として切り出す
動画ファイルはパラパラアニメのように何枚かの画像で出来ています。
そこで、動画を何枚かの画像に変換するコマンドを調べてみました。以下の例では、動画ファイルinputMovie.mov
を0〜30秒の間で静止画に変換しているコマンドです。
1 | $ ffmpeg \ |
コマンドが長くなるので改行していますが、各オプションは次の通りです。
オプション | 説明 |
---|---|
-i | 入力ファイルの指定 |
-ss | 静止画に変換したい、動画の再生開始位置(秒) |
-t | 静止画に変換したい、動画の長さ(秒) |
-f | 変換フォーマットの指定。今回は画像ですのでimage2 を指定します |
-vcodec | コーデックの指定。今回はMotion JPEGにエンコードしたいのでmjpeg を指定します。PNGの場合はpng を指定します |
-qscale | JPEG画像の品質。値が低いほど高画質になる。-qscale 1 の他に-q:v 0 というオプション指定もあるのですが、-qscale の方が画質が良いようです |
-r | 切り出したい画像の1秒あたりの枚数(フレームレート) |
%06d.jpg | 書き出すファイル名の指定。%06d.jpg と指定すると6桁の連番画像ファイルが生成される |
ffmpegで動画の指定時間を切り出す(カット)
続いて、動画ファイルの指定した区間を切り出す(カット)コマンドを試してみたいと思います。
以下の例は、動画ファイルinputMovie.mp4
を0〜30秒の間でカットし、outputMovie.mp4
に出力するコマンドです。
1 | $ ffmpeg \ |
コマンドが長くなるので改行していますが、各オプションは次の通りです。
オプション | 説明 |
---|---|
-ss | 切り出したい、動画の再生開始位置(秒) |
-i | 入力ファイルの指定 |
-t | 切り出したい、動画の長さ(秒) |
-q:v | JPEG画像の品質(1〜32)。値が低いほど高画質になる。 |
-r | 切り出したい画像の1秒あたりの枚数(フレームレート) |
また、オプションの指定位置によって処理内容が変化するので注意が必要です。
ffmpegで動画の画面サイズを変更する(リサイズ)
動画ファイルの画面サイズを変更するコマンドを試してみたいと思います。
以下の例は、動画ファイルinputMovie.mp4
を幅1920px、高さ1080pxにリサイズし、最後にoutputMovie.mp4
に出力するコマンドです。
1 | $ ffmpeg \ |
コマンドが長くなるので改行していますが、各オプションは次の通りです。
オプション | 説明 |
---|---|
-i | 入力ファイルの指定 |
-vf | エフェクトの内容を指定(後述) |
-c:v | 動画のコーデックの指定 |
-q:v | JPEG画像の品質(1〜32)。値が低いほど高画質になる |
vfオプションはエフェクトを指定する
-vf
オプションは動画に処理したいエフェクトを指定します。今回は
リサイズの指定(
scale
)幅と高さを指定
パッドの指定(
pad
)動画の表示領域と背景領域の大きさと位置やカラーを指定
上記の2つを指定しています。-vf
オプションにはその他、様々なエフェクトを指定することができます。
ffmpegでリサイズとカットを同時に行う
前述の項目で紹介した
- 切り取り
- リサイズ
のコマンドを1つのコマンドで行うこともできます。
1 | $ ffmpeg \ |
ffmpegで音声を無効にしたり上書きする
コマンドの解説は前項でご紹介したものを、ほぼそのまま使っていますが、一部違うものも追加してみました。
オプション | 説明 |
---|---|
-an | 音声を無効にする |
-y | 確認なしに出力ファイルを上書きする |
上記のようなオプションを指定すると音声をカットしたり、上書きをスムーズに行うことができます。
ffmpegでフレームを補間する(フレームを増やす)
動画ファイルのフレームレートを変更するコマンドを試してみたいと思います。
以下の例は、動画ファイルinputMovie.mp4
を30fpsから60fpsにフレーム補間し、最後にoutputMovie.mp4
に出力するコマンドです。
1 | $ ffmpeg \ |
コマンドが長くなるので改行していますが、各オプションは次の通りです。
オプション | 説明 |
---|---|
-i | 入力ファイルの指定 |
-vf | エフェクトの内容を指定(後述) |
-c:v | 動画のコーデックの指定 |
-q:v | JPEG画像の品質(1〜32)。値が低いほど高画質になる |
ffmpegでフレーム補間するオプション minterpolate
ffmpegで60fpsにフレーム補間するには-vf "minterpolate=60"
を指定します。
その他のフレーム補間のオプションは、かなり複雑なのですが、以下の記事で解説されているような内容を指定することができます。
ニコラボ
ffmpeg でフレーム補間する minterpolate
minterpolateオプションによるフレーム補間について詳しく解説されています。
注意点としては、ffmpegのフレーム補間処理は非常に時間が掛かるので覚悟が必要です。
私の端末では30秒、30fpsの4K動画で60fpsのフレーム補間するために2時間かかりました(^^;)恐らく30fpsから120fpsに補間するのには8時間かかるかと思います。動画のサイズが小さければ、補間の処理時間も短くなりそうですが、かなり負荷が高いですね…。
ffmpeg -vf minterpolateで発生するエラー
また、一部の動画でフレーム補間を行おうとすると、以下のようなエラーが表示される事がありました。
1 | $ ffmpeg -i inputMovie.mp4 -vf "minterpolate=60:2:0:1:8:16:32:0:1:5" -c:v mpeg4 -q:v 1 outputMovie.mp4 |
手元のSony α7RIIの4K QFHD(3840x2160) 100p
で撮影した動画で、上記のようなエラーが発生しました。
こういったケースでは一度、前述したようなリサイズ処理を行った後で、改めてフレーム補間を行ってみると上手くいきました(パッドに原因があるようですが、詳細は不明)。
ということで
今回はffmpegで以下のような処理を備忘録としてまとめてみました。
- 動画ファイルの切り取り(カット)
- 幅や高さの変換(リサイズ)
- 動画を静止画に切り出す処理
- フレーム補間する
ffmpegはコマンドラインで使用することができる動画処理関連のフリーのプログラムですが、できる事が多岐に渡ります。今回は個人的によく使う機能だけをまとめてみました。
同様の処理について動画変換されたい方の参考になりましたら幸いです。