目录
rtsp://admin:123456Aa@192.168.1.45:554/Streaming/Channels/102/
4.换一种方法:去掉listener,直接遍历新建运行线程。测试中。。。。。。
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原生的开发,研发暂停,现学安卓的原生开发。
以上仅是个人项目中的开发分析见解,如有错误,欢迎矫正交流。