Câu chuyện
Tôi đang làm việc trên một mịn 60 FPS 1080p (Full HD) Ứng dụng truyền video mã hóa trong x264, gửi dữ liệu được mã hóa qua mạng LAN với một thiết bị tiếp nhận, sau đó giải mã nó sử dụng bộ giải mã của OpenH264. Tôi quản lý để có được nó làm việc, và nó hoạt động tốt và ổn định, nhưng tôi thấy nó rất chậm (khoảng 20 FPS như trái ngược với 60 FPS mong muốn).
Làm thế nào để tăng tốc độ OpenH264 của bộ giải mã
Vấn đề
tôi đã làm thử nghiệm rộng rãi và thấy rằng vấn đề nằm với bộ giải mã OpenH264.
Bộ giải mã tận dụng toàn bộ lõi (tổng dung lượng sử dụng CPU 25%) của i5-2500 @ 3.9Ghz, quá cao. Mặc dù bộ giải mã là đơn luồng, tôi đã thử nghiệm dữ liệu thô trên Media Player Classic và phát lại (ở 60 FPS) dẫn đến chỉ sử dụng CPU 0,3%. (Khi chuyển công cụ render thành 'Old Video Render' nó tăng lên mức sử dụng CPU 12.8-14.4% - xem chú thích)
Vì vậy, câu hỏi của tôi là: Tôi có thể làm gì để tăng tốc quá trình giải mã và Tôi làm sai? Tôi không thể tưởng tượng OpenH264 chỉ là chậm.
Thông tin thêm
- Các bộ mã hóa có thể dễ dàng có thể đẩy ra 60 FPS 1080p sử dụng khoảng 20% CPU.
- Kết nối có dây LAN và có thể đẩy> 10MB/s, do đó, không có vấn đề gì.
- Cả máy tính người gửi và máy tính nhận đều có RAM 8GB.
Mã
Dưới đây là tất cả các mã C++ liên quan đến các bộ giải mã:
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;
}
Bạn đã thử định dạng mã chưa? – EvilTeach
Nếu Media Player Classic đang sử dụng 1,2% lõi, nó gần như chắc chắn sẽ tải công việc xuống bộ giải mã video phần cứng. –
Thử tính năng này trên trình phát đa phương tiện, sau đó đo hiệu suất của trình phát đa phương tiện: https://www.pixelmetrics.com/Tips/VidBlank/MediaPlayer.php –