码迷,mamicode.com
首页 > 编程语言 > 详细

javacv 接收RTSP流(或avi/mp4视频文件文件),输出byte[]

时间:2020-09-14 19:03:15      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:finally   extends   turn   数组   err   vat   dep   write   bool   

1.maven依赖

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

2.线程类

  1 package com.bs.thread;
  2 
  3 import com.bs.controller.BsDataController;
  4 import org.bytedeco.javacv.FFmpegFrameGrabber;
  5 import org.bytedeco.javacv.Frame;
  6 import org.bytedeco.javacv.FrameGrabber;
  7 import org.bytedeco.javacv.Java2DFrameConverter;
  8 import org.slf4j.Logger;
  9 import org.slf4j.LoggerFactory;
 10 import org.springframework.scheduling.annotation.Async;
 11 import javax.imageio.ImageIO;
 12 import java.awt.image.BufferedImage;
 13 import java.io.ByteArrayOutputStream;
 14 import java.io.IOException;
 15 
 16 public class RtspToJpgThread extends Thread {
 17 
 18     public  String FLAG="CLOSE";
 19 
 20     private String rtspUrl;
 21 
 22     private String rtspTransportType="udp";
 23 
 24     private  FFmpegFrameGrabber grabber;
 25 
 26     private final Logger log = LoggerFactory.getLogger(this.getClass());
 27 
 28     private  boolean isStart = false;
 29 
 30     /**
 31      * 视频帧率
 32      */
 33     private  int frameRate = 30;
 34     /**
 35      * 视频宽度
 36      */
 37     private  int frameWidth = 480;
 38     /**
 39      * 视频高度
 40      */
 41     private  int frameHeight = 270;
 42 
 43     public RtspToJpgThread(String rtspUrl){
 44         this.rtspUrl=rtspUrl;
 45     }
 46 
 47     @Override
 48     public void run() {
 49         live();
 50     }
 51 
 52 
 53 
 54     /**
 55      * 开启获取rtsp流,通过websocket传输数据
 56      */
 57     @Async
 58     public void live() {
 59         log.info("连接rtsp:"+rtspUrl+",开始创建grabber");
 60         grabber = createGrabber(rtspUrl);
 61         if (grabber != null) {
 62             log.info("创建grabber成功");
 63         } else {
 64             log.info("创建grabber失败");
 65         }
 66         startCameraPush();
 67     }
 68 
 69     /**
 70      * 构造视频抓取器
 71      *
 72      * @param rtsp 拉流地址
 73      * @return
 74      */
 75     public FFmpegFrameGrabber createGrabber(String rtsp) {
 76         // 获取视频源
 77         try {
 78             FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(rtsp);
 79             grabber.setOption("rtsp_transport", rtspTransportType);
 80             //设置帧率
 81             grabber.setFrameRate(frameRate);
 82             //设置获取的视频宽度
 83             grabber.setImageWidth(frameWidth);
 84             //设置获取的视频高度
 85             grabber.setImageHeight(frameHeight);
 86             //设置视频bit率
 87             grabber.setVideoBitrate(2000000);
 88             return grabber;
 89         } catch (FrameGrabber.Exception e) {
 90             log.error("创建解析rtsp FFmpegFrameGrabber 失败");
 91             log.error("create rtsp FFmpegFrameGrabber exception: ", e);
 92             return null;
 93         }
 94     }
 95 
 96     /**
 97      * 推送图片(摄像机直播)
 98      */
 99     public void startCameraPush() {
100         Java2DFrameConverter java2DFrameConverter = new Java2DFrameConverter();
101         while (true) {
102             if (grabber == null) {
103                 log.info("重试连接rtsp:"+rtspUrl+",开始创建grabber");
104                 grabber = createGrabber(rtspUrl);
105                 log.info("创建grabber成功");
106             }
107             try {
108                 if (grabber != null && !isStart) {
109                     grabber.start();
110                     isStart = true;
111                     log.info("启动grabber成功");
112                 }
113                 if (grabber != null) {
114                     Frame frame = grabber.grabImage();
115                     if (null == frame) {
116                         continue;
117                     }
118                     BufferedImage bufferedImage = java2DFrameConverter.getBufferedImage(frame);
119                     byte[] bytes = imageToBytes(bufferedImage, "jpg");
120                     //使用websocket发送视频帧数据
121                     if("OPEN".equals(FLAG)){
122                         //log.info("============ 线程"+rtspUrl+"发出数据 ============");
123                         BsDataController.ws.sendAllByObject(bytes);
124                     }
125 
126                 }
127             } catch (FrameGrabber.Exception | RuntimeException e) {
128                 log.error("因为异常,grabber关闭,rtsp连接断开,尝试重新连接");
129                 log.error("exception : " , e);
130                 if (grabber != null) {
131                     try {
132                         grabber.stop();
133                     } catch (FrameGrabber.Exception ex) {
134                         log.error("grabber stop exception: ", ex);
135                     } finally {
136                         grabber = null;
137                         isStart = false;
138                     }
139                 }
140             }
141         }
142     }
143 
144     /**
145      * 图片转字节数组
146      *
147      * @param bImage 图片数据
148      * @param format 格式
149      * @return 图片字节码
150      */
151     private byte[] imageToBytes(BufferedImage bImage, String format) {
152         ByteArrayOutputStream out = new ByteArrayOutputStream();
153         try {
154             ImageIO.write(bImage, format, out);
155         } catch (IOException e) {
156             log.error("bufferImage 转 byte 数组异常");
157             log.error("bufferImage transfer byte[] exception: ", e);
158             return null;
159         }
160         return out.toByteArray();
161     }
162 }

 

javacv 接收RTSP流(或avi/mp4视频文件文件),输出byte[]

标签:finally   extends   turn   数组   err   vat   dep   write   bool   

原文地址:https://www.cnblogs.com/zh-peng/p/13596392.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!