我正试图从媒体基金会得到一个硬件解码器。我确信我的gpu支持nvdec硬件解码。我在github上找到了一个示例,它可以获得编码器nvenc,没有任何问题。但是当我切换到译码器时,我要么得到一个坏的结果,要么崩溃。我甚至试图通过改变硬件标志来获得一个软件解码器,结果仍然很糟糕。谁知道怎么回事?我想不出还有什么东西留给我去尝试或改变
HRESULT get_decoder(CComPtr<IMFTransform>& out_transform, CComPtr<IMFActivate>& out_activate,
CComPtr<IMFAttributes>& out_attributes)
{
HRESULT hr = S_OK;
// Find the decoder
CComHeapPtr<IMFActivate*> activate_raw;
uint32_t activateCount = 0;
// Input & output types
const MFT_REGISTER_TYPE_INFO in_info = { MFMediaType_Video, MFVideoFormat_H264 };
const MFT_REGISTER_TYPE_INFO out_info = { MFMediaType_Video, MFVideoFormat_NV12 };
// Get decoders matching the specified attributes
if (FAILED(hr = MFTEnum2(MFT_CATEGORY_VIDEO_DECODER, MFT_ENUM_FLAG_SYNCMFT | MFT_ENUM_FLAG_SORTANDFILTER, &in_info, &out_info,
nullptr, &activate_raw, &activateCount)))
return hr;
// Choose the first returned decoder
out_activate = activate_raw[0];
// Memory management
for (int i = 1; i < activateCount; i++)
activate_raw[i]->Release();
// Activate
if (FAILED(hr = out_activate->ActivateObject(IID_PPV_ARGS(&out_transform))))
return hr;
// Get attributes
if (FAILED(hr = out_transform->GetAttributes(&out_attributes)))
return hr;
std::cout << "- get_decoder() Found " << activateCount << " decoders" << std::endl;
return hr;
}
发布于 2022-01-10 15:24:27
可能没有专门用于硬件解码的译码器MFT (尽管有些供应商提供这些译码器)。与编码不同的是,硬件视频解码是通过DXVA2API提供的,并且--反过来--是由微软H264视频解码器覆盖的。
该股票MFT能够使用硬件进行解码,并与启用D3D9和D3D11的管道兼容。
微软H264视频解码器 6个属性:
属性
来自MSDN
CODECAPI_AVDecVideoAcceleration_H264
启用或禁用硬件加速。 ..。 最大分辨率4096×2304像素DXVA加速的最大保证分辨率为1920×1088像素;在分辨率较高的情况下,采用DXVA进行解码,如果得到底层硬件的支持,则用软件进行解码。 ..。 译码器支持DXVA版本2,但不支持DXVA版本1。DXVA解码只支持与主兼容的基线、主位流和高配置文件比特流。(与主兼容的基线比特流定义为profile_idc=66和constrained_set1_flag=1。)
要使用硬件加速进行解码,只需使用微软H264视频解码器MFT。
https://stackoverflow.com/questions/70653670
复制相似问题