多线程访问FFmpegFrameGrabber.start方法阻塞问题
一、背景
项目集成网络摄像头实现直播功能需要用到ffmpeg处理rtmp视频流进行web端播放
通过网上资源找到大神的springboot项目实现了rtmp视频流转为http请求进行视频中转功能,其底层利用javacv的FFmpegFrameGrabber进行拉流、推流,进而实现了视频中转。
在此感谢大神提供的码云项目:EasyMedia: Springboot、netty实现的http-flv、websocket-flv直播点播,支持rtsp、h264、h265、rtmp等多种源,h5纯js播放(不依赖flash),不需要nginx等第三方拉流服务
二、问题
项目运行起来后各方面都正常,选取了有信号的视屏流地址均可以正常播放,但是将并发数量增加,并且有一部分存在无信号的情况时,拉流功能被阻塞。
通过排查定位发现,FFmpegFrameGrabber对象的start方法并不支持多线程访问,也就是说同时来了多个请求时它会内部形成阻塞队列进行等待。


这就导致,当大量请求同时进入时,它会按照阻塞的情况进行处理,而我们多线程的请求访问将失去意义。就算将超时时间设置的极短,5秒、3秒等,当十几二十个请求同时进入时,它也会按照等差数列进行堆叠,最后一个请求的等待时长将是:请求数量*平均每个的处理时长,假设有20个请求,平局每个请求设置超时未5秒,最后一个请求将会等待100秒。
然而请求时轮训访问的时间只会越来越久,于是开始寻求解决方案。
三、解决
该模式为典型的线程安全阻塞处理逻辑,所以我们去查找FFmpegFrameGrabber是否有非阻塞的方法或者可以实现非阻塞的逻辑即可。
查找API发现了同样入坑的友军,解决方案也是简单粗暴:
将start();改为startUnsafe();即可解决问题。

