この回の続きのようなものです。
今回は再エンコード編ということで、iTunes経由で転送できないmp4の動画を再エンコードで転送できるようにしてやろう、という計画でしたが・・・。
これがまた面倒でした。エンコードで使用するソフトはMediaCoderを使います。それ以外にも副作用でいくつかソフトが登場します。
MediaCoderはVFRの再エンコードがちょっと苦手
のような感じです。フレームレートが正しく設定できないような感じでした。
そのまま変換すると途中で変換が止まってしまう例やらフレームレートが明らかにあっていない例やらが出てきているのを確認しています。
これをクリアするために一部コマンドラインからの操作で何とか使用としてみました。
手順がちょっとやっかいだが
こんな感じです。
1.mp4boxで対象のmp4から各ラインを取り出す
> mp4box -raw 1 source.mp4
> mp4box -raw 2 source.mp4
まずはこれでそれぞれのラインを抽出します。各トラックが映像ライン・音声ラインでないときはそれぞれを指すようにしてください。
これでsource_track1.h264とsource_track2.aacというファイルが作成されるはずです。
2.作成されたh264をMediaCoderでmp4に変換
気をつける点はこれで説明したとおり、プロファイル設定をBaseline(or Main)[Ver2.1]にすることです。
それ以外はあまり気にしなくても大丈夫です。画像サイズも一応640×480[4:3],640×360[16:9]を推奨しましたが、今現在は960×540[16:9]での変換をしています。
このとき、フレームレート情報は絶対にいじらない(強制設定を行わない)でください。h264ファイルからでも変換できるので微妙に便利です。
3.dtseditで元々のファイルからタイムコード抽出
> dtsedit -o timecode.txt source.mp4
mp4の映像ラインがVFRになっているときは、タイムコード情報が必要になります。
dtseditというユーティリティを使ってそのタイムコード情報をいったんファイルとして取り出します。
4.tc2mp4でh264を変換したmp4にタイムコード情報を設定
> tc2mp4 -i encode.mp4 -t timecode.txt -o result.mp4
これでh264から変換されたmp4にタイムコード情報を設定して正しいタイムコードの状態にします。
この操作で出力されたmp4はこの時点でフレーム的なずれは消去されています。
5.別にしておいた音声ラインを結合
> mp4box -add “source_track2.aac”#audio result.mp4
で結合して完了です。音声ラインも再エンコードしたいときはMediaCoderに分離した音声ラインだけを再エンコードしてAACで出力すれば同じ操作で終了します。
すっきりした方法ではないのが残念
というか、もっと簡単な方法があるような気がしますが、無理にMediaCoderをエンコーダに使おうとしたためにこんな手順になっています。
なお、dtseditとtc2mp4は検索で見つかるユーティリティです。あと、それぞれの実行ファイルは同じディレクトリにあるものとしています。
(mp4boxはMediaCoderがインストールされているならtoolsディレクトリにあります)
どのユーティリティが使えるのかを調べるのに妙な時間を使いました・・・。