2017-11-03 88 views
1

UWPでMedia Foundationの特定のエンコーダをC++/cxを使用して選択したいと考えています。現在私はSinkWriterを使用して、システムにデフォルトのエンコーダを選択させます。UWP、Media Foundation、特定のエンコーダの選択

このコードを返す「クラス登録されていません」UWP下のエラーが、それはWin32コンソールアプリケーションで動作しますので、私もMFTEnumExは()UWP下のヘッダファイルでdefindedされていないことに気づい

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); 
MFStartup(MF_VERSION); 
IMFTransform* mtf; 
CLSID id; 
CLSIDFromString(L"{966F107C-8EA2-425D-B822-E4A71BEF01D7}", &id); // "NVIDIA HEVC Encoder MFT" 
//CLSIDFromString(L"{F2F84074-8BCA-40BD-9159-E880F673DD3B}", &id); // "H265 Encoder MFT" 
//CLSIDFromString(L"{BC10864D-2B34-408F-912A-102B1B867B6C}", &id); // "Intel« Hardware H265 Encoder MFT" 
//HRESULT hr = CoCreateInstance(id, nullptr, CLSCTX_INPROC_SERVER, IID_IMFTransform, (void **)&mtf); 
HRESULT hr = CoCreateInstance(id, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&mtf)); 

私はエンコーダを列挙できません。

私はこのような何かをできるようにC#のドキュメントがある気づい:

auto codecQuery = ref new Windows::Media::Core::CodecQuery(); 

が、C++/CXを使用しているとき、それは利用できないようです。

私もそれが実際に選んだSinkWriter何エンコーダをお願いしたいと思いますが、ICodecAPIが定義されていないので、このコードは動作しません:

IMFTransform* pEncoder = NULL; 
mWriter->GetServiceForStream(MF_SOURCE_READER_FIRST_VIDEO_STREAM, GUID_NULL, IID_IMFTransform, (void**)&pEncoder); 
if (pEncoder) 
{ 
    ICodecAPI* pCodecApi = NULL; 
    hr = pEncoder->QueryInterface<ICodecAPI>(&pCodecApi); 
} 

私はエンコーダを選択するか、どのエンコーダ選ばれた見つける助けてください?

答えて

0

Media Foundationでは、Sink Writer APIを使用してエンコーダを柔軟に指定することはできません。あなただけMF_READWRITE_ENABLE_HARDWARE_TRANSFORMS attributeを使用して、使用するか、ハードウェアエンコーダーを使用しないように指示することができます:

は、ハードウェアベースのメディアファンデーション変換(MFTS)を使用して、ソースリーダーまたはシンクライターを有効にします。

シンクライターが設定されたら、APIが処理のために用意した変換を列挙し、列挙からエンコーダを選択するIMFSinkWriterEx::GetTransformForStreamを使用することができます。これは実際にどのエンコーダが使用されているかをあなたに知らせるものです。

Media Foundation Sink Writer APIは、使用するエンコーダをデコードする権利を留保します。通常、Direct3Dのシナリオを有効にしている場合は、認定された互換エンコーダを使用することをお勧めします。

最後に、C++/CXでどちらが使用できるかはわかりませんが、コードスニペットでは前述のAPIが利用可能であることが示唆されています。

あなたが選んだエンコーダを使用するには、Sink Writerではなく、Media Foundation Media Session APIを使用することになっています。

+0

メディアセッションAPIに関しては、MFTRegister()は利用できないようです。ビデオを処理するためにカスタムIMFTトランスフォームを作成する必要があります。また、ファイルリーダーとライター。エンコーダは具体的に選択する必要があります。だから、それは私にとって可能ではないようですね? – Morten

+0

シンクライターで明示的エンコーダを使用するオプションはありません。最適なエンコーダ(通常はハードウェアエンコーダ)と最適な非ハードウェアエンコーダ(MSソフトウェアエンコーダに一般的に解決される)の2つのオプションだけです。あなたは2つから選択します。満足できない場合は、Media Session APIを使用するか、既に圧縮されたデータをSink Writerに供給する必要があるエンコーダを管理するかのいずれかです。私は 'MFTRegister'がここでどのように関連しているのか見当たりません。あなたは通常、この仕事のために使っていません。 –

+0

MFCreateMediaSession()は利用できません。この記事では、UWPの下でMedia Session APIを使用できないことを示しています。 https://stackoverflow.com/questions/47059898/how-to-use-windows-media-foundation-with -wwp-without-a-topology?rq = 1 – Morten

0

ローマ様ありがとうございます。私はGetTranformForStreamを試しました。 nvidiaのドライバで、私はIMFTransformの属性を取得します:

{206B4FC8-FCF9-4C51-AFE3-9764369E33A0}=1, 
{2FB866AC-B078-4942-AB6C-003D05CDA674}=NVIDIA HEVC Encoder MFT, 
FRIENDLY_NAME_Attribute=NVIDIA HEVC Encoder MFT, 
{3AECB0CC-035B-4BCC-8185-2B8D551EF3AF}=VEN_10DE, 
MAJOR_TYPE=Video, 
{53476A11-3F13-49FB-AC42-EE2733C96741}=1, 
{86A355AE-3A77-4EC4-9F31-01149A4E92DE}=1, 
{88A7CB15-7B07-4A34-9128-E64C6703C4D3}=8, 
{E3F2E203-D445-4B8C-9211-AE390D3BA017}=2303214, 
{E5666D6B-3422-4EB6-A421-DA7DB1F8E207}=1, 
{F34B9093-05E0-4B16-993D-3E2A2CDE6AD3}=860522, 
SUBTYPE=Base, 
{F81A699A-649A-497D-8C73-29F8FED6AD7A}=1, 

nvidiaのドライバを無効にする場合、私は取得のみ:

{86A355AE-3A77-4EC4-9F31-01149A4E92DE}=1 

最後の変換かしらいくつかの変換のリストですか?それらを得る方法?シンクロライターからトポロジーをトラバースできますか?

私のPCは、私が使用することができ、次のコーデックがありますnvidiaの場合

{966F107C-8EA2-425D-B822-E4A71BEF01D7} // "NVIDIA HEVC Encoder MFT" 
{F2F84074-8BCA-40BD-9159-E880F673DD3B} // "H265 Encoder MFT" 
{BC10864D-2B34-408F-912A-102B1B867B6C} // "Intel« Hardware H265 Encoder MFT" 

を、それは明らかに、NVIDIAはない場合、私は(Intelまたはソフトウェア)を意味のある文字列を取得しますが、ありません。

今度は、提案したようにMedia Session APIを見てみましょう。

関連する問題