基于JavaCV对RTSP、RTMP视频流检测

1. Maven依赖

1.1 懒人版

<dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.5</version>
</dependency>

1.2 精确版

由于整个依赖较大(约900M),以下为实际需要的依赖(不同的操作系统需要根据自己的操作系统进行适配),以下xml配置了properties及dependencies两个节点。

bytecode-sys配置根据运行系统可以自行变更为,以下部分系统值:

系统
windows64windows-x86_64
windows32windows-x86
arm64linux-arm64
x86_64linux-x86_64
macmacosx-x86_64
<properties><bytecode-sys>linux-x86_64</bytecode-sys>
</properties><dependencies><dependency><groupId>org.bytedeco</groupId><artifactId>ffmpeg</artifactId><version>4.3.2-1.5.5</version><exclusions><exclusion><groupId>*</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>ffmpeg</artifactId><classifier>${bytecode-sys}</classifier><version>4.3.2-1.5.5</version><exclusions><exclusion><groupId>*</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>javacv</artifactId><version>1.5.5</version><exclusions><exclusion><groupId>*</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>javacpp</artifactId><version>1.5.5</version><exclusions><exclusion><groupId>*</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.bytedeco</groupId><artifactId>javacpp</artifactId><classifier>${bytecode-sys}</classifier><version>1.5.5</version><exclusions><exclusion><groupId>*</groupId><artifactId>*</artifactId></exclusion></exclusions></dependency><!--endregion--></dependencies>

2. 代码

FFmpegFrameGrabber通过grab方法可以获取视频信息,当frame不为空则正常;

但是该方法会导致阻塞,因此此处通过Future的get方法,设置一个超时时间,超时后返回false。

2.1 核心测试类

import com.hz.utils.CustomThreadPool;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.junit.jupiter.api.Test;import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;public class RtmpCheckTest {@Testpublic void test01() {try (CustomThreadPool pool = CustomThreadPool.initPool(1, 1, 1, "ceshi");) {Future<Boolean> future = pool.submit(() -> {String rtmpUrl = "rtmp://yourRtmpServer:1935/live/test";FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(rtmpUrl);try {grabber.start();Frame frame = grabber.grab();boolean status = frame != null;return status;} catch (Exception e) {return false;} finally {grabber.stop();}});Boolean status = false;try {status = future.get(10, TimeUnit.SECONDS);} catch (Exception e) {System.out.println(e.getMessage());}System.out.println("视频状态:" + status);}}}

2.2 依赖(自定义线程池工具类)

package com.hz.utils;import java.io.Closeable;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;/*** @description:* @author: pp_lan* @date: 2022/3/15*/
public class CustomThreadPool implements Closeable {private ThreadPoolExecutor pool;private AtomicInteger count = new AtomicInteger();private CustomThreadPool(int core, int max, int queueSize, String threadName) {this.pool = new ThreadPoolExecutor(core, max, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<>(queueSize),r -> new Thread(r, threadName + count.getAndIncrement()));}public ThreadPoolExecutor getPool() {return pool;}/*** 获取对象* @param core* @param max* @param queueSize* @param threadName* @return*/public static CustomThreadPool initPool(int core, int max, int queueSize, String threadName) {return new CustomThreadPool(core, max, queueSize, threadName);}/*** callable批量任务* @param tasks* @param <T>* @return*/public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) {try {List<Future<T>> futures = this.pool.invokeAll(tasks);return futures;} catch (InterruptedException e) {throw new RuntimeException("线程被中断", e);}}/*** callable单个任务* @param task* @param <T>* @return*/public <T> Future<T> submit(Callable<T> task) {return this.pool.submit(task);}/*** runnable任务* @param runnable*/public void execute(Runnable runnable) {this.pool.execute(runnable);}/*** runnable任务* @param runnable*/public Future<?> submit(Runnable runnable) {return this.pool.submit(runnable);}/*** 线程池关闭,建议使用try-resource进行自动关闭,不要手动执行*/public void shutdown() {this.pool.shutdown();try {if (!this.pool.awaitTermination(1, TimeUnit.MINUTES)) {this.pool.shutdownNow();if (!this.pool.awaitTermination(1, TimeUnit.MINUTES)) {throw new RuntimeException("线程池关闭失败");}}} catch (InterruptedException e) {throw new RuntimeException("线程池关闭失败", e);}}@Overridepublic void close() {this.shutdown();}
}

3. 环境

RTSP环境搭建

4. 执行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/329489.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

x-cmd pkg | trdsql - 能对 CSV、LTSV、JSON 和 TBLN 执行 SQL 查询的工具

