java使用opencv拉取rtsp流并客户端播放

该博客展示了如何在SpringBoot项目中利用JavaCV和FFmpeg库从RTSP流中抓取视频。通过设置依赖项并配置FFmpegFrameGrabber,以TCP方式确保数据传输的稳定性,然后在循环中抓取和显示帧,实现视频播放。当在SpringBoot环境中运行时,由于HeadlessException,需设置headless为false。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv</artifactId>
    <version>1.5.5</version>
</dependency>
<dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>ffmpeg-platform</artifactId>
    <version>4.3.2-1.5.5</version>
</dependency>
   public static void main(String[] args) throws IOException {
        String rtspUrl= "rtsp://user:pass@IP/h264/ch1/main/av_stream";

        FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(rtspUrl);
        grabber.setOption("rtsp_transport", "tcp"); // 使用tcp的方式,不然会丢包很严重
        grabber.setImageWidth(1280);
        grabber.setImageHeight(720);
        System.out.println("grabber start");
        grabber.start();

//1.播放视频

        CanvasFrame canvasFrame = new CanvasFrame("摄像机");
        canvasFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        canvasFrame.setAlwaysOnTop(true);
        OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
        while (true){
            Frame frame = grabber.grabImage();
            Mat mat = converter.convertToMat(frame);
            canvasFrame.showImage(frame);
        }

    }

如果是SpringBoot项目报错HeadlessException,加上这段

     SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
        final ApplicationContext applicationContext  = builder.headless(false).run(args);

### 使用 OpenCV RTSP 的具体方法 #### 配置环境 在使用 OpenCV 处理 RTSP 之前,需确保已正确安装配置好 OpenCV 库。对于 Python 和 Java 用户来说,具体依赖项可能有所不同。 - **Python**: 安装 `opencv-python` 或者支持更多功能的扩展版本 `opencv-contrib-python`[^1]。 ```bash pip install opencv-python-headless ``` - **Java**: 如果是在 Maven 项目中,则可以引入如下依赖来集成 OpenCV 功能[^2]: ```xml <dependency> <groupId>org.bytedeco</groupId> <artifactId>javacv-platform</artifactId> <version>1.5.7</version> </dependency> ``` --- #### Python 实现代码示例 以下是通过 Python 的 OpenCV RTSP 的一个简单实现: ```python import cv2 def capture_rtsp_stream(rtsp_url): # 创建 VideoCapture 对象 cap = cv2.VideoCapture(rtsp_url) if not cap.isOpened(): print("无法打开 RTSP ") return while True: ret, frame = cap.read() if not ret: print("未能获帧数据") break # 显示当前帧图像 cv2.imshow('RTSP Stream', frame) # 按下 'q' 键退出循环 if cv2.waitKey(1) & 0xFF == ord('q'): break # 清理资源 cap.release() cv2.destroyAllWindows() if __name__ == "__main__": rtsp_url = "rtsp://admin:test123456@192.168.1.19:55/MPEG-4/ch1/main/av_stream" capture_rtsp_stream(rtsp_url) ``` 上述代码展示了如何利用 OpenCV 中的 `cv2.VideoCapture()` 方法连接到指定的 RTSP 地址,逐帧显示视频的内容。 --- #### C++ 实现代码示例 如果采用的是 C++ 编程语言,那么可以通过以下方式完成相同的功能: ```cpp #include <opencv2/opencv.hpp> #include <iostream> int main() { // 初始化 VideoCapture 传入 RTSP URL cv::VideoCapture vcap; const std::string videoStreamAddress = "rtsp://admin:test123456@192.168.1.19:55/MPEG-4/ch1/main/av_stream"; if (!vcap.open(videoStreamAddress)) { std::cerr << "Error opening video stream." << std::endl; return -1; } cv::Mat frame; while (true) { bool success = vcap.read(frame); if (!success || frame.empty()) { std::cout << "No frames received from the camera!" << std::endl; continue; } // 展示每一帧的画面 cv::imshow("RTSP Stream", frame); char key = static_cast<char>(cv::waitKey(1)); if (key == 27) { // ESC键退出程序 break; } } vcap.release(); cv::destroyAllWindows(); return 0; } ``` 此段代码同样实现了从给定地址读实时传输协议(RTSP将画面展示出来的过程[^3]。 --- #### 常见错误处理 当尝试访问某些特定设备上的 RTSP 路径时可能会遇到一些常见问题,比如权限不足或者路径拼写有误等问题。针对这些问题可采相应措施解决它们: - 若发现无法成功建立链接,请确认用户名密码以及 IP 是否填写无误; - 当运行基于 GUI 的应用程序抛出 HeadlessException 异常时,在 Spring Boot 环境里可通过设置参数禁用 headless 模式来规避该异常情况发生[^4]; ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值