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);
}
私はエンコーダを選択するか、どのエンコーダ選ばれた見つける助けてください?
メディアセッションAPIに関しては、MFTRegister()は利用できないようです。ビデオを処理するためにカスタムIMFTトランスフォームを作成する必要があります。また、ファイルリーダーとライター。エンコーダは具体的に選択する必要があります。だから、それは私にとって可能ではないようですね? – Morten
シンクライターで明示的エンコーダを使用するオプションはありません。最適なエンコーダ(通常はハードウェアエンコーダ)と最適な非ハードウェアエンコーダ(MSソフトウェアエンコーダに一般的に解決される)の2つのオプションだけです。あなたは2つから選択します。満足できない場合は、Media Session APIを使用するか、既に圧縮されたデータをSink Writerに供給する必要があるエンコーダを管理するかのいずれかです。私は 'MFTRegister'がここでどのように関連しているのか見当たりません。あなたは通常、この仕事のために使っていません。 –
MFCreateMediaSession()は利用できません。この記事では、UWPの下でMedia Session APIを使用できないことを示しています。 https://stackoverflow.com/questions/47059898/how-to-use-windows-media-foundation-with -wwp-without-a-topology?rq = 1 – Morten