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

多线程访问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,只是定位到后才开始各种上网搜寻,如此一来反而又耽误了一些时间。

        总之结果是好的,历时两天解决了这个问题,所以写个笔记记录一下供需要的孩子们参阅。

http://www.lryc.cn/news/515597.html

相关文章:

  • MySQL使用记录
  • 【视觉SLAM:六、视觉里程计Ⅰ:特征点法】
  • Python 数据结构揭秘:栈与队列
  • 常见的框架漏洞
  • 在C++中实现一个能够捕获弹窗、检查内容并在满足条件时点击按钮的程序;使用python的方案
  • 《Vue3实战教程》26:Vue3Transition
  • 【架构设计(一)】常见的Java架构模式
  • 自定义有序Map
  • Jenkins(持续集成与自动化部署)
  • redis7基础篇2 redis的哨兵模式2
  • windows终端conda activate命令行不显示环境名
  • SpringBoot 2.6 集成es 7.17
  • 加固服务器有什么用?
  • Personal APP
  • 探索最新的编程技术趋势:AI 编程助手和未来的编程方式
  • Android:文件管理:打开文件意图
  • 从纯虚类到普通类:提升C++ ABI兼容性的策略
  • QT中如何限制 限制QLineEdit只能输入字母,或数字,或某个范围内数字等限制约束?
  • Tailwind CSS 使用简介
  • iOS 逆向学习 - iOS Architecture Cocoa Touch Layer
  • C语言实现库函数strlen
  • 050_小驰私房菜_MTK Camera debug, data rate 、mipi_pixel_rate 确认
  • (六)vForm 动态表单(数据量大,下拉选卡顿问题)
  • 【mybatis-plus问题集锦系列】mybatis使用xml配置文件实现数据的基础增删改查
  • 投稿指南【NO.12_14】【极易投中】期刊投稿(毛纺科技)
  • 机器学习算法的分类
  • Linux操作系统下,挂ILA
  • HTML——26.像素单位
  • 【HTML】Day02
  • AI 自动化编程对编程教育的影响