[FFmpeg] カーナビ(楽ナビ)でMP4動画を再生するためのエンコード設定

カーナビ (楽ナビ AVIC-RW802-D) でのSDカードの動画再生ができず、ここ数日ほど奮闘しておりました。
やっといい感じで勝利&解決したので、今後の自分のための備忘録。

FFmepg を使う

動画をカーナビに対応したファイルに変換するためのソフトは FFmpeg ver.6.1.1 を採用しました。
動画や音声のファイルを変換したり、加工したり、いろいろできちゃう便利なやつ。

コマンドラインで使用するので難しそうに見えますが、こうやってメモっておけば問題なし。(どんなソフトも使い方はメモっておかないとすぐ忘れちゃう)

導入のあれこれ

FFmpeg のダウンロードとかの詳細については省略。
(自分のOS環境にあったファイルをダウンロードして解凍するだけ)

ダウンロードしたらPATHを設定します。

  1. Windowsのスタートメニューを左クリックして「システム」を選択
  2. 「システム」詳細情報の右側にある「関連設定」から「システムの詳細設定」を選択
  3. システムのプロパティの「詳細設定」タブを選択し「環境変数」ボタンをクリック
  4. ユーザー環境変数の「Path」を選択して「編集」をクリック
  5. ffmpeg.exe が保存されているフォルダを指定して「OK」ボタン

PATH を設定することで、コマンドプロンプトを使ってどこからでも ffmpeg を使用することができます。

対応しているファイル形式、および注意点

対応映像コーデックの一覧

MPEG-4 Video H.264 / AVC WMV (VC-1)
プロファイル Simple Profile Baseline Profile Simple Profile
最大解像度 (ピクセル)
@最大フレームレート
720×480@30 fps 720×480@30 fps 720×480@30 fps
最大ビットレート
(平均値/ピーク値)※
4 Mbps/8 Mbps 2.5 Mbps/4 Mbps 768 kbps/-

※映像コンテンツ全体の平均ビットレートが最大ビットレート (平均値) を超えていなくても、瞬間的なビットレートが最大ビットレート (平均値) を連続的に超えると、正常に再生できない場合があります

映像エンコードの形式は、上記の中から ファイル容量が少なくても高品質にできる「H.264」 を採用。

対応音声コーデック一覧

WMA MP3 AAC WAV
サンプリング
周波数
8 kHz ~ 48 kHz MPEG1:32 kHz~48 kHz
MPEG2:16 kHz~24 kHz
MPEG2.5:8 kHz~12 kHz
8 kHz ~ 48 kHz 16 kHz ~ 48 kHz
ビットレート CBR:
5 kbps~320 kbps
Bitrate based VBR:
48 kbps~192 kbps
Quality based VBR:
10 kbps~98 kbps
MPEG1:32 kbps~320 kbps
MPEG2:8 kbps~160 kbps
MPEG2.5:8 kbps~160 kbps
8 kbps ~ 320 kbps
量子化ビット数 16 16 16 16

映像のエンコードが「H.264」なので、音声は「AAC」でエンコードします。

MP4動画を楽ナビ用にエンコードする

こちらが本題。

手順1: コマンドプロンプトを起動

エンコードしたい動画が保存されているフォルダからコマンドプロンプトを起動する。
フォルダのアドレスバー(ファイル階層が表示されている部分)に cmd と入力すればコマンドプロンプトが起動する。

手順2: 動画ファイルを 2pass エンコード する

2pass エンコードすると少ないファイル容量で画質や音質の品質を保つことができます。
また、「カーナビの対応映像コーデック一覧」の注意書きである、

※映像コンテンツ全体の平均ビットレートが最大ビットレート (平均値) を超えていなくても、瞬間的なビットレートが最大ビットレート (平均値) を連続的に超えると、正常に再生できない場合があります

これを回避するためにも2passエンコードは必要です。

実行するコマンド

2pass エンコードには以下の2つのコマンドを実行する必要があります。

