当前位置: 首页 > news >正文

解决 FFmpeg 使用 C/C++ 接口时,解码没有 shell 快的问题(使用多线程)

一、问题

        硬件设备为香橙派 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 个线程。


http://www.mrgr.cn/news/96193.html

相关文章:

  • SpringBoot整合Easy-Es
  • Java-面向对象-多态和抽象类
  • 【进阶】vscode 中使用 cmake 编译调试 C++ 工程
  • NDK CMake工程中引入其他C++三方库
  • Redis和三大消息队列
  • STM32F103_LL库+寄存器学习笔记09 - DMA串口接收与DMA串口发送,串口接收空闲中断
  • VxKex无法通过快捷方式启动程序
  • gogs私服搭建
  • ZeroMQ介绍及如何交叉编译在嵌入式Linux下使用
  • ESP32-CAM在PlatformIO IDE里实现OTA的几个小TIPS
  • 骨密度以及骨密度测量,测量方案,意义;提高;实现方案
  • jmeter 镜像构建
  • C语言学习关键笔记
  • 数据结构C语言练习(顺序表)
  • 论文阅读笔记:Denoising Diffusion Implicit Models
  • nara wpe去混响学习笔记
  • 力扣刷题第一遍
  • Microi吾码界面设计引擎之基础组件用法大全【内置组件篇·中】
  • Leetcode算法方法总结
  • 生成器的应用 async与await实现