[FFmpeg] カーナビ(楽ナビ)でMP4動画を再生するためのエンコード設定
カーナビ (楽ナビ AVIC-RW802-D) でのSDカードの動画再生ができず、ここ数日ほど奮闘しておりました。
やっといい感じで勝利&解決したので、今後の自分のための備忘録。
FFmepg を使う
動画をカーナビに対応したファイルに変換するためのソフトは FFmpeg ver.6.1.1 を採用しました。
動画や音声のファイルを変換したり、加工したり、いろいろできちゃう便利なやつ。
コマンドラインで使用するので難しそうに見えますが、こうやってメモっておけば問題なし。(どんなソフトも使い方はメモっておかないとすぐ忘れちゃう)
導入のあれこれ
FFmpeg のダウンロードとかの詳細については省略。
(自分のOS環境にあったファイルをダウンロードして解凍するだけ)
ダウンロードしたらPATHを設定します。
- Windowsのスタートメニューを左クリックして「システム」を選択
- 「システム」詳細情報の右側にある「関連設定」から「システムの詳細設定」を選択
- システムのプロパティの「詳細設定」タブを選択し「環境変数」ボタンをクリック
- ユーザー環境変数の「Path」を選択して「編集」をクリック
- 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 の便利さにも気づいたので、よい勉強になりました。