2016-09-02 17 views
8

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.

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; 
} 
+1

Bạn đã thử định dạng mã chưa? – EvilTeach

+4

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. –

+0

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 –

Trả lời

1

Một CPU dựa bộ giải mã H.264 tương đối un được tối ưu hóa có thể dễ dàng thể là chậm. Nếu bạn đang sử dụng PC và bạn có bộ giải mã H.264 phần cứng - bạn cũng có thể sử dụng nó.

Tôi muốn thử: https://software.intel.com/en-us/media-sdk-support/code-samples

+0

Chuyển sang bộ giải mã H.264 của FFmpeg đã giải quyết được sự cố. Tôi vẫn có từ 20-35% CPU sử dụng nhưng cũng kết hợp một vài quy trình khác. Hóa ra bộ giải mã OpenH264 thực ra chỉ là chậm thôi ... – Roland

Các vấn đề liên quan