【问题标题】:MFT Encoder (h264) High CPU utilizationMFT 编码器 (h264) 高 CPU 利用率
【发布时间】: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)....是的,编码器实时工作

标签: h.264 ms-media-foundation


【解决方案1】:

第一个关键是确保您已使用MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS 配置接收器。我还设置了MF_LOW_LATENCY 属性。

// error checking omitted for brevity
hr = attributes->SetUINT32(MF_READWRITE_ENABLE_HARDWARE_TRANSFORMS, TRUE);
hr = attributes->SetUINT32(MF_SINK_WRITER_DISABLE_THROTTLING, TRUE);
hr = attributes->SetUINT32(MF_LOW_LATENCY, TRUE);

另一个关键是确保您为源输出选择本机格式。否则,您将仍然非常失望。我详细描述了这个here

我还应该提到,您应该考虑在开始时创建一次转换样本和内存缓冲区,而不是在收到的每个样本上重新创建它们。

祝你好运。我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-21
    • 2015-10-22
    • 1970-01-01
    相关资源
    最近更新 更多