【发布时间】:2015-03-28 20:30:47
【问题描述】:
我能够使用 Media Foundation Transform (MFT) 成功地通过 H264 对数据进行编码,但不幸的是我得到了一个非常高的 CPU(当我在程序中评论这个函数的调用时我得到了低 CPU)。这是几个步骤跟着获取编码,所以我无法做任何改进它?任何想法都可以帮助
HRESULT MFTransform::EncodeSample(IMFSample *videosample, LONGLONG llVideoTimeStamp, MFT_OUTPUT_STREAM_INFO &StreamInfo, MFT_OUTPUT_DATA_BUFFER &encDataBuffer)
{
HRESULT hr;
LONGLONG llSampleDuration;
DWORD mftEncFlags, processOutputStatus;
//used to set the output sample
IMFSample *mftEncodedSample;
//used to set the output sample
IMFMediaBuffer *mftEncodedBuffer = NULL;
memset(&encDataBuffer, 0, sizeof encDataBuffer);
if (videosample)
{
//1=set the time stamp for the sample
hr = videosample->SetSampleTime(llVideoTimeStamp);
#ifdef _DEBUG
printf("Passing sample to the H264 encoder with sample time %i.\n", llVideoTimeStamp);
#endif
if (SUCCEEDED(hr))
{
hr = MFT_encoder->ProcessInput(0, videosample, 0);
}
if (SUCCEEDED(hr))
{
MFT_encoder->GetOutputStatus(&mftEncFlags);
}
if (mftEncFlags == MFT_OUTPUT_STATUS_SAMPLE_READY)
{
hr = MFT_encoder->GetOutputStreamInfo(0, &StreamInfo);
//create empty encoded sample
if (SUCCEEDED(hr))
{
hr = MFCreateSample(&mftEncodedSample);
}
if (SUCCEEDED(hr))
{
hr = MFCreateMemoryBuffer(StreamInfo.cbSize, &mftEncodedBuffer);
}
if (SUCCEEDED(hr))
{
hr = mftEncodedSample->AddBuffer(mftEncodedBuffer);
}
if (SUCCEEDED(hr))
{
encDataBuffer.dwStatus = 0;
encDataBuffer.pEvents = 0;
encDataBuffer.dwStreamID = 0;
//Two shall after this step points on the same address
encDataBuffer.pSample = mftEncodedSample;
hr = MFT_encoder->ProcessOutput(0, 1, &encDataBuffer, &processOutputStatus);
}
}
}
SafeRelease(&mftEncodedBuffer);
return hr;
}
【问题讨论】:
-
它需要高CPU使用率是合理的。你的目标是实时编码吗?您如何配置编码器(配置文件、比特率等)?
-
@AntonAngelov 帧率 (33 帧/秒) ...比特率 (400kbps)...分辨率 (640x480)....是的,编码器实时工作