記事へのコメント・ご質問はこちらから。

【FFmpeg】動画の結合・変換・圧縮のやり方/再エンコードなし(無劣化)でコピーの意味とは

IT
【PR】本記事のリンクには広告が含まれています。

前回の記事では、FFmpegのWindows 11へのインストール方法についてご紹介しました。

本記事では、FFmpegを使った動画ファイルの加工のやり方をご紹介します。

  • 複数の動画ファイルを無劣化(再エンコードなし)で結合する
  • 動画ファイルの形式を変換する(mp4への変換)
  • 動画ファイルを圧縮する(サイズを軽くする)

 また、動画ファイルのサイズをどれくらい軽くできたかというデータも示しておりますので、参考になりましたら幸いです。

スポンサーリンク

実施環境

■ハードウェア環境

項目情報
OSWindows 11 Home 64bit
CPUAMD Ryzen 9 5900HX
メモリ16.0 GB LPDDR4X-4266
ストレージSSD:512 GB NVMe HFM512GD3JX013N
ASUS Zenbook 14(UM425QA)

スペックの詳細はこちらの記事に書いています。

■ソフトウェア環境

項目備考
FFmpeg公式サイトからダウンロード

■検証に使用した動画ファイル

ファイル名サイズ 再生時間解像度フレームレートデータ速度総ビットレート
01.mov2.03 GB23分42秒1384×76259.58 fps11956 kbps12160 kbps
02.mov2.03 GB23分45秒同上59.49 fps11966 kbps12188 kbps
03.mov1.97 GB23分44秒同上59.09 fps11603 kbps11819 kbps
04.mov2.04 GB23分58秒同上56.25 fps11893 kbps12123 kbps
合計/平均8.07 GB1時間35分09秒1384×76258.60 fps11855 kbps12073 kbps

ちなみに、動画ファイルの映像コーデックはH.264(MPEG-4 AVC part 10)、音声コーデックはMPEG AAC Audio (mp4a)です。

FFmpegを使う準備

FFmpegで動画ファイルの加工を行うために、まず以下の準備を行います。

  1. 加工する動画ファイルが入ったフォルダを作成する
  2. コマンドプロンプトのカレントディレクトリを動画ファイルが入ったフォルダに指定する

CUIの操作に慣れている方は、以下の説明は飛ばしていただいて大丈夫です。

以降の操作方法については、主にこちらの記事を参考にさせていただきました。

加工する動画ファイルが入ったフォルダを作成する

まずデスクトップにフォルダ「video」を作成し、その中に結合する動画ファイルを移動させます。

videoフォルダの中身

フォルダを作成する場所や、フォルダ名は任意に決めていただいて大丈夫です。

コマンドプロンプトのカレントディレクトリを指定する

次に、コマンドプロンプトを開いて、カレントディレクトリを先ほど作成した動画ファイルの配置場所(videoフォルダ)に指定します。

まず、videoフォルダのアドレスバーのパスを選択してコピーします。

エクスプローラのアドレスバーのパスをコピー

次に、コマンドプロンプトに「cd」と入力して、半角スペースを空けてから、コピーしたパスを張り付けます。

cd C:\(videoフォルダのパス)

Enterキーを押して実行すると、カレントディレクトリがvideoフォルダに移動します。

コマンドプロンプトの画面。cdコマンドでvideoフォルダに移動する。

これで結合する動画ファイルの準備は終了です。ここからFFmpegのコマンドを使っていきます。

動画ファイルの結合

複数の動画ファイルを無劣化で結合し、1つにまとめる方法をご紹介します。

今回は、「01.mov」「02.mov」「03.mov」「04.mov」という4つの動画ファイルを結合し、「output.mov」という動画ファイルを作成します。

まず、結合させたい順に並べた動画ファイルのリスト「filelist.txt」をテキストエディタで作成し、加工する動画ファイルと同じフォルダに保存します。

下の画像では「サクラエディタ」を使用していますが、Windowsの「メモ帳」でも問題ありません。

結合させたい動画のリスト(サクラエディタ)
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が新たに作成されます。

私の環境では、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」が新規作成されました。

コマンド実行後「output.mp4」が作成された
  • 実行すると、元の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」が新規作成されました。

  • 実行すると、元の動画ファイルが保持されたまま、圧縮された動画ファイルが新規作成される
  • 実行時間は19分、ファイルサイズの変化は1.29GB(.mp4)→ 0.54GB (.mp4)
  • 動画を確認したところ、画質の劣化はあまり気にならなかった

