Ich möchte einen bestimmten Encoder in Media Foundation unter UWP mit C++/Cx auswählen. Zur Zeit verwende ich einen SinkWriter und lasse das System einen Standard-Encoder wählen.UWP, Media Foundation, Auswahl bestimmter Encoder
Dieser Code gibt "Klasse nicht registriert" Fehler unter UWP, aber es funktioniert in einer win32 Konsole App:
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));
Ich habe auch bemerkt, dass MFTEnumEx() nicht in den Header-Dateien unter UWP, definded ist so Ich kann die Encoder nicht aufzählen.
Ich bemerkte, so etwas wie dieses es C# Dokumentation ist erlaubt:
auto codecQuery = ref new Windows::Media::Core::CodecQuery();
Aber es scheint, es nicht verfügbar, wenn C++/cx verwenden.
Ich möchte auch die SinkWriter was Encoder fragen sie tatsächlich wählte, aber dieser Code funktioniert nicht, weil ICodecAPI nicht definiert ist:
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);
}
Bitte helfen Sie mir Encoder wählen oder gewählt wurde, welcher Geber herausfinden?
In Bezug auf Mediensitzungs-API scheint MFTRegister() nicht verfügbar zu sein. Ich müsste eine benutzerdefinierte IMFTransform erstellen, um das Video zu verarbeiten. Auch ein Dateileser und -schreiber. Der Encoder muss gezielt ausgewählt werden. Also scheint es mir nicht möglich zu sein? – Morten
Sie haben keine Option für explizite Encoder mit Sink Writer. Es gibt nur zwei Optionen: den am besten geeigneten Encoder (normalerweise Hardware-Encoder) und den am besten geeigneten Nicht-Hardware-Encoder (der normalerweise in den MS-Software-Encoder aufgelöst wird). Sie wählen zwischen den beiden. Wenn Sie nicht zufrieden sind, verwenden Sie entweder die Media Session-API oder den Encoder, den Sie benötigen, um bereits komprimierte Daten an Sink Writer zu senden. Ich sehe nicht, wie "MFTRegister" hier verwandt ist, Sie verwenden es normalerweise nicht für diese Aufgabe. –
MFCreateMediaSession() ist nicht verfügbar und dieser Beitrag schlägt vor, dass Media Session API unter UWP überhaupt nicht verfügbar ist: https://stackoverflow.com/questions/47059898/how-to-use-windows-media-foundation-with -uwp-ohne-eine-topologie? rq = 1 – Morten