20190227 多线程的监听

目录

1.web.xml中:配置listener

2.实现代码:

3.实现效果:

开始推流(2个都可以用vlc播放)

rtsp://admin:123456Aa@192.168.1.45:554/Streaming/Channels/102/

可以播放:

出现错误:-----原推流方法作废掉,不再单独推。

4.换一种方法:去掉listener,直接遍历新建运行线程。测试中。。。。。。

5.关于javacv推流中线程控制的中断问题(重点)


1.web.xml中:配置listener

<!--添加启动后一直读流的线程-->
   <listener>
        <listener-class>com.galaxySpaceFlight.http.listener.MyListener</listener-class>
    </listener>

2.实现代码:

package com.galaxySpaceFlight.http.listener;

import com.galaxySpaceFlight.store.dao.CameraDao;
import com.galaxySpaceFlight.store.vo.camera.Camera;
import com.galaxySpaceFlight.util.recordPush;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.List;

/**
 * Listener的方式在后台执行一线程
 */
public class MyListener implements ServletContextListener {

    private MyThread myThread;

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {

        //多线程
        //获取所有摄像头信息
        WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
        CameraDao cameraDao = (CameraDao) context.getBean("cameraDao");
        List<Camera> list = cameraDao.getvideolist();
        System.out.println("所有的对象list" + list);
        if(list.size()>=0){
            for(int i=0;i<list.size();i++){
                System.out.println("获取的进程"+i);
                System.out.println("获取的进程输入"+list.get(i).getRtspUrl());
                System.out.println("获取的进程输出"+list.get(i).getRtmpUrl());
                //Thread thread = new MyThread(list.get(i).getRtspUrl(),list.get(i).getRtmpUrl());
                Thread thread = new Thead2(list.get(i).getRtspUrl(),list.get(i).getRtmpUrl());
                thread.start(); // servlet 上下文初始化时启动 socket
            }
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        if (myThread != null && myThread.isInterrupted()) {
            myThread.interrupt();
        }
    }
}

3.实现效果:
 

 

开始推流(2个都可以用vlc播放)

rtsp://admin:123456Aa@192.168.1.45:554/Streaming/Channels/102/

rtmp://192.168.1.113:1935/live/cal_20190218141818

可以播放:

出现错误:-----原推流方法作废掉,不再单独推。

[DEBUG] 2019-02-27 17:08:10,809 method:org.jboss.resteasy.core.SynchronousDispatcher.getInvoker(SynchronousDispatcher.java:249)
RESTEASY002315: PathInfo: /camera/tuiliu

出现问题:切换页面后,流自动暂停了。

4.换一种方法:去掉listener,直接遍历新建运行线程。测试中。。。。。。

5.关于javacv推流中线程控制的中断问题(重点)

因为nginx对同一个摄像头同一时间只能推一次,重复推会崩溃。

方案一:

javacv在后台项目启动时就将所有摄像头以多线程方式全部启动推流,然后需要拿流时直接vue使用video嵌入地址播放;

摄像头多时会比较消耗资源。

方案二:

什么时候用什么时候推,每次打开需要的界面时开启线程推流,关闭页面时,结束线程。

线程的结束可以定义名字或者给一个线程状态来控制,

但是如果频繁的使用,涉及到报警录制,播放,查看等多个页面时,频繁开启也很消耗资源。

新思路:

可全部推起来,然后根据不同的情况做等待或者销毁的处理,释放资源,防止内存不够。(待测试)

 

附:
 

接到通知,被安排去协助android原生的开发,研发暂停,现学安卓的原生开发。

 

 以上仅是个人项目中的开发分析见解,如有错误,欢迎矫正交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值