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

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.lryc.cn/news/451238.html

相关文章:

  • 自然语言处理问答系统技术
  • 交换机和路由器的区别
  • JavaScript Array(数组)
  • 示例说明:elasticsearch实战应用
  • 暴力匹配算法和 KMP 算法的优缺点分别是什么?
  • web笔记
  • 【网络安全】-访问控制-burp(1~6)
  • iOS 项目中的多主题颜色设计与实现
  • Android Camera2 与 Camera API技术探究和RAW数据采集
  • [python][pipenv]pipenv的使用
  • SpringSession微服务
  • 强化学习:通过试错学习最优策略---示例:使用Q-Learning解决迷宫问题
  • OpenGL ES 纹理(7)
  • 【C#】CacheManager:高效的 .NET 缓存管理库
  • 【数学分析笔记】第4章第2节 导数的意义和性质(2)
  • 深度学习:迁移学习
  • Footprint Growthly Quest 工具:赋能 Telegram 社区实现 Web3 飞速增长
  • 进入xwindows后挂起键盘鼠标没有响应@FreeBSD
  • CentOS7.9 snmptrapd更改162端口
  • 模糊测试SFuzz亮相第32届中国国际信息通信展览会
  • CMake学习
  • 书生·浦语大模型全链路开源开放体系
  • PHP安装swoole扩展无效,如何将文件上传至Docker容器
  • Web3.0 应用项目
  • Linux 学习笔记(十六)—— 重定向与缓冲区
  • 828华为云征文|WordPress部署
  • 华为开源自研AI框架昇思MindSpore应用案例:计算高效的卷积模型ShuffleNet
  • 《C++ 小游戏:简易飞机大战游戏的实现》
  • SpringCloud源码:服务端分析(二)- EurekaServer分析
  • 插槽slot在vue中的使用