Media Foundation を使用してエンコードしているデータを、WMV ファイルに書き込む代わりにネットワーク経由でストリーミングする簡単な方法はありますか?
1 に答える
最初に、ストリーミングする形式 (エンコードされている/含まれている) を知る必要があると思います。
私はh264を考えています。Windows 7 メディア ファンデーションでは、h264 ヘルパー関数を作成します。トポロジを作成する必要があります。ソースはファイルを読み取り、シンクはデコードおよびエンコードされた形式を h264 に変換します。必要なのはソースとシンクだけです。実際にはデコーダーとエンコーダーは必要ありません。トポロジ ビルダーは、その間に何を差し込む必要があるかを把握します。
CreateTranscodeTopology 関数がありますが、エンコードされたデータをファイルに書き込むため、役に立ちません。そのため、独自のトポロジを作成する必要があります。
書く必要があるのは、IMFByteStream を実装するクラスだけです。
シンクは、このバイト ストリームの実装を取得する必要があります。実装の「書き込み」関数は、データを送信するソケットに書き込みます。したがって、ソケットを IMFByteStream 実装またはコールバック関数のコンストラクターに渡すことができます。
SinkWriter は次のような特定のものを呼び出すため、IMFByteStream に実装する必要がある他の関数にいくつかの print ステートメントを配置することもお勧めします。GetCapabilities であるため、少なくとも戻る必要があります。
HRESULT STDMETHODCALLTYPE NetworkOutputStream::GetCapabilities(__RPC__out DWORD *pdwCapabilities){HRESULT hr=S_OK;
printf("GetCapabilities\n");
*pdwCapabilities= (MFBYTESTREAM_IS_READABLE|MFBYTESTREAM_IS_WRITABLE|MFBYTESTREAM_IS_SEEKABLE);
return hr;
}
そうは言っても、クライアント(「HTML5ブラウザ」)にプレーヤーがある場合は、「MFCopy」の例を使用することをお勧めします。
トポロジーの作成は、主に再生などを目的としています。そのため、ムーブが再生される速度をデコードおよびエンコードします。ただし、必要なのはファイルをエンコードして、ワイヤで送信することだけです。MFCopy を見て、独自の IMFByteStream を実装してください。ローカル ファイル システムに書き込むシンクを作成する代わりに、IMFByteStream をシンクに渡します。