笔者将超时时间设置为10秒,从日志可以看到,多个请求同时进入时实现了异步操作,同时开始了拉流操作,进而解决了阻塞的问题。
四、总结
问题的解决其实很简单,但是从出现问题到定位问题历时很长。
首先是对这份开源代码的不太理解,每次阅读个大概就匆匆跳过,导致对整个流程总是一知半解,在浪费了大半天时间后才决定静下心来从头梳理下代码逻辑。其次是对问题的根源没有抓准,没有将详细的日志梳理分析,只是大概的定位到多线程执行阻塞。最后,在定位到问题对应的代码行后仍然无法进一步处理,工欲善其事必先利其器,笔者未实现熟悉相关API,只是定位到后才开始各种上网搜寻,如此一来反而又耽误了一些时间。
总之结果是好的,历时两天解决了这个问题,所以写个笔记记录一下供需要的孩子们参阅。
相关文章:
多线程访问FFmpegFrameGrabber.start方法阻塞问题
一、背景 项目集成网络摄像头实现直播功能需要用到ffmpeg处理rtmp视频流进行web端播放 通过网上资源找到大神的springboot项目实现了rtmp视频流转为http请求进行视频中转功能,其底层利用javacv的FFmpegFrameGrabber进行拉流、推流,进而实现了视频中转。 …...
MySQL使用记录
char和varchar varchar是可变长的,实际用多少它就占多少,和char不同,char规定多少它就会占多少 varchar的长度是字符个数,不管是数字、英文还是汉字,varchar(10)都可以存10个,而不会出现因为汉字占更多的字…...
【视觉SLAM:六、视觉里程计Ⅰ:特征点法】
视觉里程计(Visual Odometry, VO)是通过处理图像序列,估计摄像头在时间上的相对位姿变化的技术。它是视觉SLAM的重要组成部分之一,主要通过提取图像中的信息(如特征点或直接像素强度)来实现相机运动估计。以…...
Python 数据结构揭秘:栈与队列
栈(Stack) 定义 栈是一种后进先出(Last In First Out, LIFO)的数据结构。它类似于一个容器,只能在一端进行插入和删除操作。栈有两个主要的操作:push(入栈)和 pop(出栈…...
常见的框架漏洞
1.Thinkphp Thinkphp5x远程命令执行及getshell 搭建靶场 cd vulhub/thinkphp/5-rce docker-compose up -d 首页 漏洞根本源于 thinkphp/library/think/Request.php 中method方法可以进行变量覆盖,通过覆盖类的核心属性filter导致rce,其攻击点较为多&…...
在C++中实现一个能够捕获弹窗、检查内容并在满足条件时点击按钮的程序;使用python的方案
在C中实现一个能够捕获弹窗、检查内容并在满足条件时点击按钮的程序是相当复杂的,因为C本身并不直接提供高级的GUI自动化功能。通常,这样的任务会使用Windows API(如User32.dll中的函数)或者一些第三方库(如UIAutomati…...
《Vue3实战教程》26:Vue3Transition
如果您有疑问,请观看视频教程《Vue3实战教程》...
【架构设计(一)】常见的Java架构模式
常见的 Java 架构模式解析 在 Java 开发领域,选择合适的架构模式对于构建高效、可维护且能满足业务需求的软件系统至关重要。本文将深入探讨几种常见的 Java架构模式,包括单体架构与微服务架构、分层架构与微服务架构的对比,以及事件驱动架构…...
自定义有序Map
package cn.ziqirj.common.utils;import lombok.Getter; import lombok.Setter;import java.util.ArrayList; import java.util.List;/*** 模拟Map集合,key不可重复,按插入顺序排序* author zhangji** param <T>*/ public class CustomOrderlyMap&…...
Jenkins(持续集成与自动化部署)
Jenkins 是一个开源软件项目,是基于Java开发的一种持续集成工具。 官网:https://www.jenkins.io/ GitLab安装使用 安装前提:内存至少需要4G 官方网站:https://about.gitlab.com/ 安装文档:https://docs.gitlab.c…...
redis7基础篇2 redis的哨兵模式2
目录 一 哨兵模式 1.1 redis的哨兵模式作用 1.2 redis的哨兵模式架构 1.3 redis的哨兵模式参数说明 二 redis的哨兵模式搭建 2.1 redis的主从复制模式 2.2 redis的sentinel配置文件 2.3 redis的实例节点和sentinel节点启动 3.3 redis的哨兵模式原理 3.3.1 redis的哨兵…...
windows终端conda activate命令行不显示环境名
问题: 始终不显示环境名 解决 首先需要配置conda的环境变量 确保conda --version能显示版本 然后对cmd进行初始化,如果用的是vscode中的终端,那需要对powershell进行初始化 Windows CMD conda init cmd.exeWindows PowerShell conda …...
SpringBoot 2.6 集成es 7.17
引言 在现代应用开发中,Elasticsearch作为一个强大的搜索引擎和分析引擎,已经成为许多项目不可或缺的一部分。Spring Boot作为Java生态中最受欢迎的微服务框架之一,其对Elasticsearch的支持自然也是开发者关注的焦点。本文将详细介绍如何在S…...
加固服务器有什么用?
为什么越来越多的企业和个人都在加固他们的服务器?加固服务器不仅可以保护数据安全,还能提升整体系统的稳定性和可靠性。下面是聚名网的一些介绍。 加固服务器的首要目的就是提高安全性。随着网络攻击手段的不断演变,黑客和恶意软件的威胁也…...
Personal APP
1、Matlab 2023b https://www.bilibili.com/opus/887246540317392920 https://blog.csdn.net/qq_25719943/article/details/138096918 https://www.jokerdown.com/22886.html 2、 3、...
探索最新的编程技术趋势:AI 编程助手和未来的编程方式
随着技术的飞速发展,编程技术领域在近年来经历了深刻的变革。从人工智能到低代码开发工具,新的技术趋势不断涌现,不仅大幅提高了开发效率,也重新定义了开发者的角色和工作方式。本篇博客将探讨几项当前最值得关注的编程技术&#…...
Android:文件管理:打开文件意图
三步走: 一、先在AndroidManifest.xml声明provider: <providerandroid:name"androidx.core.content.FileProvider"android:authorities"${applicationId}.FileProvider"android:exported"false"android:grantUriPermi…...
从纯虚类到普通类:提升C++ ABI兼容性的策略
在C编程中,纯虚类(也被称为抽象类)通常用于定义接口,而普通类则包含具体的实现。然而,在某些情况下,将纯虚类转换为普通类并提供默认实现,可以显著提升应用程序二进制接口(ABI&#…...
QT中如何限制 限制QLineEdit只能输入字母,或数字,或某个范围内数字等限制约束?
在 Qt 中,你可以通过多种方式来限制 QLineEdit 只能输入特定类型的字符,如字母、数字或某个范围内的数字。以下是一些常见的方法: 1. 使用输入验证器(QIntValidator, QDoubleValidator, QRegExpValidator) Qt 提供了…...
Tailwind CSS 使用简介
参考网站安装 - Tailwind CSS 中文网 号称是开始使用 Tailwind CSS 通过 npm 安装 tailwindcss,并创建你的 tailwind.config.js 文件。 npm install -D tailwindcss npx tailwindcss init 在 tailwind.config.js 文件中添加所有模板文件的路径。 /** type {im…...
DAMO-YOLO手机检测结果结构化解析:JSON输出格式与数据库存储设计
DAMO-YOLO手机检测结果结构化解析:JSON输出格式与数据库存储设计 1. 引言:从检测框到结构化数据 当你运行一个手机检测模型,看到屏幕上出现一个个红色的方框时,你可能在想:这些检测结果怎么用起来?怎么保…...
从‘棋盘’到‘行军’:手把手解析SRAM测试中的March与Checkerboard算法,你的芯片选对了吗?
从‘棋盘’到‘行军’:SRAM测试算法实战选型指南 在芯片验证的战场上,SRAM测试算法的选择就像为不同地形配备最合适的战术方案。当存储单元数量突破百万级,一个低效的测试算法可能导致产线吞吐量下降30%以上,而错误的算法选择则可…...
SDMatte模型部署故障排查手册:从环境配置到推理失败的常见问题
SDMatte模型部署故障排查手册:从环境配置到推理失败的常见问题 1. 引言 最近在星图平台部署SDMatte模型时,遇到了不少坑。作为一款强大的图像抠图模型,SDMatte在实际部署过程中可能会遇到各种环境配置和调用问题。本文将汇总我在部署过程中…...
如何在 Go 中安全高效地将 SSH 公钥复制到远程服务器
本文介绍使用 Go 标准库 os/exec 直接将本地 SSH 公钥写入远程服务器 ~/.ssh/authorized_keys 的正确方法,避免 shell 字符串拼接风险,兼容 macOS/Linux 环境,且不依赖 ssh-copy-id。 本文介绍使用 go 标准库 os/exec 直接将本地 ssh 公…...
tabula-py错误处理大全:解决10个最常见的表格提取问题
tabula-py错误处理大全:解决10个最常见的表格提取问题 【免费下载链接】tabula-py Simple wrapper of tabula-java: extract table from PDF into pandas DataFrame 项目地址: https://gitcode.com/gh_mirrors/ta/tabula-py 在处理PDF表格数据时,…...
Android Studio中文插件终极指南:3步搞定界面汉化,开发效率翻倍!
Android Studio中文插件终极指南:3步搞定界面汉化,开发效率翻倍! 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChinese…...
neobundle.vim多版本控制系统支持:Git、SVN、Mercurial完全攻略
neobundle.vim多版本控制系统支持:Git、SVN、Mercurial完全攻略 【免费下载链接】neobundle.vim Next generation Vim package manager 项目地址: https://gitcode.com/gh_mirrors/ne/neobundle.vim neobundle.vim作为下一代Vim包管理器,提供了对…...
用位掩码实现 Harness 的权限快速校验
用位掩码实现 Harness 的权限快速校验:从底层原理到亿级架构下的落地实践 关键词 位掩码(Bitmask)、权限校验(Authorization)、Harness CI/CD、二进制运算(Bitwise Operations)、RBAC/RBAC+(基于角色的访问控制)、性能优化(Performance Optimization)、低延迟系统(…...
2026产线痛点终结者:Java+YOLOv11+ByteTrack,彻底解决光电计数不准的行业难题
一、前言:被光电传感器支配的工业计数噩梦 2026年的今天,绝大多数工厂的传送带零件计数,依然在靠几十年前的光电传感器硬扛。 上个月我接手了一家汽车零部件厂的计数系统改造项目,他们的情况几乎是整个行业的缩影:用了6年的欧姆龙E3Z光电传感器,只要零件出现重叠、倾斜…...
