2017-03-09 53 views
0

H264ビデオエンコーディングのMedia Foundation IMFTransformを使用してビデオフレームをエンコードできるようにします。これは、MFTEnumExを使用して変換を列挙し、H264エンコーダを見つけるWin32で簡単に実行できます。WinRT Store AppでH264エンコーダをインスタンス化する方法

しかし、WinRT(Store Apps)では、インスタンス化する方法を見つけることができません。 クラスCMSH264EncoderMFTがありますが、CoCreateInstanceで使用するCLSIDの定義はありません。

で:

CoCreateInstance(CLSID_CMSH264EncoderMFT, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IUnknown), (void **)&pUnknown); 

CLSID_CMSH264EncoderMFTは、WinRTのアプリケーションのために定義されていません。

と試してみました:

ComPtr<CMSH264EncoderMFT> encoder = Make<CMSH264EncoderMFT>(); 

それはクラスCMSH264EncoderMFTが不完全である、と述べている "未定義の型 'CMSH264EncoderMFT' の使用" と言います。 Makeの構文が正しいか適切であるかを知りません...

誰かがWinRTのためにこれを行う方法の手がかりを持っていますか?

+0

こんにちは、私はあなたに正しい助言を与えることはできませんが、同様の問題に直面している間、次のトリック[Windows Store C++プロジェクトでのFree-COM DLLの使用](https://blogs.msdn.microsoft .com/win8devsupport/2013/05/19/free-com-dll-in-windows-store-c-project /)アイデアはWindowsのデスクトップバージョンのWindowsストアアプリケーションのコードからいくつかのCOM DLLを呼び出すことが可能です。 Windows WinRTでは動作しませんが、このようなWindowsバージョンのデバイスは非常に少ないです。このソリューションは、ユニバーサルアプリケーション専用デスクトップ用のソリューションではありません。 –

+0

こんにちは@EvgenyPereguda、ありがとうございます。私がCOMを自由にロードできることを知ることは面白いです。しかし、私は本当にモバイルのためにこれが必要です。私がモバイル用にエンコードできることを知っている唯一の方法はシンクライターですが、それは私にファイルフォーマットのオーバーヘッドを与えます(mp4と言う)。私は本当に 'IMFTransform :: ProcessOutput'のサンプルを... –

答えて

-1

CMSH264EncoderMFTを使用してオブジェクトをインスタンス化することはできません。WinRT内にオブジェクトがある必要があります(例:IInspectable - Provides functionality required for all Windows Runtime classes)。 CMSH264EncoderMFTはWinRTクラスではありません。関数MFCreateSinkWriterFromMediaSinkでタスクを解決することができます - この関数は、インタフェースIMFMediaSinkを持つオブジェクトを取ります。 IMFMediaSinkインターフェイスを持つオブジェクトの書き込みコードがあり、IMFTransform::ProcessOutputのサンプルを受信することができます。私はちょうどあなたの注意を指す - WindowsランタイムクラスではないWindowsStoreコードオブジェクトでインスタンス化することはできません。

よろしく、 エフゲニーPereguda

+0

その答えは意味をなさない。 CoCreateInstanceは、WindowsランタイムオブジェクトではなくCOMオブジェクトを作成する関数です。失敗した実際の理由は、クラスがWindowsストアアプリケーションで使用できないためです。しかし、利用可能でIInspectableを実装していない多くのCOMクラスがあります。 – Sunius

+0

私は、WindowsストアC++プロジェクトで 'Using Free-COM DLL 'を使ってCOMオブジェクトを作成することができると書いています。'しかし、Joao Carrionは、アクセス可能なGUIDのようにWindowsStoreのコンテキストからCMSH264EncoderMFTを使用しようとしました。私は、特定のプラットフォームのレベル抽象化であるWinRT環境でのFree-COMの使用は不可能だと指摘します。 –

+0

こんにちは@EvgenyPereguda、私はIMFMediaSinkを実装する必要があると言っていますか?おそらくIMFStreamSinkもH264コーデックから出力フレームを取得できると仮定していますか?私は今それを検討していますが、ファイルへの標準書き込みをしたくない場合、ファイルルーティングから再生する場合、ドキュメントはかなり混乱しています。 –

0

最初のファイルライターを作成するために、MFCreateSinkWriterFromURLを使用してください。次に、MFCreateMediaTypeを使用してIMFMediaTypeを作成します。そのうちの1つが出力フォーマットになります:MF_MT_SUBTYPE guidのメディアタイプでSetGUIDメソッドを使用し、MFVideoFormat_H264を引数として指定します。最後に、シンクライターでAddStreamメソッドを使用してメディアタイプを設定します。

hereの例があります(MF_MT_SUBTYPEが設定されている場合は少し修正する必要があります)。

+0

ありがとう!私は実際にこれをやっていますが、問題はコーデックの出力サンプルが得られないことです。ファイル(mp4など)として既にフォーマットされているストリームに保存するだけです。私が必要とするのは、コーデックのIMFT変換をインスタンシエートすることでデスクトップ上で取得できるビデオサンプルです。 –

関連する問題