スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

iTunes PS3で再生可能なVFRなMP4をつくろう[mp4fpsmod]

やっとWindowsのVLC陣営やらAppleQTiTunesiOS陣営やらソニーPS3陣営のマルチプラットフォームにおいてドンピシャで再生できるVFRなMP4ができたのでまとめ。
全然情報がなくて非常に苦労しました。 tc2.exeやtc2mod.exeではうまくいかなかったので・・・。
ただしPS3 v3.70では再生開始がうまくいかないので再生開始したらひとまず△押して動画のサムネイル作成画面まで行って作成せず×で戻ると再生開始するみたい。つっかかる感じ。
これは2011年8月現在での情報になります。月日が経てば他にもっといい方法が確立されていると思います。

再生環境 PS3 v3.70

まずは余談から。
VFR(可変フレームレート)がサポートされているメディアフォーマットといえばマトリョーシカ(.mkv)がまず真っ先に思い浮かぶでしょう。しかし実はMPEG-4フォーマットもVFRをサポートしているんです。

どのようにMPEG-4フォーマットでVFRをサポートするのかといいますとタイムコードといわれる情報を各種ストリーム(H.264/AVCやAACコーデックで圧縮された映像や音声のこと)と見えないかたちで同梱する(埋め込む)んです。
このタイムコードについてあまり詳しくないのですがテキスト化したものを見ると表示するフレーム(単位:フレーム)と表示する時間(単位:ミリ秒)をすべて列挙したものとなっています。

あったら便利なアプリケーションやライブラリとか

  • mp4fpsmod.exe
  • msvcr100.dll (上記同梱)
  • msvcp100.dll (上記同梱)
  • mkvextract.exe
  • MKVExtractGUI2.exe
  • ffmpeg.exe
  • qtaacenc.exe
  • mp4box.exe
  • mp4chaps.exe

mp4fpsmod.exeの使い方

mp4fpsmod.exe [OPTIONS] INPUTFILE

mp4fpsmod.exe ヘルプを見る
-o 出力するMP4ファイル名
-p --print MP4に埋め込まれたタイムコードをtimecode v2で出力
-t --tcfile timecode v2ファイルでタイムコードを編集
-x --optimize タイムコードを最適化/調整/解析する
-r --fps 後述の例をみて欲しい
-c --compress-dts DTSコーデックによる圧縮を使う ?未検証
-d --delay nミリ秒だけ音声を遅れて再生開始する(マイナスも使える)?未検証

具体的な使い方(例)

mp4fpsmod.exe –r 28800:24000/1001 –r 18000:30000/1001 –r 43200:24000/1001 –r 0:30000/1001 –o OUTPUT.MP4 INPUT.MP4

<解説>
INPUTAVCAAC.mp4の最初から28800フレームまでを24000/1001fps(23.976fps)で再生し、そこからの18000フレームを30000/1001fps(29.970fps)で再生し、またそこからの43200フレームを24000/1001fps(23.976fps)で再生し、そこから最後までの全フレームを30000/1001fps(29.970fps)で再生させたいときのオプションの例です。

概算ですが、最初の1200秒間(20分間)を23.976fps、次の600秒間(10分間)を29.970fps、次の1800秒間(30分間)を23.976fps、残りの時間を29.970fpsで再生させることになります。

VFRなMKVからVFRなMP4へ無劣化移し替え可能な大まかな流れ

以下ではFLAC+H.264/AVC+CHAPTERで構成され、かつタイムコードが書きこまれているVFR.MKVを例に説明していく。

太字はファイルを示す。ピンクは適宜オプションを自分の好みに合わせて変えてもらって構わない部分。・・・だと思われる・・・・;グレーは変えちゃダメだと思われるオプションです。

ステップ1
VFRなMKVから各種ストリームとチャプタ情報とタイムコードv2などを抜く

MKVExtractGUI-2使うほうが早くて便利ですが。形式上載せときます。

mkvextract.exe tracks VFR.MKV 1:ID1.FLAC 2:ID2.H264
mkvextract.exe chapters VFR.MKV --redirect-output VFR.CHAPTERS.TXT –s
mkvextract.exe timecodes_v2 VFR.MKV 2:TC2.TXT

