2017-02-18 9 views

답변

1

IMFTransform 인터페이스를 구현하여 H264 및 AAC를 디코딩하고 인코딩 할 수 있습니다. H264 및 ACC를 디코딩하려면 CLSID_CMSH264DecoderMFTCLSID_CMSAACDecMFT을, H264 및 ACC를 인코딩하려면 CLSID_CMSH264EncoderMFTCLSID_AACMFTEncoder을 참조하십시오.

인코더 예제 : 인코더를 초기화하십시오.

 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은 Media Foundation API에서 표시되는 인터페이스 코덱입니다. 즉, 구현하지 않습니다. 기존 코덱 구현을 활용할 수 있습니다 (API를 확장하고 추가 코덱을 제공하려는 경우 구현 함). 대체 (CLSID_CMSH264EncoderMFT, 소프트웨어 - CLSID_CMSAACDecMFT

  • AAC Encoder - - CLSID_AACMFTEncoder
  • H.264 Video Decoder - 어디든지 적용 CLSID_CMSH264DecoderMFT이 활용 DXVA의 하드웨어 지원 디코딩
  • H.264 Video Encoder

    • AAC Decoder :

      증권 윈도우를 제공합니다) 부호기

    추가 하드웨어 가속 인코더는 하드웨어 드라이버와 함께 제공 될 수 있습니다. 위에서 언급 한 모든 것은 IMFTransform 형태로 제공되며 직접 사용하거나 상위 수준의 Media Foundation API를 사용할 수 있습니다.

  • +0

    게시 된 링크는 이전 답변에서 게시 한 코드와 관련이 있습니까? – DaveSmith

    +0

    예, 해당 COM 식별자 (CLSID)를 추가하여 관련성을 정확히 보여줍니다. –