« テスト | メイン | WMV にキーフレームを入れる »

2007年07月25日

動画エンコーダー開発:: WMV のキーフレーム埋め込み

    

TMPGEnc でキーフレームを指定して、WMV ヘ変換してもキーフレームは入らないようだ。
「キーフレームをマーカーに変換する」と指定してやるとマーカーにはなるが、キーフレームにはならない。

マーカーがあればそこへジャンプすることは可能だが、その場合は WMV の同期リーダーを使う必要がある。
でも、吉里吉里の方では非同期リーダーを使っている ( 最初は同期リーダーを使っていたがいろいろあって非同期リーダーにした )。
だから、マーカーではなくキーフレームを入れたい。

AviUtlWMV 出力プラグインを使って出力してもキーフレームは入らないようだ。
WMV 出力プラグインのソースを見ると、キーフレームの時 IWMWriter::WriteSample のフラグに WM_SF_CLEANPOINT を渡している様子。
でも、Windows Media Format SDK の "To Force Key-Frame Insertion"の項を見るとその方法ではなく、INSSBuffer3::SetProperty を使って、WM_SampleExtensionGUID_OutputCleanPoint でキーフレームを指定するようになっている。
WMV 出力プラグインを改造して、キーフレームを正しく出力できるようにしようとしたが、make 方法がイマイチよくわからず止めた。( make は出来るが、エンコードすると最後のほうで落ちた )
そこで、Windows Media Format SDK についているサンプルの WMVRecompress を少し改良して、キーフレームを直に指定してみると、ちゃんとキーフレームが入った。
ソースは以下のような感じ。
一応、IWMWriter::WriteSample のフラグも設定した。

INSSBuffer3* pSample3;
if( S_OK == pSample->QueryInterface( IID_INSSBuffer3, (void **)&pSample3 ) ) {
    BOOL boolean = TRUE;
    hr = pSample3->SetProperty( WM_SampleExtensionGUID_OutputCleanPoint, &boolean, sizeof(boolean) );
    pSample3->Release();
}

WMV 出力プラグインの正しい make 方法を探る手もあるが、今後もエンコーダーには手を入れることもあるだろうから独立したプログラムで作ることにした。
とりあえずは、AVI から WMV のエンコーダーで、キーフレーム指定が可能なもの。
最終フレームにキーフレームを入れるとか、フォルダ内を一気にエンコードなど用途に適したものにする予定。
その後は、入力フォーマット増やしたり、出力で Theora に対応できたらなぁと夢想中。
後、アルファ付き MotionJPEG とか。



投稿者 Takenori : 2007年07月25日 00:21




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