一、問題
? ? ? ? 硬件設備為香橙派 5Plus,最近需要使用硬件視頻解碼來加速 YOLO 的檢測,shell 窗口的FFmpeg已經調通,詳見文章:
編譯支持 RKmpp 和 RGA 的 ffmpeg 源碼_rk3588 ffmpeg mpp-CSDN博客https://blog.csdn.net/plmm__/article/details/146188927?spm=1001.2014.3001.5501? ? ? ? 在實際測試時,發現c++接口的解碼占用情況較低,只有三個工作線程:
而使用 shell 窗口進行解碼時,可以達到13個線程:
二、使用多線程
? ? ? ? 詢問 AI 后,原來是解碼器的上下文?AVCodecContext 在初始化后默認是使用單線程,可以通過打印變量得到:
cout << "thread_count: " << codecContext->thread_count << endl;
我的輸出是 1。這里可以手動指定線程數,也可以改為 0 ,FFmpeg 會根據 CPU 核心數和編解碼器特性自動選擇線程數。
? ? ? ? 以下是我的代碼片段:
/* 初始化編解碼器上下文 */ codecContext = avcodec_alloc_context3(codec);if (!codecContext)throw std::runtime_error("Couldn't allocate decoder context");/* 獲取視頻流,它包含了視頻流的元數據和參數 */video_stream = formatContext->streams[videoStreamIndex];/* 復制視頻參數到解碼器上下文 */ if (avcodec_parameters_to_context(codecContext, video_stream->codecpar) < 0)throw std::runtime_error("Couldn't copy decoder context");/* 自動選擇線程數 */codecContext->thread_count = 0;
三、檢查
? ? ? ? 使用自動選擇線程數后,工作線程會在 3 到 10 和線程之間浮動:
這個只是綜合測試解碼的情況,如果只解碼并且不需要輸出,應該就可以達到 shell 的 13 個線程。