2017-02-18 1 views

Antwort

1

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; 
     } 
1

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:

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.

+0

Sind Ihre geposteten Links mit dem Code der vorherigen Antwort verknüpft? – DaveSmith

+0

Ja, ich habe entsprechende COM-IDs (CLSIDs) hinzugefügt, um zu zeigen, wie genau diese zusammenhängen. –

Verwandte Themen