目录 简介首次用户技术特点竞品和相关作品进一步阅读 简介 trdsql 是一个使用 sql 作为 DSL 的强大工具: 采用 SQL 对 CSV、LTSV、JSON 和 TBLN 文件执行查询与 MySQL&#xff0c;Postgresql&#xff0c;Sqlite 的 Driver 协同&#xff0c;可以实现对应数据库的表与文件的 JO…

【JaveWeb教程】(8)Web前端基础:Vue组件库Element之Table表格组件和Pagination分页组件 详细示例介绍

目录 1 Table表格组件1.1 组件演示1.2 组件属性详解 2 Pagination分页2.1 组件演示2.2 组件属性详解2.3 组件事件详解 接下来我们来学习一下ElementUI的常用组件&#xff0c;对于组件的学习比较简单&#xff0c;我们只需要参考官方提供的代码&#xff0c;然后复制粘贴即可。本节…

塑料制品行业生产管理MES系统解决方案

塑料制品产业虽然有一定的规模和基础&#xff0c;但存在自主创新能力低、“散小乱”、品牌效应不明显、行业创新能力与庞大的产业不匹配或支撑不足等问题&#xff0c;塑料加工行业还处在质量型产业的初期&#xff0c;抗风险能力低。 注塑行业6大痛点&#xff1a; 1.生产效率低…

odoo17 | 模型视图继承

前言 Odoo的强大之处在于它的模块化。模块专门用于满足业务需求&#xff0c;但模块也可以彼此交互。这对于扩展现有模块的功能非常有用。例如&#xff0c;在我们的房地产场景中&#xff0c;我们希望在常规用户视图中直接显示销售人员的属性列表。 但是在讨论特定的Odoo模块继…

Verilog 入门简明教程

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《Verilog语言入门教程》 <<<< 返回总目录 <<<< 全文 6000字 1. 基本语法 换行&#xff1a; 格式自由&#xff0c;可以在一行内编写&#xff0c;也可跨多行编写&#xff0c; 建议…

霍兰德职业兴趣测试 60题(免费版)

霍兰德职业兴趣理论从兴趣的角度出发探索职业指导的问题&#xff0c;明确了职业兴趣的人格观念&#xff0c;使得人们对于职业兴趣的认识有了质的变化。在霍兰德职业兴趣理论提出来之前&#xff0c;职业兴趣和职业环境二者分别独立存在&#xff0c;正是霍兰德的总结&#xff0c;…

基于java,springboot的论旅游管理系统设计与实现

环境以及简介 基于java,springboot的论旅游管理系统设计与实现&#xff0c;Java项目&#xff0c;SpringBoot项目&#xff0c;含开发文档&#xff0c;源码&#xff0c;数据库以及ppt 源码下载 环境配置&#xff1a; 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服…

HEVC 视频扩展安装包,WIN10上看苹果的照片格式

苹果手机照片放电脑上&#xff0c;后缀名称.HEIC&#xff0c;打开居然要下载 HEVC 视频扩展包才能查看&#xff0c;网盘找到一个记录一下&#xff0c;安装后就可以查看苹果手机照片了。 链接&#xff1a;https://pan.baidu.com/s/13ye9_6brXD32jWAjfS47gQ?pwd36k5 提取码&am…

搭建一个教育小程序的必要步骤

随着科技的飞速发展&#xff0c;小程序已经深入到我们生活的方方面面。对于教育行业来说&#xff0c;小程序的出现不仅为教育机构提供了新的宣传和互动平台&#xff0c;更为学生和家长带来了更为便捷的学习体验。那么&#xff0c;如何开发一款适合教育机构的小程序呢&#xff1…

【自学笔记】01Java基础-07面向对象基础-02继承

记录学习Java基础中有关继承、方法重写、构造器调用的基础知识&#xff0c;学习继承之前建议学习static关键字的内容【自学笔记】01Java基础-09Java关键字详解 1 继承概述 1.1 什么是继承&#xff1f; 1.2 继承的特点 子类可以继承父类的属性和行为&#xff0c;但是子类不能…

一个vue3的tree组件

https://download.csdn.net/download/weixin_41012767/88709466

跟着小德学C++之安全模块

嗨&#xff0c;大家好&#xff0c;我是出生在达纳苏斯的一名德鲁伊&#xff0c;我是要立志成为海贼王&#xff0c;啊不&#xff0c;是立志成为科学家的德鲁伊。最近&#xff0c;我发现我们所处的世界是一个虚拟的世界&#xff0c;并由此开始&#xff0c;我展开了对我们这个世界…