先週はずっとMedia FoundationのSourceReader/SinkWriterあたりのリファレンスやサンプルコードを観ながら具体的にどう作るかを考えていきつつ、ぼちぼちとコードを書き始めている。ちょっと前にかじっていたはずなのだがすっかり忘れてしまっており、思い出すのに一苦労である。歳は取りたくないね。。。思い出すと大したことをやっていなかったことが発覚して衝撃を受けたりするし。
処理のフローとしては以下のような流れになると思う。
- WAVファイルをSourceReaderで開く。
- H.264形式で出力用SinkWriterを生成する。
- オーディオ・サンプルを読み込み、そのデータをもとにしてD3D11テクスチャにグラフィックを描画する。
- オーディオ・サンプルとD3D11テクスチャを同期させつつSinkWriterで書き込む。
今は3.を実装していてハマっているところである。テクスチャに書き込んだものをプレビューとしてSwapChainPanelにも出力しようとしているのだがそれがうまくいかない。その部分も含めたフローを書くとこうなる。
- テクスチャを作る。テクスチャのサイズは1280720(720p)とする。
- テクスチャのSRVとRTVを作る。
- テクスチャをCPUから読み出すためのステージテクスチャを作る。
- テクスチャに描画する。
- テクスチャをSwapChainPanelに描画する。
- テクスチャをステージ・テクスチャにコピーする。
- ステージ・テクスチャをSinkWriterで1フレームの動画として書き込む。
SwapChainPanelは320180の大きさで、1280*720のテクスチャを縮小して表示する。縮小といっても特別なことをすることはなく、画面サイズに関係なく3D座標は正規化されている(というのかな?)ので勝手に縮小されることを利用しているつもりなのだが何故か意図したように縮小されない。なんか等倍で描画されているような感じなのである。どこかでおかしなことをしていると思うのだが、どこがなのかまだわかっていない。
Windows 8.1になってSwapChainBackgroundPanelに加えてSwapChainPanelが使用できるようになった。違いはまだよくわかっていない。ひょっとするとSwapChainBackgroundPanelはdeprecatedされたのかもしれない。