« WMV のキーフレーム埋め込み | メイン | 画像コピーにイテレーターを使うかどうか »

2007年07月26日

動画エンコーダー開発:: WMV にキーフレームを入れる

    

取り立てて必要なのは無圧縮AVI から WMV へのエンコーダーで、キーフレームを入れられるもの。
と言うことで、 サンプルの UncompAVIToWMV を改良してキーフレームを入れられるようにすることにした。

コマンドライン引数を追加して、「 WMV のキーフレーム埋め込み 」の要領でキーフレームを入れるようにして、エンコード。
再生してシークして見るが、正しくシークしない。
キーフレーム入ってない? と思ったが、キーフレームは入っているようだ。
キーフレームは WMVRecompress に追加した方法と同じ方法でやっている。
同じムービーをもう一度 WMVRecompress でやってもうまくいかない。
なぜ?
うまくいったムービーをもう一度 WMVRecompress でやるとうまくいく。
UncompAVIToWMV と WMVRecompress のプロファイル設定周りを比べるが、プロファイルは同じになるようだ。

マルチパスだろうか?
WMVRecompress は 1pass エンコードしているが、元は WMV 、2pass にしたらうまくいくかもと思い、プロファイルを変更して、2pass エンコード。
うまくいった。
理由は良くわからないが、2pass エンコードにすると入れたキーフレームにシークできるようになった。

だがもう一つなぞがある。
キーフレームは最終フレームに入れることが多いので、それ用のオプションを追加している ( ムービーをスキップしたら最終フレームの絵で続くように最終フレームへシークするため )。
その時、最終フレームにだけキーフレームを指定するとうまくいかない。
理由はわからないが、最後の2フレームにキーフレームを入れるとうまくいく。
しかも、不思議なことに最後の2フレームにキーフレームを入れた方がファイルサイズが小さい。
さっぱりわからない。
まあ、目的は果たせているのだが、少し気持ち悪い。
WMVRecompress の方では最終フレームにだけキーフレームを入れればうまく行く。

エンコーダーのソースを追っていて気付いたが、同期リーダーでもユーザー定義のクロックを与えてやることで、再生速度に関係なく読み出せるようだ。
ただ、ムービーソースがユーザー提供のクロックに対応していない場合は、失敗するとか。
また、微妙な・・・
WMVRecompress で使っているから、WMV の場合はうまく行きそうだが。



投稿者 Takenori : 2007年07月26日 15:29




comments powered by Disqus
Total : Today : Yesterday : なかのひと