1回目のコマンド。ファイル解析を行い、ログファイルが作成されます。

ffmpeg -i INPUT.FILE -pass 1 -an OUTPUT.FILE

2回目のコマンド。作成されたログファイルをもとにエンコードします。このとき、ビデオのビットレートとオーディオのビットレート・サンプリングレートも指定しておきます。

ffmpeg -i INPUT.FILE -pass 2 -b:v 1400K -b:a 256K -ar 48K -y OUTPUT.FILE

INPUT.FILE には「エンコードする動画のファイル名+拡張子」を入れ、 OUTPUT.FILE には「エンコードされた動画の名前+拡張子」を入れます。

2Pass エンコードをワンライナーで実行するコマンド

1回目と2回目のコードを && で繋げるとまとめて実行できます。

ffmpeg -i INPUT.mp4 -pass 1 -an OUTPUT.mp4 && ffmpeg -i INPUT.mp4 -pass 2 -b:v 1400K -b:a 256K -ar 48K -y OUTPUT.mp4

手順3: 2Passエンコードされたファイルをカーナビ用にエンコードする

あくまでも今回エンコードした動画をもとにしたコードなので、解像度のあたりは手持ちの動画によって異なります。

ffmpeg -i INPUT.mp4 -c:v libx264 -x264-params "ref=2" -r 30 -profile:v baseline -level 30 -pix_fmt yuv420p -s 640x360 -c:a copy OUTPUT.mp4

カーナビの解像度は最大720×480 (4:3)となっています。
今回使用した動画の解像度は1920×1080 (16:9) だったので、アスペクト比そのままで720×480以内に収まるサイズとして640×360に変更しました。
オーディオは 2pass エンコードにかけるときにすでに数値を変更済みなのでこれ以上のエンコードは不要と言うことで -c:a copy でそのままコピーしています。

使用しているオプションについて

今回のエンコードに使用しているオプションについて。

パラメータ 内容
-i FILENAME 入力ファイルのパス
-an FILENAME 音声なしで出力
-pass 1 (or) 2 パスを指定
-b:v 1400K 映像ビットレートを1400Kに指定
-y FILENAME 出力時に既存の同名ファイルを警告無しに上書き
-c:v libx264 映像コーデックの指定 (libx264 = H.264)
-x264-params “ref=2” 参照フレーム数の指定
-r 30 フレームレート(fps)を指定値に変換する
-profile:v baseline プロファイル
-level 30 映像エンコードのレベル指定(レベル3なら30と指定する)
-pix_fmt yuv420p ピクセルフォーマットの指定
-s 640x360 指定したサイズにリサイズする
-c:a aac 音声コーデックを指定
-b:a 256K 音声のビットレートを指定
-ar 48K 音声のサンプリングレートの指定

ffmpegはこれ以外にも様々なオプションがあり、それらを駆使することで動画や音声の編集・加工などを行うこともできます。

最初にうまくいかなかった原因は「参照フレーム」

今回、どこで詰まっていたのかと言えば「-x264-params “ref=2”」という部分でした。

カーナビ用にエンコードした (つもりだった) のにうまく再生できなかった動画は、参照フレーム の設定が「4」になっていました。
この参照フレームの値が「2」になっていないと楽ナビでは再生できない、という罠だったみたいです。

以前「XMedia Recode」というエンコードソフトを使って作成していた動画だけはカーナビで再生できたので、再生できる動画とできない動画の違いはなんだろう?と「MediaInfo」(動画や音楽ファイルのメタデータを表示するソフト) で詳細情報を比較したところ、参照フレームの数値だけ違っていた のでおそらくそうなのかな、と。
残念ながらあまり動画ファイルに詳しいわけではないので確証はないのですが…。
(※ちなみに XMedia Recode は、参照フレームの規定値が「2」になっている)

おかげさまで FFmpeg の便利さにも気づいたので、よい勉強になりました。