前回の記事では、FFmpegのWindows 11へのインストール方法についてご紹介しました。
本記事では、FFmpegを使った動画ファイルの加工のやり方をご紹介します。
- 複数の動画ファイルを無劣化(再エンコードなし)で結合する
- 動画ファイルの形式を変換する(mp4への変換)
- 動画ファイルを圧縮する(サイズを軽くする)
また、動画ファイルのサイズをどれくらい軽くできたかというデータも示しておりますので、参考になりましたら幸いです。
実施環境
■ハードウェア環境
項目 | 情報 |
---|---|
OS | Windows 11 Home 64bit |
CPU | AMD Ryzen 9 5900HX |
メモリ | 16.0 GB LPDDR4X-4266 |
ストレージ | SSD:512 GB NVMe HFM512GD3JX013N |
スペックの詳細はこちらの記事に書いています。
■ソフトウェア環境
項目 | 備考 |
---|---|
FFmpeg | 公式サイトからダウンロード |
■検証に使用した動画ファイル
ファイル名 | サイズ | 再生時間 | 解像度 | フレームレート | データ速度 | 総ビットレート |
---|---|---|---|---|---|---|
01.mov | 2.03 GB | 23分42秒 | 1384×762 | 59.58 fps | 11956 kbps | 12160 kbps |
02.mov | 2.03 GB | 23分45秒 | 同上 | 59.49 fps | 11966 kbps | 12188 kbps |
03.mov | 1.97 GB | 23分44秒 | 同上 | 59.09 fps | 11603 kbps | 11819 kbps |
04.mov | 2.04 GB | 23分58秒 | 同上 | 56.25 fps | 11893 kbps | 12123 kbps |
合計/平均 | 8.07 GB | 1時間35分09秒 | 1384×762 | 58.60 fps | 11855 kbps | 12073 kbps |
ちなみに、動画ファイルの映像コーデックはH.264(MPEG-4 AVC part 10)、音声コーデックはMPEG AAC Audio (mp4a)です。
FFmpegを使う準備
FFmpegで動画ファイルの加工を行うために、まず以下の準備を行います。
- 加工する動画ファイルが入ったフォルダを作成する
- コマンドプロンプトのカレントディレクトリを動画ファイルが入ったフォルダに指定する
CUIの操作に慣れている方は、以下の説明は飛ばしていただいて大丈夫です。
以降の操作方法については、主にこちらの記事を参考にさせていただきました。
加工する動画ファイルが入ったフォルダを作成する
まずデスクトップにフォルダ「video」を作成し、その中に結合する動画ファイルを移動させます。
![](https://hontabisatori.com/wp-content/uploads/2023/03/2ac7f2d6dad038060972670aef3b4967.png)
フォルダを作成する場所や、フォルダ名は任意に決めていただいて大丈夫です。
コマンドプロンプトのカレントディレクトリを指定する
次に、コマンドプロンプトを開いて、カレントディレクトリを先ほど作成した動画ファイルの配置場所(videoフォルダ)に指定します。
まず、videoフォルダのアドレスバーのパスを選択してコピーします。
![](https://hontabisatori.com/wp-content/uploads/2023/03/ffmpeg-movie.jpg)
次に、コマンドプロンプトに「cd」と入力して、半角スペースを空けてから、コピーしたパスを張り付けます。
cd C:\(videoフォルダのパス)
Enterキーを押して実行すると、カレントディレクトリがvideoフォルダに移動します。
![](https://hontabisatori.com/wp-content/uploads/2023/03/ffmpeg-movie2-1.png)
これで結合する動画ファイルの準備は終了です。ここからFFmpegのコマンドを使っていきます。
動画ファイルの結合
複数の動画ファイルを無劣化で結合し、1つにまとめる方法をご紹介します。
今回は、「01.mov」「02.mov」「03.mov」「04.mov」という4つの動画ファイルを結合し、「output.mov」という動画ファイルを作成します。
まず、結合させたい順に並べた動画ファイルのリスト「filelist.txt」をテキストエディタで作成し、加工する動画ファイルと同じフォルダに保存します。
下の画像では「サクラエディタ」を使用していますが、Windowsの「メモ帳」でも問題ありません。
![](https://hontabisatori.com/wp-content/uploads/2023/03/929f1ae0ff372f50b13b24ff4bb5cd4c.png)
file '01.mov'
file '02.mov'
file '03.mov'
file '04.mov'
次に、コマンドプロンプトに以下のコマンドを打って実行します。
ffmpeg -f concat -i filelist.txt -c copy output.mov
上のコマンドは、「filelist.txt」に書かれた複数の動画ファイルを結合し、「output.mov」という1つ動画ファイルとして出力します。
それぞれのオプションの説明は、以下の通りです。
オプション | 説明 | 補足 |
---|---|---|
-f concat | 「-f 」で出力フォーマットを設定 | concatオプションを指定して、動画の結合を行う |
-i filelist.text | 「-i」で入力ファイルを設定 | 入力ファイルが記述されたfilelist.txtを指定 |
-c copy | 「-c」でコーデックを設定(「-codec」と同じ) | copyオプションを指定して、動画と音声を無劣化(再エンコードなし)でそのままコピーする |
output.mov | 出力ファイルを設定 | MOV形式の動画ファイル「output.mov」を指定 |
実行後は、元となる01.mov~04.movは削除されずにそのまま残り、output.movが新たに作成されます。
![](https://hontabisatori.com/wp-content/uploads/2023/03/d3aac80c97774276581e0cc45faa6d61.png)
私の環境では、20秒ほどで「output.mov」が作成されました。動画ファイルの結合については以上です。
参考
・【初心者講座】FFmpegの使い方:動画結合・切り出し・ダウンロード・圧縮・分割・音声抽出・字幕/無音追加
・FFmpeg
動画ファイルの形式変換
「output.mov」というmov形式の動画ファイルを、「output.mp4」というmp4形式の動画ファイルに変換するコマンドです。
ffmpeg -i output.mov output.mp4
オプション | 説明 | 補足 |
---|---|---|
-i output.mov | 「-i」で入力ファイルを設定 | mov形式の動画ファイル「output.mov」を指定 |
output.mp4 | 出力ファイルを設定 | mp4形式の動画ファイル「output.mp4」を指定 |
実行すると、以下のように「output.mp4」が新規作成されました。
![](https://hontabisatori.com/wp-content/uploads/2023/03/b12e3c0f194f3dac49a5b1f76f9bd00d.png)
- 実行すると、元のmov形式の動画ファイルが保持されたまま、mp4形式の動画ファイルが作成される
- 実行時間は19分、ファイルサイズの変化は8.62GB(.mov) → 1.29GB(.mp4)
- 動画を確認したところ、画質の劣化は全く気にならなかった
動画ファイルの形式変換については以上です。
動画ファイルの圧縮
今回は難しいことはあまり考えず、「とりあえず動画のファイルサイズを半分くらいにしたい」というときに便利な方法をご紹介します。
「output.mp4」という動画ファイルを、CRF値=30に指定して圧縮するコマンドです。
ffmpeg -i output.mp4 -crf 30 output_crf30.mp4
オプション | 説明 | 補足 |
---|---|---|
-i output.mp4 | 「-i」で入力ファイルを設定 | MP4形式の動画ファイル「output.mp4」を指定 |
-crf 30 | 「-crf」で品質固定モードによる動画品質の設定 | CRF値を30に指定してエンコードする |
output_crf30.mp4 | 出力ファイルを設定 | MP4形式の動画ファイル「output_crf30.mp4」を指定 |
実行すると、以下のように「output_crf30.mp4」が新規作成されました。
![](https://hontabisatori.com/wp-content/uploads/2023/03/f94f1106087fee196eb5309000a60459.png)
- 実行すると、元の動画ファイルが保持されたまま、圧縮された動画ファイルが新規作成される
- 実行時間は19分、ファイルサイズの変化は1.29GB(.mp4)→ 0.54GB (.mp4)
- 動画を確認したところ、画質の劣化はあまり気にならなかった
動画ファイルの圧縮については以上です。
どのくらい動画サイズを削減できるか
動画ファイルの結合・形式変換・圧縮後の各値は以下の通りです。
ファイル名 | サイズ | 再生時間 | 解像度 | フレームレート | データ速度 | 総ビットレート |
---|---|---|---|---|---|---|
01.mov~04.movの合計/平均 | 8.07 GB | 1時間35分09秒 | 1384×762 | 58.60 fps | 11855 kbps | 12073 kbps |
結合後(output.mov) | 8.03 GB | 1時間35分11秒 | 1384×762 | 58.60 fps | 11845 kbps | 12063 kbps |
MP4変換後(output.mp4) | 1.20 GB | 1時間35分11秒 | 1384×762 | 60.00 fps | 1665 kbps | 1793 kbps |
圧縮後(output_crf30.mp4) | 0.514 GB | 1時間35分11秒 | 1384×762 | 60.00 fps | 613 kbps | 741 kbps |
動画ファイルのコーデックは全て、映像コーデックはH.264(MPEG-4 AVC part 10)、音声コーデックはMPEG AAC Audio (mp4a)です。
上の表から、特に変化が大きかったファイルサイズ、データ速度(映像データのみのビットレート)、総ビットレート(映像データと音声データを合わせたビットレート)をグラフで表してみました。
![](https://hontabisatori.com/wp-content/uploads/2023/03/graph1-1.png)
結果として、ファイルサイズは結合前と比べて94%削減することができました。MOVからMP4への形式変換のところでかなり容量が削減されており、MP4の圧縮率が高いことが分かります。
「再エンコードなし(無劣化)でコピー」とは
FFmpegの「-c copy」は「動画と音声を再エンコードなしでそのままコピー」するオプションです。
たとえば、動画ファイルのカット編集(動画の切り取り)を行う場合は、編集後に動画全体を再エンコードする必要があります。
※「再エンコード」については、以下の記事をご参照ください。
▶動画の「再エンコード」とは?劣化との関係やコーデックの意味も解説
しかし、これだと編集と関係ない部分まで再エンコードにより圧縮されてしまうため、全体的に動画が劣化してしまいます。
そこで、再エンコードなしで動画を出力することで、劣化なしでカット編集を行うことができます。また、出力にかかる時間も大幅に短縮できます(動画をくっつけるだけなので)。
以上より、FFmpegの「-c copy」は、動画ファイルを結合する際に再エンコードを行わずにコピーをすることで、
- 動画の劣化を防ぐ
- 出力時間を短縮する
というメリットを得るためのオプションだといえます。
参考
・【AviUtl】動画を再圧縮なし(無劣化)で編集&エンコードする方法 | AviUtlの易しい使い方
CRF値とは
従来のコーデックでは、ビットレートを指定してエンコードする「ビットレート固定モード」が一般的でした。
一方で、H.264などでは動画の品質(画質)を指定してエンコードする「品質固定モード」があります。
品質固定モードでは、指定した品質でのエンコードが可能であるという利点がありますが、圧縮後のファイルサイズはエンコード後でないと分からないという問題点もあります。
こちらの記事によると、品質固定モードでの動画の品質はCRF値で設定し、値が小さいほど品質が良くなるとのことです。
品質固定モードでの動画品質の指定 -crf
動画品質の設定:tech.ckme.co.jp
-crf値で動画の品質を指定する。
小さい値ほど品質は良くなる。
コーデックにより、とれる値の範囲、デフォルト値は違い、また同じ数値でもコーデックにより結果が変わってくる。
FFmpegのWikiによると、H.264でエンコードする場合のCRF値について、次のような説明がありました。
The range of the CRF scale is 0–51, where 0 is lossless (for 8 bit only, for 10 bit use -qp 0), 23 is the default, and 51 is worst quality possible. A lower value generally leads to higher quality, and a subjectively sane range is 17–28. Consider 17 or 18 to be visually lossless or nearly so; it should look the same or nearly the same as the input but it isn’t technically lossless.
Encode/H.264 – FFmpeg
要点は以下の通りです。
- CRF値の範囲は0~51(デフォルトの値は23)
- 値が小さいほど品質が高くなる(0はロスレス、51は最も品質が悪い)
- 設定するとしたら17~28の値が妥当(17、18では視覚的な損失はほぼ無し)
また、CRF値とファイルサイズの関係については、以下のように書かれていました
The range is exponential, so increasing the CRF value +6 results in roughly half the bitrate / file size, while -6 leads to roughly twice the bitrate.
Encode/H.264 – FFmpeg
つまり、CRF値の範囲は指数関数的であるため、値を+6したときはファイルサイズは約半分になり、逆に-6したときは2倍になるそうです。
ただし、CRF値とファイルサイズとの関係は、コーデックの種類や入力の動画ファイルによっても変わってくるため、目安として考えておく必要があります。
参考
・動画品質の設定:tech.ckme.co.jp
・CRF Guide (Constant Rate Factor in x264, x265 and libvpx)
まとめ
以上、FFmpegを使って動画ファイルの結合・変換・圧縮するやり方をご紹介しました。
下の記事では、画像を編集できるフリーソフト「ImageMagick」のインストール方法をご紹介しています。
もしお時間があったら、覗いてみてください。
▶ 【ImageMagick】Windows11へのインストールのやり方
![えのきつね](https://hontabisatori.com/wp-content/uploads/2023/06/enokitsune_icon_240px-150x150.png)
最後まで読んでくださり、ありがとうございました!
(ご質問・ご要望はマシュマロからどうぞ)