簡體   English   中英

實施“ IMFTransform”以編碼或解碼H264或AAC

[英]Implement 'IMFTransform' to encode or decode H264 or AAC

IMFTransform可以實現IMFTransform接口以對H264或AAC數據進行編碼或解碼,還是應該使用FFmpegOpenH264

在對媒體進行編碼或解碼時, IMFTransform是Media Foundation API中公開的接口編解碼器。 也就是說,您沒有實現它-您可以利用現有的編解碼器實現(您想擴展API並提供其他編解碼器時就可以實現)。

Stock Windows為您提供:

附加的硬件加速編碼器可能隨硬件驅動程序一起提供。 上面提到的所有內容都以IMFTransform的形式提供,可以直接使用,也可以使用更高級別的Media Foundation API來使用。

您可以實現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;
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM