2017-02-18 272 views

回答

1

您可以实现IMFTransform接口来解码和编码H264和AAC。参考CLSID_CMSH264DecoderMFTCLSID_CMSAACDecMFT来解码H264和ACC,也解码CLSID_CMSH264EncoderMFTCLSID_AACMFTEncoder以编码H264和ACC。编码器示例:初始化编码器。

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

解码器示例:初始化解码器。

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

当您对媒体进行编码或解码时,IMFTransform是媒体基础API中公开的接口解码器。也就是说,您不实现它 - 您可以利用现有的编解码器实现(您可以在扩展API并提供额外的编解码器时实现它)。

股票的Windows为您提供:

其他硬件加速编码器可能会提供硬件驱动程序。上述所有内容均以IMFTransform的形式提供,可以直接使用或使用更高级别的Media Foundation API。

+0

您的发布的链接与前一个回复所发布的帖子相关吗? – DaveSmith

+0

是的,我添加了相应的COM标识符(CLSID)以显示这些标识符的相关性。 –