Реализация IMFTransform для кодирования или декодирования H264 или AAC

Можно IMFTransform должен быть реализован интерфейс для кодирования или декодирования данных H264 или AAC, или я должен использовать FFmpeg или же OpenH264.

0

Решение

Вы можете реализовать IMFTransform Интерфейс для декодирования и кодирования H264 и AAC. Ссылаться на CLSID_CMSH264DecoderMFT а также CLSID_CMSAACDecMFT декодировать H264 и ACC, также CLSID_CMSH264EncoderMFT а также CLSID_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;
}
2

Другие решения

Когда вы кодируете или декодируете медиа, IMFTransform интерфейсные кодеки, предоставляемые в Media Foundation API То есть вы его не реализуете — вы пользуетесь существующей реализацией доступных вам кодеков (вы реализуете это, когда хотите расширить API и предоставить дополнительный кодек).

Stock Windows предоставляет вам:

  • AAC декодерCLSID_CMSAACDecMFT
  • AAC EncoderCLSID_AACMFTEncoder
  • H.264 Video DecoderCLSID_CMSH264DecoderMFT, использует аппаратное декодирование DXVA, где это применимо
  • H.264 Video EncoderCLSID_CMSH264EncoderMFT, программный (резервный) кодировщик

Дополнительные аппаратно-ускоренные кодеры могут быть снабжены аппаратными драйверами. Все вышеперечисленное доступно в виде IMFTransform, могут быть использованы напрямую или с помощью API Media Foundation более высокого уровня.

3

По вопросам рекламы [email protected]