4

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 フォーラムで同じ質問をしましたが、答えが得られなかったようです。

4

2 に答える 2

4

ドキュメントにあるように、出力タイプが設定された後にプロパティを変更することはできずCODECAPI_AVEncCommonQuality、SinkWriter はエンコーダーを操作する前に出力タイプを設定します。

この問題を回避するために、クラス ファクトリを作成してメディア ファンデーションに登録し、SinkWriter がそれを使用して新しいエンコーダを作成できるようにしました。私のクラス ファクトリでは、新しい H264 エンコーダーを作成し、SinkWriter に渡す前に必要なプロパティを設定します。

このクラス ファクトリを作成するために行った手順については、MSDN フォーラム ( http://social.msdn.microsoft.com/Forums/en-US/mediafoundationdevelopment/thread/6da521e9-7bb3-4b79 ) で詳しく説明しています。 a2b6-b31509224638

それが、Windows 7 での問題を回避できる唯一の方法でした。

于 2012-11-09T21:50:17.253 に答える