ステップ2
FLACはMP4に入らないので音声をAAC-LCに圧縮・エンコード

ffmpeg.exe -i ID1.FLAC -vn -acodec pcm_s16le ID1.WAV
qtaacenc.exe --tvbr 80 --highest ID1.WAV ID1.M4A

余談ですが副音声として可逆圧縮のMPEG-4 ALSやアップルロスレスを同梱させようと試みたがmp4boxがエラーで弾く模様。バージョンアップに期待。

ステップ3
音声と映像をまずCFRなMP4にまとめる

mp4box.exe -add ID1.M4A:lang=jpn -add ID2.H264:lang=jpn -new CFR.MP4

ステップ4
タイムコードv2と埋め込む予定のMP4からどこからどこまでが何fpsなのか解析

mp4fpsmod.exe -x -t TC2.TXT –o FAKE.MP4 CFR.MP4

この操作で何フレームの間における①単位フレームあたりの微小な時間の増加量デルタ、言い換えれば①単位フレームあたりのミリ秒数(表示単位:ms/f)および②単位秒あたりのフレーム数(表示単位:f/s)が解析され表示される。ただし後者は計算に誤差があると表示されないことがあるので注意。

①単位フレームあたりの微小な時間の増加量デルタが約33ミリ秒毎フレーム(33ms/f)と表示されあればそれは30000/1001fpsとみなしてよい。 同様に約41ミリ秒毎フレーム(41ms/f)と表示されあればそれは24000/1001fpsとみなしてよい。②が表示されたのなら素直に②だけを読めばいい。

以下に②が表示されなかったケースを示す。

Reading MP4 stream...(MP4ストリームを読み込み中)
Done reading(読み込み完了)
Divided into 5 groups(5つの区間・グループに分割されました)
3255 frames: time delta 41.7083(まず最初の3255フレームは23.976fpsです)
264 frames: time delta 33.3667(その次の264フレームは29.970fpsです)
20 frames: time delta 41.7115(その次の20フレームは23.976fpsです)
10 frames: time delta 33.3(その次の10フレームは29.970fpsです)
4415 frames: time delta 41.7154(残りのフレームは23.976fpsです)
timecode entry count differs from the movie

ステップ5
CFRなMP4にタイムコードを埋め込み、VFRなMP4を作成

ステップ4で表示された解析結果をもとに、VFRなMP4を完成させる。
以下の例はステップ4の続きの例です。最後の区間を–r 0とするのがポイント

mp4fpsmod.exe –r 3255:24000/1001 –r 264:30000/1001 –r 20:24000/1001 –r 10:30000/1001 –r 0:24000/1001 –o VFR.MP4 CFR.MP4

おまけ
VFRなMP4にアップル向けチャプタ情報を埋め込む

①まずVFR.MP4のタグ情報をMP3TAGやiTunesで編集して完成させましょう。(非常に大事)

VFR.CHAPTERS.TXTをテキストエディタでOGM形式から以下の形式に変更したりチャプタ名を適宜変更したりする。以下のような感じ。UTF-8で保存します。

00:00:00.000 第1章
00:00:20.022 Chapter 2
00:07:17.124 チャプター03
00:15:34.969 第4節
00:27:32.532 スタッフロール
00:28:07.352 次回予告

VFR.MP4と同じパスに置いてファイル名をVFR.CHAPTERS.TXTとしておくのがポイントです。
あとは以下のコマンドを打って暫しの間まったり待つだけ。

mp4chaps.exe -z -i VFR.MP4

よくある失敗

Total number of frames differs from the movie
映像の総フレーム数と指定したフレーム数の和に差があるため埋め込みをしませんでした。
差が生まれないよう最後のフレーム区間は-r 0:30000/1001などのようにフレーム数に0を指定しましょう。

あとがき

こんなに書いてもっと簡単な方法あったら悲しいけどあったらあったで教えて欲しい。

感謝したいページ(順不同)

コメント

非公開コメント

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。