【问题标题】:How to speed up OpenH264's decoder如何加速 OpenH264 的解码器
【发布时间】:2017-01-11 00:59:42
【问题描述】:

故事

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

问题

我进行了广泛的测试,发现问题出在 OpenH264 解码器上。

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

所以我的问题是:我可以做哪些优化来加快解码过程,我做错了什么?我无法想象 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;
}

【问题讨论】:

  • 你试过分析代码吗?
  • 如果 Media Player Classic 使用 1.2% 的内核,它几乎肯定会将工作卸载到硬件视频解码器。
  • 在媒体播放器上试试这个然后测量媒体播放器的性能:pixelmetrics.com/Tips/VidBlank/MediaPlayer.php
  • @DietrichEpp 好点,我将渲染引擎更改为“旧视频渲染”,并将 CPU 使用率提高到 12.8 - 14.4%。 pasteboard.co/gcibDaq8F.png
  • 你可以尝试确保yuvData指向的3个块是连续的,即uint8_t * p = new uint8_t[width*height*3/2]; *yuvData=p; *(yuvData+1)=p+width*height; *(yuvData+2)=p+(width*height*5)/4;

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


【解决方案1】:

一个相对未优化的基于 CPU 的 H.264 解码器很容易变得那么慢。 如果您在 PC 上并且有硬件 H.264 解码器 - 您不妨使用它。

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

【讨论】:

  • 切换到 FFmpeg 的 H.264 解码器解决了这个问题。我仍然有 20-35% 的 CPU 使用率,但这也包含了一些其他进程。事实证明 OpenH264 解码器实际上就是这么慢......
猜你喜欢
  • 2018-05-14
  • 2017-07-02
  • 2018-10-20
  • 2017-03-22
  • 2019-10-30
  • 1970-01-01
  • 2020-12-25
  • 2016-10-27
  • 1970-01-01
相关资源
最近更新 更多