Я работаю над приложением для плавной передачи видео 60 FPS 1080p (Full HD), которое кодирует в x264, отправляет закодированные данные по локальной сети на принимающее устройство, которое затем декодирует их с помощью декодера OpenH264. Мне удалось заставить его работать, он работает нормально и стабильно, но я обнаружил, что он очень медленный (около 20 кадров в секунду в отличие от желаемых 60 кадров в секунду).
Я провел обширное тестирование и обнаружил, что проблема заключается в декодере OpenH264.
Декодер использует полное ядро (общее использование процессора 25%) моего i5-2500 при 3,9 ГГц, что слишком много. Несмотря на то, что декодер является однопоточным, я протестировал необработанные данные на Media Player Classic, и его воспроизведение (при 60 FPS) привело к загрузке процессора всего на 0,3%. (При переключении движка рендеринга на «Old Video Render» он увеличился до 12,8-14,4% загрузки процессора — см. Комментарии)
Итак, мой вопрос: Какие оптимизации я могу сделать, чтобы ускорить процесс декодирования, и что я делаю не так? Я не могу себе представить, что OpenH264 просто такой медленный.
Ниже приведен весь код 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;
}
Относительно неоптимизированный декодер H.264 на базе процессора может быть настолько медленным.
Если вы работаете на ПК и у вас есть аппаратный декодер H.264 — вы также можете его использовать.
Я бы попробовал: https://software.intel.com/en-us/media-sdk-support/code-samples
Других решений пока нет …