Microsoft Media Foundation を使用して H.264 ビデオ ファイルをエンコードしています。
SinkWriter を使用してビデオ ファイルを作成しています。MFVideoFormat_RGB32
入力はフレームを描画する buffer( ) で、出力はMFVideoFormat_H264
です。
エンコーディングが機能し、フレームを含むビデオ ファイルが作成されます。しかし、そのビデオ ファイルの品質を設定したいです。具体的にはCODECAPI_AVEncCommonQuality
、H.264 エンコーダーにプロパティを設定したいと考えています。
H.264 エンコーダーへのハンドルを取得するために、SinkWriter でGetServiceForStreamを呼び出します。次に、CODECAPI_AVEncCommonQuality
プロパティを設定します。
問題は、プロパティの変更が無視されることです。ドキュメントに記載されているように:
Windows 7 でこのパラメーターを設定するには、IMFTransform::SetOutputType を呼び出す前にプロパティを設定します。エンコーダーは、出力タイプが設定された後の変更を無視します。
問題は、H.264 エンコーダーを手動で作成していないことです。SinkWriter で入力と出力のタイプを設定すると、SinkWriter が H.264 エンコーダーを自動的に作成します。エンコーダーを作成するとすぐにIMFTransform::SetOutputType
メソッドが呼び出され、CODECAPI_AVEncCommonQuality
プロパティを変更できなくなります。ドキュメントには、プロパティの変更は Windows 8 では無視されないとも書かれていますが、Windows 7 で実行するにはこれが必要です。
Windows 7 で SinkWriter を使用しているときに、エンコードされたファイルの品質を変更する方法を知っていますか?
PS:誰かが msdn フォーラムで同じ質問をしましたが、答えが得られなかったようです。