如何加速OpenH264的解码器
How to speed up OpenH264's decoder
故事
我正在开发一个流畅的 60 FPS 1080p(全高清)视频传输应用程序,它以 x264 编码,通过 LAN 将编码数据发送到接收设备,然后使用 OpenH264 的解码器对其进行解码。我设法让它工作,它运行良好且稳定,但我发现它非常慢(大约 20 FPS,而不是所需的 60 FPS)。
问题
我进行了大量测试,发现问题出在 OpenH264 解码器上。
解码器使用了我的 i5-2500 @ 3.9Ghz 的完整核心(25% CPU 使用率),这太高了。尽管解码器是单线程的,但我在 Media Player Classic 上测试了原始数据,其播放(以 60 FPS 的速度)仅导致 0.3% CPU 使用率。 (当将渲染引擎切换到 'Old Video Render' 时,它增加到 12.8-14.4% CPU 使用率——见评论)
所以我的问题是:我可以做哪些优化来加快解码过程,我做错了什么?我无法想象 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;
}
相对未优化的 CPU 基于 H.264 解码器很容易会那么慢。
如果您在 PC 上并且拥有硬件 H.264 解码器 - 您不妨使用它。
我会尝试:https://software.intel.com/en-us/media-sdk-support/code-samples
故事
我正在开发一个流畅的 60 FPS 1080p(全高清)视频传输应用程序,它以 x264 编码,通过 LAN 将编码数据发送到接收设备,然后使用 OpenH264 的解码器对其进行解码。我设法让它工作,它运行良好且稳定,但我发现它非常慢(大约 20 FPS,而不是所需的 60 FPS)。
问题
我进行了大量测试,发现问题出在 OpenH264 解码器上。
解码器使用了我的 i5-2500 @ 3.9Ghz 的完整核心(25% CPU 使用率),这太高了。尽管解码器是单线程的,但我在 Media Player Classic 上测试了原始数据,其播放(以 60 FPS 的速度)仅导致 0.3% CPU 使用率。 (当将渲染引擎切换到 'Old Video Render' 时,它增加到 12.8-14.4% CPU 使用率——见评论)
所以我的问题是:我可以做哪些优化来加快解码过程,我做错了什么?我无法想象 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;
}
相对未优化的 CPU 基于 H.264 解码器很容易会那么慢。 如果您在 PC 上并且拥有硬件 H.264 解码器 - 您不妨使用它。
我会尝试:https://software.intel.com/en-us/media-sdk-support/code-samples