ffmpegの使い方やコマンド一覧をまとめました。ffmpegでは、動画ファイルの切り取り、幅や高さの変換(リサイズ)、動画を静止画に切り出す処理、フレーム補間などの様々な処理ができます。
活用例の一例になりますが、私の場合は次のような動画の編集作業でffmpegを活用しています。
Youtube用の動画素材を撮影する際に、最後の数秒内に採用素材なのか不採用なのかを見分ける信号を入れています。PCからは動画ファイルの冒頭のイメージしか、通常は確認できませんが、ffmpegコマンドによって、動画末尾の静止画を切り出すことで、サムネイル画像から採用・不採用の動画なのかを短時間で判断できるようになりました。
このように、繰り返し同じ作業や工程を踏むものがあれば、ffmpegを使って一瞬で処理することができます。動画処理を半自動的に進めたり、作業時間を大幅に短縮できる効果が期待できます。
当記事では、よく使うであろう使用コマンド例の一例をまとめましたので、ffmpegを使って、動画ファイルを処理する方法を調べたい時の参考になりましたら幸いです。それでは順番に見ていきましょう!
目次
ffmpegとは?何ができるの?
ffmpeg(エフエフエムペグ)は、コマンドラインで使用することができる動画処理関連のフリーのプログラムです。
wikipedia
FFmpeg
FFmpeg(エフエフエムペグ)は動画と音声を変換することのできるUNIX系OS生まれのフリーソフトウェアであり、コマンドラインから使用することができる。対応コーデックが多く、多彩なオプションを使用可能なため、幅広く利用されている。
今回調べたのは次のような動画処理です。
- 動画の情報を取得する
- 動画を静止画に切り出す
- 動画の指定時間を切り出す
- 動画の画面サイズを変更する
- フレームレートを擬似的に増やす(フレーム補間)
ffmpegで出来ることは多岐に亘りますので、今回は上記の使い方に絞って、コマンドの解説をまとめてみたいと思います。
ffmpegのインストール方法
ffmpegのダウンロードとインストールはMac OSXでしたらHomebrewでインストールができます。
コマンドの基本的な操作方法については別の記事をご覧ください。
Linuxでしたら、apt-getで追加できるようです。詳しくはQiitaの記事が参考になります。Windowsの場合はFFmpegの本家サイトにあるGet the packagesでWindowsを選択した後に表示されるWindows Buildsのリンクから入手できます。
動画の画面サイズを変更する(リサイズ)
動画ファイルの画面サイズを変更するコマンドを試してみたいと思います。
以下の例は、動画ファイルinputMovie.mp4
を幅1920px、高さ1080pxにリサイズし、最後にoutputMovie.mp4
に出力するコマンドです。
bash1 2 3 4 5 6
| $ ffmpeg \ -i inputMovie.mp4 \ -vf "scale=1920:1080,pad=1920:1080:0:0:black" \ -c:v mpeg4 \ -q:v 1 \ outputMovie.mp4
|
コマンドが長くなるので改行していますが、各オプションは次の通りです。
オプション | 説明 |
-i | 入力ファイルの指定 |
-vf | エフェクトの内容を指定(後述) |
-c:v | 動画のコーデックの指定 |
-q:v | JPEG画像の品質(1〜32)。値が低いほど高画質になる |
vfオプションはエフェクトを指定する
-vf
オプションは動画に処理したいエフェクトを指定します。今回は
上記の2つを指定しています。-vf
オプションにはその他、様々なエフェクトを指定することができます。
動画を静止画として切り出す
動画ファイルはパラパラアニメのように何枚かの画像で出来ています。
そこで、動画を何枚かの画像に変換するコマンドを調べてみました。以下の例では、動画ファイルinputMovie.mov
を0〜30秒の間で静止画に変換しているコマンドです。
bash1 2 3 4 5 6 7 8 9
| $ ffmpeg \ -i inputMovie.mov \ -ss 0 \ -t 30 \ -f image2 \ -vcodec mjpeg \ -qscale 1 -qmin 1 -qmax 1 \ -r 30 \ %06d.jpg
|
コマンドが長くなるので改行していますが、各オプションは次の通りです。
オプション | 説明 |
-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桁の連番画像ファイルが生成される |
動画の末尾(最後)から指定秒数を切り出したい時は、-ss
オプションではなく、-sseof
オプションを使い、マイナスの値を指定します。例えば、次のコマンドでは、動画ファイルinputMovie.mov
の後半の1秒前を静止画として切り出し、1枚の静止画を書き出すことができます。
bash1 2 3 4 5 6 7 8 9
| ffmpeg \ -sseof -1 \ -i inputMovie.mp4 \ -t 1 \ -f image2 \ -vcodec mjpeg \ -qscale 1 -qmin 1 -qmax 1 \ -r 1 \ %06d.jpg
|
動画の指定時間を切り出す(カット)
続いて、動画ファイルの指定した区間を切り出す(カット)コマンドを試してみたいと思います。
以下の例は、動画ファイルinputMovie.mp4
を0〜30秒の間でカットし、outputMovie.mp4
に出力するコマンドです。
bash1 2 3 4 5 6
| $ ffmpeg \ -ss 0 \ -i inputMovie.mp4 \ -t 10 \ -q:v 1 \ outputMovie.mp4
|
コマンドが長くなるので改行していますが、各オプションは次の通りです。
オプション | 説明 |
-ss | 切り出したい、動画の再生開始位置(秒) |
-i | 入力ファイルの指定 |
-t | 切り出したい、動画の長さ(秒) |
-q:v | JPEG画像の品質(1〜32)。値が低いほど高画質になる。 |
-r | 切り出したい画像の1秒あたりの枚数(フレームレート) |
また、オプションの指定位置によって処理内容が変化するので注意が必要です。
Qiita
FFmpegで素早く正確に動画をカットする自分的ベストプラクティス
動画に画像透かしを入れる
動画に画像透かし(ウォーターマーク)を重ねるには-vf
オプションにmovie=
やorverlay=
を指定します。
bash1 2 3 4
| $ ffmpeg \ -i inputMovie.mp4 \ -vf "movie=watermark.png [watermark];[in][watermark] overlay=main_w-overlay_w-50:main_h-overlay_h-50 [out]" \ outputMovie.mp4
|
例えば上記では透かし画像のwatermark.png
を右隅に配置できます。またoverlay=
によって、右隅から縦横50ピクセルのマージンを配置しています。左隅に配置したい時は下記のようになります。
動画の情報を取得する(幅や高さなど)
動画の情報を取得してみたいと思います。情報の取得にはffprobe
を使います。以下の例では、動画ファイルinputMovie.mp4
の情報を取得しているコマンドです。
bash1
| $ ffprobe inputMovie.mp4
|
コマンドを実行すると動画ファイルの長さやビットレートが確認できます。
bash1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| $ ffprobe inputMovie.mp4 ffprobe version 3.3.1 Copyright (c) 2007-2017 the FFmpeg developers built with Apple LLVM version 8.0.0 (clang-800.0.42.1) configuration: --prefix=/usr/local/Cellar/ffmpeg/3.3.1 --enable-shared --enable-pthreads --enable-gpl --enable-version3 --enable-hardcoded-tables --enable-avresample --cc=clang --host-cflags= --host-ldflags= --enable-libmp3lame --enable-libx264 --enable-libxvid --enable-opencl --disable-lzma --enable-vda libavutil 55. 58.100 / 55. 58.100 libavcodec 57. 89.100 / 57. 89.100 libavformat 57. 71.100 / 57. 71.100 libavdevice 57. 6.100 / 57. 6.100 libavfilter 6. 82.100 / 6. 82.100 libavresample 3. 5. 0 / 3. 5. 0 libswscale 4. 6.100 / 4. 6.100 libswresample 2. 7.100 / 2. 7.100 libpostproc 54. 5.100 / 54. 5.100 Input Metadata: major_brand : isom minor_version : 512 compatible_brands: isomiso2mp41 encoder : Lavf57.71.100 Duration: 00:00:37.00, start: 0.000000, bitrate: 100470 kb/s Stream Metadata: handler_name : VideoHandler
|
少し感覚的ではないので、JSON形式で一部の情報を取得してみます。以下のコマンドの例では、動画の幅や高さが含まれているstreams
という情報のみを表示させています。
bash1
| $ ffprobe -show_streams -print_format json inputMovie.mp4
|
コマンドを実行すると、返ってくるJSONのstreams
の中に、width
(動画の幅)とheight
(高さ)が含まれています。
bash1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| $ ffprobe -show_streams -print_format json inputMovie.mp4 (略) "streams": [ { "index": 0, "codec_name": "mpeg4", "codec_long_name": "MPEG-4 part 2", "profile": "Simple Profile", "codec_type": "video", "codec_time_base": "1001/30000", "codec_tag_string": "mp4v", "codec_tag": "0x7634706d", "width": 3840, "height": 2160, "coded_width": 3840, "coded_height": 2160, "has_b_frames": 0, "sample_aspect_ratio": "1:1", "display_aspect_ratio": "16:9", "pix_fmt": "yuv420p", "level": 1, "chroma_location": "left", "refs": 1, "quarter_sample": "false", "divx_packed": "false", "r_frame_rate": "30000/1001", "avg_frame_rate": "30000/1001", "time_base": "1/30000", "start_pts": 0, "start_time": "0.000000", "duration_ts": 1110120, "duration": "37.004000", "bit_rate": "100468987", "max_bit_rate": "100468987", "nb_frames": "1109", "disposition": { "default": 1, "dub": 0, "original": 0, "comment": 0, "lyrics": 0, "karaoke": 0, "forced": 0, "hearing_impaired": 0, "visual_impaired": 0, "clean_effects": 0, "attached_pic": 0, "timed_thumbnails": 0 }, "tags": { "language": "und", "handler_name": "VideoHandler" } } ]
|
ffmpegでリサイズとカットを同時に行う
前述の項目で紹介した
のコマンドを1つのコマンドで行うこともできます。
bash1 2 3 4 5 6 7 8 9 10
| $ ffmpeg \ -ss 0 \ -i inputMovie.mp4 \ -t 10 \ -vf "scale=3456:1944,pad=3456:1944:0:0:black" \ -c:v mpeg4 \ -q:v 1 \ -an \ -y \ outputMovie.mp4
|
ffmpegで音声を無効にしたり上書きする
コマンドの解説は前項でご紹介したものを、ほぼそのまま使っていますが、一部違うものも追加してみました。
オプション | 説明 |
-an | 音声を無効にする |
-y | 確認なしに出力ファイルを上書きする |
上記のようなオプションを指定すると音声をカットしたり、上書きをスムーズに行うことができます。
フレームレートを補間する
ffmpegでは、動画ファイルのフレームレートを変更したり、30fpsから60fpsにするなどのフレームレートを増やす事ができます。詳しい解説は別の記事で行っていますので、そちらをご覧ください。
動画を90度回転させる
ffmpegでは動画を90度や180度など、任意の方向へ回転させる事ができます。詳しい解説は別の記事で行っていますので、そちらをご覧ください。
今回はffmpegで以下のような処理を備忘録としてまとめてみました。
- 動画ファイルの切り取り(カット)
- 幅や高さの変換(リサイズ)
- 動画を静止画に切り出す処理
- フレーム補間する
ffmpegはコマンドラインで使用することができる動画処理関連のフリーのプログラムですが、できる事が多岐に渡ります。今回は個人的によく使う機能だけをまとめてみました。
同様の処理について動画変換されたい方の参考になりましたら幸いです。