首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何加快OpenH264 264解码器的速度

如何加快OpenH264 264解码器的速度
EN

Stack Overflow用户
提问于 2016-09-02 20:38:30
回答 1查看 3.5K关注 0票数 10

故事

我正在开发一个平滑的60 FPS 1080 p(全高清)视频传输应用程序,它在x264中编码,通过局域网将编码的数据发送到接收设备,然后由接收设备使用OpenH264 264的解码器对其进行解码。我设法使它工作,它工作良好,稳定,但我发现它是非常慢(约20 FPS,而不是期望的60 FPS)。

问题

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

解码器使用我的i5-2500 @ 3.9Ghz的一个完整的核心( CPU使用率为25%),这太高了。即使解码器是单线程的,我在媒体播放器经典版上测试了原始数据,它的回放( 60 FPS)导致的CPU使用率仅为0.3%。(当将渲染引擎切换到“旧视频渲染”时,它的CPU使用率增加到12.8%-14.4%--参见注释)

所以我的问题是:,我能做什么优化来加速解码过程,我做错了什么?,我无法想象OpenH264就这么慢。

额外信息

  • 该编码器可以很容易地推出60 FPS 1080 p使用约20%的CPU。
  • 连接是有线局域网,可以推送>10 so /s,所以没有问题。
  • 发送机和接收机都有8GB内存。

代码

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

代码语言:javascript
运行
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-08 23:43:15

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39300387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档