JAVA 利用FFmpegFrameGrabber 获取rstp监控视频流截图工具

       最近在项目内碰见一个需求,需要通过监控视频连接获取视频流截取流内的图片并保存的功能,在网上找了各种方案费了些时间,写了个工具类,留作以后参考

依赖包

 <dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.4.4</version><type>pom</type></dependency>

工具类

package com.alex.project.tool.utils;import org.bytedeco.javacv.*;
import org.bytedeco.javacv.Frame;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;public class VideoUtils {private static final Logger log = LoggerFactory.getLogger(VideoUtils.class);private static String rtspTransportType = "tcp";/***       * 视频帧率**/private static int frameRate = 25;/*** 视频宽度*/private static int frameWidth =  1920;/*** 视频高度*/private static int frameHeight = 1080;/*** 遍历100次确保实时图片显示正常图片*/private static int count=100;/*** 解析视频地址并截图* @param path rstp 流地址* @param picPath 图片存放地址* @throws Exception*/public static void getVideoImagePathByRSTP(String path, String picPath) throws Exception {//创建rstp流对象FFmpegFrameGrabber grabber = createGrabber(path);try {//开启流获取grabber.start();//由于视频第一帧的流可能为黑屏 为了确保实时能截取到准确图像// 故此做了个for循环用于覆盖生成图片for (int i=0;i<count;i++){//获取流视频框内的图像Frame frame = grabber.grabFrame();//转换图像Java2DFrameConverter converter = new Java2DFrameConverter();BufferedImage srcImage = converter.getBufferedImage(frame);//自定义画图
//            int w = srcImage.getWidth();
//            int h = srcImage.getHeight();
//            System.out.println(srcImage.);
//            int weight = 1280;
//            int height = new BigDecimal(weight).divide(new BigDecimal(w), 2, RoundingMode.HALF_UP).multiply(new BigDecimal(h)).setScale(0, RoundingMode.HALF_UP).intValue();
//            BufferedImage bufferedImage = new BufferedImage(weight, height, BufferedImage.TYPE_3BYTE_BGR);
//            bufferedImage.getGraphics().drawImage(srcImage.getScaledInstance(weight, height, Image.SCALE_SMOOTH), 0, 0, null);if (srcImage!=null) {//创建文件File file = new File(picPath);//输出文件ImageIO.write(srcImage, "jpg", file);}}}catch (Exception e){e.printStackTrace();}finally {grabber.stop();grabber.close();}}/*** 构造视频抓取器** @param rtsp 拉流地址* @return*/private static FFmpegFrameGrabber createGrabber(String rtsp) {// 获取视频源try {FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(rtsp);//设置传输方式 TCP | UDPgrabber.setOption("rtsp_transport", rtspTransportType);//设置帧率grabber.setFrameRate(frameRate);//设置获取的视频宽度grabber.setImageWidth(frameWidth);//设置获取的视频高度grabber.setImageHeight(frameHeight);// 设置采集器构造超时时间(单位微秒,1秒=1000000微秒)//  grabber.setOption("stimeout", "2000000000");//设置视频bit率//   grabber.setVideoBitrate(2000000);return grabber;} catch (FrameGrabber.Exception e) {log.error("创建解析rtsp FFmpegFrameGrabber 失败");log.error("create rtsp FFmpegFrameGrabber exception: ", e);return null;}}public static void main(String[] args) {try {//参数1 rtsp 地址自行获取  参数2  截取图片存放地址VideoUtils.getVideoImagePathByRSTP("rtsp://***", "E:/pic/1000.jpg");} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}}

工具使用时需注意的点
1.目前测试能解析的视频流有H265,H264的流,不支持Smart…流
2.当碰见无法解析的流时会产生阻塞
3. 截取流内的图片第一帧,不一定是监控图,建议多遍历几次覆盖刷新输出的图片

如果大家有好的想法可以探讨下

JAVA 利用FFmpegFrame 获取rstp监控视频流截图相关推荐

  1. java 利用ManagementFactory获取jvm,os的一些信息--转

    原文地址:http://blog.csdn.net/dream_broken/article/details/49759043 想了解下某个Java项目的运行时jvm的情况,可以使用一些监控工具,比如 ...

  2. java利用Scanner获取键盘输入

    借鉴自:点击打开链接 ,自己手打了一遍 1.从控制台接收一个字符 import java.io.IOException;/*** @author wanniwa* @date 2018/6/22 15 ...

  3. Java利用PropertyDescriptor获取属性的 getter/setter 方法

    PropertyDescriptor类: PropertyDescriptor类表示JavaBean类通过存储器导出一个属性.主要方法:     1. getReadMethod(),获得用于读取属性 ...

  4. java线程future_Java中多线程对运行结果怎么利用future获取

    Java中多线程对运行结果怎么利用future获取 发布时间:2020-12-07 17:11:08 来源:亿速云 阅读:124 作者:Leah Java中多线程对运行结果怎么利用future获取?针 ...

  5. Java获取Prometheus监控指标数据

    Java获取Prometheus监控指标数据 一. 准备工作 1. 有可以被Prometheus监控的服务 没有的话可以参考以下链接本地搭建:SpringBoot应用接入Prometheus+Graf ...

  6. VB实现USB摄像头视频图像的监控、截图、录像

    本程序用四个按钮实现对摄像头视频的监控.截图.录像,可以分别保存为图片文件和视频文件.保存的视频文件可以用媒体播放机(Windows Media Player). 暴风影音等软件进行播放,轻松实现家庭 ...

  7. java毕业设计——基于java+Socket+sqlserver的远程监控系统软件设计与实现(毕业论文+程序源码)——远程监控系统

    基于java+Socket+sqlserver的远程监控系统软件设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+Socket+sqlserver的远程监控系统软件设计与实现,文章 ...

  8. 在Linux上利用python获取本机ip

    下面介绍在Linux上利用python获取本机ip的方法. 经过网上调查, 发现大致有两种方法, 一种是调用shell脚本,另一种是利用python中的socket等模块来得到,下面是这两种方法的源码 ...

  9. ParameterizedType应用,java反射,获取参数化类型的class实例

    ParameterizedType是一个接口,这个类可以用来检验泛型是否被参数化 比如: class Dao<T> {public Dao(){} } 上面的这个类,也就是泛型类,当有子类 ...

最新文章

  1. Brian 的 Perl 问题之万能指南
  2. 通过mtd读写flash_关于如何在kernel起来之后通过直接dd读写nand flash分区来更新zImage的mtd问题...
  3. Maven自动FTP远程部署
  4. IDC公司对未来5年的10项IT预测
  5. 服务器io修改,更改 Linux I/O 调度器来改善服务器性能
  6. c语言变量申明和定义区别,C语言中变量定义与声明的区别
  7. Quartus17下使用Modelsim10进行仿真
  8. 2017商业科技市场预测:云计算改变行业的十大关键发展
  9. TP-LINK路由器手动设置网关、DNS、开启DHCP并指定地址池IP范围
  10. Nebula Graph介绍和SpringBoot环境连接和查询
  11. graphql java如何使用_graphql-java使用手册:part10 如何落地应用(Application concerns)...
  12. linux系统连接校园无线网卡,Linux连接校园网
  13. python重启路由器_python 实现重启路由器
  14. 电压源和电流的关联参考方向_在大学《电路原理》中,电流源和电压源如何判断关联参考方向和非关联参考方向?...
  15. svn强制弹出账号密码对话框
  16. 【转载】使用Pytorch进行图像分类,AI challenger 农作物病害分类竞赛源码解读
  17. Android流媒体开发之 自定义一个完备的log模块
  18. python图像处理:全景图片转鱼眼图片(鱼眼矫正)
  19. Privileged instruction
  20. 控制数十万网吧电脑挖矿,嫌疑人落网;微软开源 Azure IoT Edge 边缘计算服务

热门文章

  1. 【spring-boot】Could not find result map ‘com.springboot.cib_hk.bean.Users‘ referenced from ‘co...
  2. 一步一步学linux操作系统: 14 进程调度三完_抢占式调度
  3. 关于IDEA在模块scr鼠标右键没有Servlet的解决方法(多种步骤帮你解决)
  4. error: Cannot delete branch 'xxx' checked out at 'xxxx'
  5. 带头双向循环链表的模拟实现
  6. python行业中性_用python进行金融市场文本数据的情感计算
  7. 今年的目标 --还有两个月 我的21天计划
  8. PyQt5_pyqtgraph股票RSI指标
  9. 源码深度解析之 Spring IOC
  10. 用python做flash动画_6 款用于创建优秀动画的免费 Flash 编辑器