So-net無料ブログ作成
検索選択

TME3で作ったMPEG2 PSファイルの再生時間が狂う問題 [ソフトウェア/PC関係]

TMPGEnc MPEG Editor 3
ペガシスのTMPGEnc MPEG Editor 3。

TV放送を録画したMPEG2 TSファイルの編集に,ペガシスのTMPGEnc MPEG Editor 3(以下,TME3)を使っているのだが,以前から不思議な点があった。CSのSD画質の放送を録画したTSファイルを編集して,MPEG2 PSファイルを生成すると,Windows Media Player(WMP)で再生しても,Media Player Classis(MPC)で再生しても,全体の再生時間が狂ってしまうことがあるのだ。例えば,TSファイルから2分間分を切り出したPSファイルの場合,2分ではなく,3分46秒とかになってしまう。それでも,再生そのものは正常に行われるので,2分間再生したところで,再生位置が最後にいきなり3分46秒にジャンプする。なので,先頭から順に再生している分にはよいのだが,途中から再生する場合に,正しく位置を指定できないのが困る。致命的な問題ではないし,HD画質の放送では起こらないので,これまで放っておいたのだが,やっぱりちょっと調べてみることにした。

MPEG2 PSのファイル・フォーマットの概要はこちらのページで解説されている。PSファイルは,複数の「パック」という,可変長のデータ構造から構成されていて,1つのパックには複数の映像や音声のデータ(パケット)を含んでいる。パックの先頭には,必ずパック・ヘッダが付いていて,ここにそのパックに関する情報が含まれているのだが,その中の「多重化レート(Program_Mux_Rate)」というフィールドが,そのパックのビット・レートを示している。パック・ヘッダの詳細はこちら。4バイトの0x000001BAで始まるパック・ヘッダの,10~12バイトがそのビット・レートで,単位は50バイト/秒である。従って,10~12バイトから読み取った値に50を掛けて,さらに8を掛ければ,実際のビットレートが計算できる。

調査に使ったPSファイルでは,先頭のパックのパック・ヘッダの10~12バイトが「00 59 B7」となっていた。バイト並びはbig endian。3バイト目の下位2ビットは関係ないので,2ビット右シフトして,値は0x166d = 5741。つまり,ビット・レートは5741×50×8=2296400≒2.3Mビット/秒。ところが,この2分のPSファイルのサイズは,65097732バイト。これをビット・レートに換算すると,約4.3Mビット/秒になる。全然違うじゃん。どうなってんの? 念のため,PSファイルに含まれるすべてのパック・ヘッダをチェックしてみたが,すべて同じ2.3Mビット/秒という,実際の半分近い値になっていた。この2.3Mビット/秒とファイル・サイズから,全体の再生時間を計算すると,3分46秒。まさに,WMPやMPCが表示している値だ。これらのプログラムは,恐らく先頭辺りのビット・レートを見て,再生時間を計算していたのだろう。もしかしたら,システム・ヘッダの方の,「(PSファイルに含まれる全パックの)ビット・レートの最大値(rate_bound)」を使っているのかも知れないが。

何故ビット・レートが正しくない値になっているのかは分からないが,これが原因なら,ビット・レートを正しい値に書き換えてやればよい。ネットで探してみたところ,まさにそういうプログラムがみつかったので,自分で作るより,手っ取り早く試してみた。こちらで配布されている,mpghdrというプログラムである。これで,ビット・レートを4340000ビット/秒に変更してやると,無事,WMPでもMPCでも,正しい再生時間が表示されるようになった。

しかし,毎度毎度こんなことをしなくちゃいけないのは,酷く手間である。状況をペガシスに報告すれば対応してくれるのかも知れないが,実際に問題が起きている,TV放送の録画データを送る訳にもいかないしねぇ。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この記事のトラックバックURL:
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。