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

javacv FFmpegFrameGrabber 阻塞重连解决方法汇总

  • JavaCV中FrameGrabber类可以连接直播流地址, 进行解码, 获取Frame帧信息, 常用方式如下
FrameGrabber grabber = new FrameGrabber("rtsp:/192.168.0.0");
while(true) {
    Frame frame = grabber.grabImage();
    // ...
}
  • 在如上代码中, 若连接地址网络不通, 或者连接超时, 则会出现程序阻塞卡死的情况, . 此时可以增加一个超时参数进行解决.
FrameGrabber grabber = new FrameGrabber("rtsp:/192.168.0.0");
// 增加超时参数
grabber.setOption(TimeoutOption.STIMEOUT.key(), "5000000");
while(true) {
    Frame frame = grabber.grabImage();
    // ...
}
  • 在上面的基础上, 若刚开始网络是通的, 程序可以获取到解码后的视频帧. 而在已经运行通了的时候, 网络突然断掉, 此时上面的timeout是不生效的。这个时候就阻塞卡住了。就算网络重新连上后,画面也会不动,没有恢复获取帧,搜了网上的资料有的说:
  • 方法(1)继承重写FrameGrabber类, 把超时callback增加到原代码,这样比较复杂,参考(https://github.com/bytedeco/javacv/blob/master/samples/FFmpegStreamingTimeout.java)
  • 方法(2)使用异步机制:启动一个单独的线程或使用Future/Callable来执行获取帧的操作,并设置合理的超时时间。超过设置的时间没有获取到帧信息后,就进行重连操作,这样就可以达到掉线重连了。

       ExecutorService executor = Executors.newCachedThreadExecutor();

       Callable<Frame> callableGrabImage = () -> grabber.grabImage();

       Future<Frame> futureFrame = executor.submit(callableGrabImage);

       Frame frame=futureFrame .get(10,TimeUnit.SECONDS)

       超过时间没有获取到frame重连就可以了


http://www.kler.cn/news/326461.html

相关文章:

  • 【深度学习基础模型】Hopfield 网络 (HN) 详细理解并附实现代码。
  • 【RabbitMQ】RabbitMq消息丢失、重复消费以及消费顺序性的解决方案
  • C#知识|设计模式的分类及认识
  • 从0学习React(1)
  • Goweb---Gorm操作数据库(三) 更新
  • 数学建模研赛总结
  • 【动态规划-分组背包】力扣1155. 掷骰子等于目标和的方法数
  • 并发编程三大特性(原子性、可见性、有序性)
  • 每日一题:⻓度最⼩的⼦数组
  • 计算机毕业设计 Java教务管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • python魔法(python高级magic方法进阶)
  • 【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第十五章 Linux 文件系统概念
  • 基于大数据的二手电子产品需求分析及可视化系统
  • open-resty 服务安装kafka插件
  • 深入理解EVM(以太坊虚拟机)及其工作原理,因为这将直接影响智能合约的开发。
  • 智融-SW6003 双向移动电源IC
  • P3131 [USACO16JAN] Subsequences Summing to Sevens S Python题解
  • idea使用技巧与插件推荐
  • 序列化方式五——ProtoStuff
  • JSON 教程
  • 什么Python库处理大量数据比较快?
  • Oracle 性能优化的高频面试题及答案
  • MySQL和Doris开窗函数LAG执行时的区别
  • PHP入门必看:从基础语法到实际应用,一文掌握Web开发的必备技能!
  • X-Spreadsheet:Web端Excel电子表格工具库
  • “AI+Security”系列第3期(五):AI技术在网络安全领域的本地化应用与挑战
  • 使用 Colly 在 Golang 中进行网页抓取的步骤
  • Rust Web自动化Demo
  • 《动手学深度学习》笔记2.4——神经网络从基础→进阶 (文件读写-保存参数和模型)
  • 堆的数组实现