IMFTransform
인터페이스를 구현하여 H264 또는 AAC 데이터를 인코딩하거나 디코딩 할 수 있으며, 또는 OpenH264을 사용해야합니다.H264 또는 AAC 데이터를 인코딩하거나 디코딩하기 위해 'IMFTransform'을 구현하십시오.
0
A
답변
1
IMFTransform
인터페이스를 구현하여 H264 및 AAC를 디코딩하고 인코딩 할 수 있습니다. H264 및 ACC를 디코딩하려면 CLSID_CMSH264DecoderMFT
및 CLSID_CMSAACDecMFT
을, H264 및 ACC를 인코딩하려면 CLSID_CMSH264EncoderMFT
및 CLSID_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
CLSID_AACMFTEncoder
CLSID_CMSH264DecoderMFT
이 활용 DXVA의 하드웨어 지원 디코딩- AAC Decoder :
증권 윈도우를 제공합니다) 부호기
추가 하드웨어 가속 인코더는 하드웨어 드라이버와 함께 제공 될 수 있습니다. 위에서 언급 한 모든 것은 IMFTransform
형태로 제공되며 직접 사용하거나 상위 수준의 Media Foundation API를 사용할 수 있습니다.
게시 된 링크는 이전 답변에서 게시 한 코드와 관련이 있습니까? – DaveSmith
예, 해당 COM 식별자 (CLSID)를 추가하여 관련성을 정확히 보여줍니다. –