MovieLayerPlayer 1.06を公開

というわけで更新です。MovieLayerPlayer 1.05の更新はblog記事の中では題名となっていないのでバージョンが飛んだように見えるかもしれません。

今回の更新はとある動作報告より始まりました。

 

通常環境だとWin7以上でもmp4が再生できないとは・・・

この「通常環境」というのが今回のトリックポイント。blogにも記事として書いてありますが、私のPCはAdvancedCodecs(旧Win7Codecs)が入っていて、かつシステムの環境をいじっているためmp4の再生時画像側のデコーダはffdshow video decoderが使用されます。これはDirectShowのデコーダの中ではほぼ最強レベルのもので、ほとんどのビデオコーデックで再生が可能なのでとても重宝しています。

が、動画再生プログラムを組むと逆に高機能すぎて目に見えない問題がこういうときに浮上してくるわけですね・・・。で、検証のためこれを無効化して(かつWin7で通常は有効になっているはずのDTV-DVD Video Decoderを復活させて)再生させてみると・・・。見事にビデオの再生を受け付けない、と。あれま~。

受け付けられない理由は少し調べれば出てきたのでその部分に細工を入れれば通るのが幸いでした。一応この問題にはまった人用に書いておくなら、DTV-DVD Video Decoderの出力フォーマットはYUV系のみなのでレンダラがRGBしか受け付けない場合はRGBへの変換フィルタを用意しないと通らないということです。しかもフォーマット情報の部分もFORMAT_VideoInfo2しか出てこないのでちゃんと対応させましょう。

ちなみに、Window7以上の「通常環境」でMovieLayerPlayer経由でmp4を再生させる時には最低でもmp4のスプリッタと呼ばれるプログラムが必要になります。MP4Splitterなど種類がありますので適当に選んでシステムに登録しないとMovieLayerPlayerでは再生できません。ちょっと気になったのでAdvancedCodecsを入れ替えるついでに全削除した段階で再生テストを行うと開けなかったのでこれは確定です。期待を持たせるような書き方をしてしまいましたね。mp4のスプリッタの実装はとんでもなく大変のようですし、ソースコードレベルはほぼすべてGPLのようなので組み込めないのが痛いです。

スプリッタがあるなら今回の場合は色変換処理にWebM用に組んでいた変換フィルタを使用することができるので簡単、と思いきや。

 

そして通常環境でフレーム描画速度が

フレームがすごい速さで表示されたかと思えば一秒ほどフリーズ、のようなかくついた?動きをしていて、これの原因を調べて修正するまでが今回の修正でもっとも大変だったポイントです。デバッガで追いかけてみたり、ログファイルを出力させてみたり・・・。

プログラム的な解決法を書いてしまうと「CBaseVideoRendererでフレーム待ちが起こらないで最大速度で描画されてしまい、フレームが無くなって描画が止まる、という動きをする場合、グラフに与えられているリファレンスクロックの確認とレンダラのShouldDrawSampleNowの戻り値を確認してみよう」というところです。今回は後者が鍵。おそらくサンプルに設定されているタイムを見て計算を間違えたのでしょうかね・・・。

 

解像度が大きくなるとデコードが大変だ

フレームが遅延することやスキップすることまではそう簡単にはないでしょうが・・・。mp4でもYUV=>RGB変換をソフトウェア側で行うことになるのでデコードに力を使ってしまいますし。一応処理は独立しているのでCPUコア数があればFullHDでも普通に再生できるはずですが、CPUの使用率にちょっと驚いてしまった人でした。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

この記事のトラックバック用URL