動画ファイルの圧縮については以上です。

参考
ffmpegで動画を軽くする方法 – ~廃材連盟~

どのくらい動画サイズを削減できるか

動画ファイルの結合・形式変換・圧縮後の各値は以下の通りです。

ファイル名サイズ 再生時間解像度フレームレートデータ速度総ビットレート
01.mov~04.movの合計/平均8.07 GB1時間35分09秒1384×76258.60 fps11855 kbps12073 kbps
結合後(output.mov)8.03 GB1時間35分11秒1384×76258.60 fps11845 kbps12063 kbps
MP4変換後(output.mp4)1.20 GB1時間35分11秒1384×76260.00 fps1665 kbps1793 kbps
圧縮後(output_crf30.mp4)0.514 GB1時間35分11秒1384×76260.00 fps613 kbps741 kbps

動画ファイルのコーデックは全て、映像コーデックはH.264(MPEG-4 AVC part 10)、音声コーデックはMPEG AAC Audio (mp4a)です。

上の表から、特に変化が大きかったファイルサイズ、データ速度(映像データのみのビットレート)、総ビットレート(映像データと音声データを合わせたビットレート)をグラフで表してみました。

各動画ファイルのパラメータの比較

結果として、ファイルサイズは結合前と比べて94%削減することができました。MOVからMP4への形式変換のところでかなり容量が削減されており、MP4の圧縮率が高いことが分かります。

「再エンコードなし(無劣化)でコピー」とは

FFmpegの「-c copy」は「動画と音声を再エンコードなしでそのままコピー」するオプションです。

たとえば、動画ファイルのカット編集(動画の切り取り)を行う場合は、編集後に動画全体を再エンコードする必要があります。

※「再エンコード」については、以下の記事をご参照ください。

動画の「再エンコード」とは?劣化との関係やコーデックの意味も解説

しかし、これだと編集と関係ない部分まで再エンコードにより圧縮されてしまうため、全体的に動画が劣化してしまいます。

そこで、再エンコードなしで動画を出力することで、劣化なしでカット編集を行うことができます。また、出力にかかる時間も大幅に短縮できます(動画をくっつけるだけなので)。

以上より、FFmpegの「-c copy」は、動画ファイルを結合する際に再エンコードを行わずにコピーをすることで、

  • 動画の劣化を防ぐ
  • 出力時間を短縮する

というメリットを得るためのオプションだといえます。

参考
【AviUtl】動画を再圧縮なし(無劣化)で編集&エンコードする方法 | AviUtlの易しい使い方

CRF値とは

従来のコーデックでは、ビットレートを指定してエンコードするビットレート固定モードが一般的でした。

一方で、H.264などでは動画の品質(画質)を指定してエンコードする品質固定モードがあります。

品質固定モードでは、指定した品質でのエンコードが可能であるという利点がありますが、圧縮後のファイルサイズはエンコード後でないと分からないという問題点もあります。

こちらの記事によると、品質固定モードでの動画の品質はCRF値で設定し、値が小さいほど品質が良くなるとのことです。

品質固定モードでの動画品質の指定 -crf

-crf値で動画の品質を指定する。
小さい値ほど品質は良くなる。
コーデックにより、とれる値の範囲、デフォルト値は違い、また同じ数値でもコーデックにより結果が変わってくる。

動画品質の設定:tech.ckme.co.jp

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値とファイルサイズとの関係は、コーデックの種類や入力の動画ファイルによっても変わってくるため、目安として考えておく必要があります。

本記事で試した圧縮では「-crf 30」としたため、デフォルト値の23から+7した値となっています。そのため、ファイルサイズは半分くらいになると予想されます。そして、実際に1.20GB→0.514GB(57%減少)という結果が得られたので、予想と一致してることが確認されました。

参考
動画品質の設定:tech.ckme.co.jp
CRF Guide (Constant Rate Factor in x264, x265 and libvpx)

まとめ

以上、FFmpegを使って動画ファイルの結合・変換・圧縮するやり方をご紹介しました。

下の記事では、画像を編集できるフリーソフトImageMagickのインストール方法をご紹介しています。

もしお時間があったら、覗いてみてください。

【ImageMagick】Windows11へのインストールのやり方

えのきつね
えのきつね

最後まで読んでくださり、ありがとうございました!
(ご質問・ご感想はマシュマロからどうぞ)