IMFTransform
接口可以被实现为编码或解码H264或AAC数据,还是应该使用FFmpeg或OpenH264。执行'IMFTransform'来编码或解码H264或AAC
0
A
回答
1
您可以实现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;
}
1
当您对媒体进行编码或解码时,IMFTransform
是媒体基础API中公开的接口解码器。也就是说,您不实现它 - 您可以利用现有的编解码器实现(您可以在扩展API并提供额外的编解码器时实现它)。
股票的Windows为您提供:
- AAC Decoder -
CLSID_CMSAACDecMFT
- AAC Encoder -
CLSID_AACMFTEncoder
- H.264 Video Decoder -
CLSID_CMSH264DecoderMFT
,利用DXVA硬件辅助解码(如适用) - H.264 Video Encoder -
CLSID_CMSH264EncoderMFT
,软件(回退)编码器
其他硬件加速编码器可能会提供硬件驱动程序。上述所有内容均以IMFTransform
的形式提供,可以直接使用或使用更高级别的Media Foundation API。
相关问题
- 1. PHP JSON编码或解码?
- 2. FFmpeg解码H264
- 3. 如何编码或解码ascii编解码器?
- 4. 解码h264视频
- 5. 解码H264帧C#
- 6. AAC编解码器库(libFAAC替代品)
- 7. FFmpeg的AAC(“libfaac”)编解码器选项?
- 8. h264编解码器在VLC 2.0.5
- 9. 什么是更快:解码H264 1920x1080,并显示在屏幕1920x1080或解码H264 1280x720和显示1920x1080?
- 10. ffmpeg:将传输流(MPEG2或h264)重新编码为另一个传输流(h264)
- 11. Android MediaCodec AAC编码器
- 12. 用AAC编码器录音?
- 13. C/C++ H264或ON VP6开源视频编码器
- 14. Java播放AAC编码音频(JAAD解码器)
- 15. mediacodec解码h264流限制
- 16. 在ios中解码h264
- 17. 部分解码h264流
- 18. 在ios上解码h264
- 19. FFmpeg不解码h264流
- 20. FFmpeg C++ H264解码错误
- 21. JPEG编码为H264视频
- 22. Xuggler H264 FPS编码问题
- 23. C++ H264的ffmpeg/libav编码/解码(无损)发出
- 24. 如何解码从yuv444p帧编码的h264视频?
- 25. 解码JSON来的NSArray或NSDictionary中
- 26. 是否可以使用directshow的Windows 7附带的h264和aac编码器?
- 27. 编码和解码自定义可执行代码
- 28. 如何使用H263或MPEG-4编解码器对OpenCV IplImage进行编码?
- 29. 解释执行java代码的顺序或优先级?
- 30. 使用MediaCodec和MTK编解码器编码时选择H264配置文件
您的发布的链接与前一个回复所发布的帖子相关吗? – DaveSmith
是的,我添加了相应的COM标识符(CLSID)以显示这些标识符的相关性。 –