ffmpeg で mkv 形式の動画を H.264 mp4 に変換してみた

.mkv 形式の動画ファイルをもらったのだが、ファイルサイズが大きかったので圧縮することにした。普段自分は Adobe Premiere Pro を使っているので Premiere に取り込んで圧縮しようかと思ったのだが、.mkv (Matroska) は取り込めないようでエラーが出てしまった。

Premiere が使えないとなると他のツールを探す必要がある。動画ファイルの数も多いことだし、ココは CLI でバッチ処理させたいな。ということで、コマンドラインから動画変換ができる ffmpeg に再注目して、H.264 の .mp4 形式に圧縮してみた。

ffmpeg をガッツリ触ったことがなかったので、オプション引数を色々勉強した。作業した OS は Windows で、Chocolatey よりインストールした ffmpeg を使っている。

目次

基本コマンド

$ ffmpeg -i 【元ファイル】 【最後に出力ファイル・拡張子でフォーマットが決まる】

# 例
$ ffmpeg -i './example-input.mkv' './example-output.mp4'

動画ファイルを変換するコマンドの基本形はこんな感じ。出力ファイルの拡張子によってフォーマットが決まるのが面白い。

映像の変換オプション

映像部分の変換オプションはこんな感じ。

2022-01-28 追記 : GPU エンコードできるようにしたので、手順を以下の記事でまとめました。

音声の変換オプション

続いて音声部分。

マルチトラック処理

よくよく -i オプションで .mkv 動画ファイルの中身を見てみると、多言語の音声トラックが収録されていた。MPC-HC や VLC などのプレイヤーを使えば、DVD の映画みたく、英語音声やスペイン語音声なんかを選べるアレだ。コレが収録されていたおかげでファイルサイズが大きかったらしい。

今回は日本語音声しか聞かないので、-i オプションでトラック番号 (0:0 が映像で、0:10:2 がそれぞれの音声トラック) を調べておき、映像と日本語音声トラックのみを出力するようにした。

組み立てたコマンドはこんな感じ

そんなワケで、今回 .mkv ファイルを .mp4 に変換する時に組み立てたコマンドは以下のとおり。

$ ffmpeg -i 'example-input.mkv'  \
  -vf scale=-1:480  -c:v libx264  -b:v 0.7M  \
  -b:a 112k  -ar 32000  \
  -map 0:0  -map 0:2  \
  'example-output.mp4'

だいぶ圧縮している。ファイルの内容によっては以下のような微調整を加えた。

GPU エンコードのコーデックが使えなかったので、CPU のみでエンコードすることになり CPU 使用率が 100% に張り付いていたが、そんなに速度は気にならなかった (Core i7-7700K 使用)。コマンドを組み立てて複数ファイルをバッチ処理できたので、寝ている間に全ファイルの変換が終わった。

元の動画がそんなに高画質なモノじゃなかったので、コレでも目に見える劣化はほとんどない。それでいてファイルサイズは元の3分の1から5分の1ぐらいまで圧縮できている。

自分は 4K モニタを使っているが、動画の高さは 480px 程度あれば十分かなと感じている。真剣に映像美を楽しむようなコンテンツならともかく、ダラ見するバラエティ的な動画なら 720p すら要らないかと。そんなに高画質で残したい欲もないし、飽きたら消しちゃうし。

ということで以上。

参考