Kann IMFTransform
Schnittstelle implementiert werden, um H264 oder AAC-Daten zu kodieren oder zu dekodieren oder sollte ich FFmpeg oder OpenH264 verwenden.Implementieren 'IMFTransform' zum Codieren oder Decodieren von H264 oder AAC
Antwort
Sie können die Schnittstelle IMFTransform
implementieren, um H264 und AAC zu decodieren und zu codieren. Siehe CLSID_CMSH264DecoderMFT
und CLSID_CMSAACDecMFT
, um H264 und ACC, auch CLSID_CMSH264EncoderMFT
und CLSID_AACMFTEncoder
zu dekodieren, um H264 und ACC zu kodieren.
Encoder-Beispiel: Initialisieren Sie den Encoder.
IUnknown *_transformUnk;
IMFTransform *_encoder;
HRESULT MediaEncoder::InitialiseEncoder(EncoderType encoder)
{
HRESULT hr = S_OK;
// Has the encoder been init.
if (!_isOpen)
{
_encoderType = encoder;
// Init the COM.
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
// Create a new close event handler.
_hCloseEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// If event was not created.
if (_hCloseEvent == NULL)
{
// Get the result value.
hr = __HRESULT_FROM_WIN32(GetLastError());
}
// If successful creation of the close event.
if (SUCCEEDED(hr))
{
// Start up Media Foundation platform.
hr = MFStartup(MF_VERSION);
_isOpen = true;
}
if (SUCCEEDED(hr))
{
// Select the encoder.
switch (encoder)
{
case Nequeo::Media::Foundation::EncoderType::H264:
// Create the H264 encoder.
hr = CreateEncoder(CLSID_CMSH264EncoderMFT);
break;
case Nequeo::Media::Foundation::EncoderType::AAC:
// Create the AAC encoder.
hr = CreateEncoder(CLSID_AACMFTEncoder);
break;
case Nequeo::Media::Foundation::EncoderType::MP3:
// Create the MP3 encoder.
hr = CreateEncoder(CLSID_MP3ACMCodecWrapper);
break;
default:
hr = ((HRESULT)-1L);
break;
}
}
if (SUCCEEDED(hr))
{
// Query for the IMFTransform interface
hr = _transformUnk->QueryInterface(IID_PPV_ARGS(&_encoder));
// Encoder has been created.
_created = true;
}
}
// Return the result.
return hr;
}
HRESULT MediaEncoder::CreateEncoder(const CLSID encoder)
{
HRESULT hr = S_OK;
// Create the decoder.
hr = CoCreateInstance(encoder, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&_transformUnk);
// Return the result.
return hr;
}
Decoder Beispiel: Initialisieren Sie den Decoder.
IUnknown *_transformUnk;
IMFTransform *_decoder;
HRESULT MediaDecoder::InitialiseDecoder(DecoderType decoder)
{
HRESULT hr = S_OK;
// Has the decoder been init.
if (!_isOpen)
{
_decoderType = decoder;
// Init the COM.
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
// Create a new close event handler.
_hCloseEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// If event was not created.
if (_hCloseEvent == NULL)
{
// Get the result value.
hr = __HRESULT_FROM_WIN32(GetLastError());
}
// If successful creation of the close event.
if (SUCCEEDED(hr))
{
// Start up Media Foundation platform.
hr = MFStartup(MF_VERSION);
_isOpen = true;
}
if (SUCCEEDED(hr))
{
// Select the decoder.
switch (decoder)
{
case Nequeo::Media::Foundation::DecoderType::H264:
// Create the H264 decoder.
hr = CreateDecoder(CLSID_CMSH264DecoderMFT);
break;
case Nequeo::Media::Foundation::DecoderType::AAC:
// Create the AAC decoder.
hr = CreateDecoder(CLSID_CMSAACDecMFT);
break;
case Nequeo::Media::Foundation::DecoderType::MP3:
// Create the MP3 decoder.
hr = CreateDecoder(CLSID_CMP3DecMediaObject);
break;
case Nequeo::Media::Foundation::DecoderType::MPEG4:
// Create the MPEG4 decoder.
hr = CreateDecoder(CLSID_CMpeg4sDecMFT);
break;
default:
hr = ((HRESULT)-1L);
break;
}
}
if (SUCCEEDED(hr))
{
// Query for the IMFTransform interface
hr = _transformUnk->QueryInterface(IID_PPV_ARGS(&_decoder));
// Decoder has been created.
_created = true;
}
}
// Return the result.
return hr;
}
HRESULT MediaDecoder::CreateDecoder(const CLSID decoder)
{
HRESULT hr = S_OK;
// Create the decoder.
hr = CoCreateInstance(decoder, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&_transformUnk);
// Return the result.
return hr;
}
Wenn Sie kodieren oder dekodieren Medien, IMFTransform
ist die Schnittstelle Codecs in Media Foundation-API aus. Das heißt, Sie implementieren es nicht - Sie nutzen die vorhandene Implementierung von Codecs, die Ihnen zur Verfügung stehen (Sie implementieren es, wenn Sie die API erweitern und zusätzlichen Codec bereitstellen möchten).
Auf Windows bietet Ihnen:
- AAC Decoder -
CLSID_CMSAACDecMFT
- AAC Encoder-
CLSID_AACMFTEncoder
- H.264 Video Decoder -
CLSID_CMSH264DecoderMFT
nutzt DXVA hardwaregestützte Decodierung wo immer anwendbar - H.264 Video Encoder-
CLSID_CMSH264EncoderMFT
, Software (Ausweich) Drehgeber
Weitere hardwarebeschleunigte Encoder können mit Hardwaretreibern geliefert werden. Alle oben genannten sind in Form von IMFTransform
verfügbar, können direkt oder über Media Foundation APIs auf höherer Ebene verwendet werden.
- 1. Codieren von rohen PCM zu AAC mit ffmpeg nativen AAC
- 2. URLs codieren und decodieren
- 3. Native JavaScript oder ES6-Methode zum Codieren und Decodieren von HTML-Entities?
- 4. JSON mit VBScript decodieren/codieren
- 5. Audio zu aac mit libavcodec codieren
- 6. ffmpeg: Transport-Stream (MPEG2 oder h264) in einen anderen Transportstream umwandeln (h264)
- 7. ffmpeg H264 Frame für Netzwerkstreaming gleichzeitig codieren
- 8. BISON Middleware für socket.io codieren/decodieren?
- 9. Codieren und Decodieren von Mac-Adresse von UUID mit C#
- 10. Fehler beim Codieren/Decodieren von String in Base64
- 11. Wirkt WCF automatisch URL-codieren/decodieren von Streams?
- 12. Convert von .mov zu .mp4 (oder h264) mit avconv
- 13. GIF-Frames decodieren und in ein Video codieren C#
- 14. wie eine einfache Zeichenfolge zu codieren/zu decodieren
- 15. Konvertieren PCM in AAC oder MP4-Datei ohne MediaMuxer
- 16. Implementieren von Voting oder "Likes" mit MySQL
- 17. Ich habe falsche Farbe beim Verschlüsseln und Decodieren h264 von Android Mediacodec
- 18. ffprobe zeigt Bitrate von 0,0 oder N/A für h264 Stream
- 19. extrahieren h264 rohen Video-Stream von MP4 oder FLV mit ffmpeg erzeugen einen ungültigen Stream
- 20. H264 Encoderfehler
- 21. URL- oder Base64- codieren Strings in Compass/SASS
- 22. HTML codieren Benutzereingabe beim Speichern oder beim Anzeigen
- 23. Stripe Backend implementieren - Best Practice zum lokalen Speichern von Daten oder zur Verwendung von API-Calls?
- 24. Java Codieren und dekodieren Zeichenfolge ohne Vorwärts- oder Rückwärtsstrich
- 25. Verwenden von NAudio zum Decodieren von Mu-Law-Audio
- 26. AAC/MP3 Lizenzierung
- 27. Implementieren Multithreading (oder Multiprozessing?) Mit diesem Skript?
- 28. Cant implementieren Ansicht OnClickListener oder ToolTipView.OnToolTipViewClickedListener
- 29. www.parse.com wie zu implementieren ODER Abfrage
- 30. UIViewController Protokoll als Parameter oder Rückgabetyp implementieren
Sind Ihre geposteten Links mit dem Code der vorherigen Antwort verknüpft? – DaveSmith
Ja, ich habe entsprechende COM-IDs (CLSIDs) hinzugefügt, um zu zeigen, wie genau diese zusammenhängen. –