如何加速OpenH264的解码器

时间:2016-09-02 20:38:30

标签: c++ performance h.264 codec openh264

故事

我正在开发一个平滑的60 FPS 1080p(全高清)视频传输应用程序,它以x264编码,通过LAN将编码数据发送到接收设备,接收设备然后使用OpenH264的解码器对其进行解码。我设法让它工作,它工作正常并且稳定,但我发现它非常慢(大约20 FPS而不是所需的60 FPS)。

问题

我做了大量测试,发现问题在于OpenH264解码器。

解码器使用我的i5-2500 @ 3.9Ghz的全核心(占总CPU使用率25%),这太高了。尽管解码器是单线程的,但我在Media Player Classic上测试了原始数据,并且它的播放(60 FPS)仅占CPU使用率的0.3%。 (将渲染引擎切换为“旧视频渲染”时,CPU使用率增加到12.8-14.4% - 请参阅注释)

所以我的问题是:我可以做些什么来加快解码过程以及我做错了什么?我无法想象OpenH264就是这么慢。

额外信息

  • 编码器可以使用大约20%的CPU轻松推出60 FPS 1080p。
  • 连接是有线局域网,可以按> 10MB / s,所以没问题。
  • 发送方和接收方PC都有8GB RAM。

代码

以下是与解码器相关的所有C ++代码:

ISVCDecoder *decoder;
SBufferInfo bufferInfo;
SDecodingParam decodingParam;
uint8_t** yuvData;

void init(int width, int height) {
    WelsCreateDecoder(&decoder);
    decodingParam = { 0 };
    decodingParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_AVC;
    decoder->Initialize(&decodingParam);
    bufferInfo = { 0 };

    yuvData = new uint8_t*[3];
    yuvData[0] = new uint8_t[width*height];
    yuvData[1] = new uint8_t[width*height / 4];
    yuvData[2] = new uint8_t[width*height / 4];
}

bool decode(cont unsigned char* rawEncodedData, int rawEncodedDataLength, uint8_t** yuvData) {
    int err = decoder->DecodeFrameNoDelay(rawEncodedData, rawEncodedDataLength, yuvData, &bufferInfo);
    if(err != 0) {
        std::cout << "H264 decoding failed. Error code: " << err << "." << std::endl;
        return false;
    }
    return true;
}

1 个答案:

答案 0 :(得分:1)

相对未优化的基于CPU的H.264解码器很容易变慢。 如果你在PC上并且你有一个硬件H.264解码器 - 你也可以使用它。

我会尝试:https://software.intel.com/en-us/media-sdk-support/code-samples