bytedeco / javacv

Java interface to OpenCV, FFmpeg, and more
Other
7.51k stars 1.58k forks source link

FFmpegFrameGrabber对rtsp进行拉流,调用 grabber.start();阻塞 #1981

Open lvzhouzhijun opened 1 year ago

lvzhouzhijun commented 1 year ago

protected boolean createGrabber() { // 拉流器,构造传入文件路径,或者流媒体地址 long st = System.currentTimeMillis(); grabber = new FFmpegFrameGrabber(cameraDTO.getUrl()); long et = System.currentTimeMillis(); log.info("FFmpegFrameGrabberc初始化时长:{}", (et - st) / 1000); // 超时时间(15秒) grabber.setOption("stimeout", cameraDTO.getNetTimeout()); grabber.setOption("threads", "1"); // 设置缓存大小,提高画质、减少卡顿花屏 grabber.setOption("buffer_size", "1024000"); // 读写超时,适用于所有协议的通用读写超时 grabber.setOption("rw_timeout", cameraDTO.getReadOrWriteTimeout()); // 探测视频流信息,为空默认5000000微妙 grabber.setOption("probesize", cameraDTO.getReadOrWriteTimeout()); // 解析视频流信息,为空默认5000000微妙 grabber.setOption("analyzeduration", cameraDTO.getReadOrWriteTimeout()); // 如果为rtsp流,增加配置 if (ProtocolEnum.RTSP.getType().equals(cameraDTO.getUrl().substring(0, 4))) { // 设置rtsp传输协议为udp传输模式 grabber.setOption("rtsp_transport", "tcp"); // 首选TCP进行RTP传输 grabber.setOption("rtsp_flags", "prefer_tcp"); } else if (ProtocolEnum.RTMP.getType().equals(cameraDTO.getUrl().substring(0, 4))) { // rtmp拉流缓冲区,默认3000毫秒 grabber.setOption("rtmp_buffer", "1000"); } try { grabber.start(); log.info("\r\n{}\r\n启动拉流器成功", cameraDTO.getUrl()); return grabberStatus = true; } catch (FFmpegFrameGrabber.Exception e) { CameraServiceImpl.cameras.remove(cameraDTO.getMediaKey()); log.error("\r\n{}\r\n启动拉流器失败,网络超时或视频资源不可用", cameraDTO.getUrl()); e.printStackTrace(); } return grabberStatus = false; }

lvzhouzhijun commented 1 year ago

输入错误的rtsp地址,grabber.start();方法就会阻塞,但是不抛出异常,该怎么解决?

steeveen commented 1 year ago

你试试 stimeout换成s_timeout呢 How about replacing stimeout with s_timeout

testwen00 commented 1 year ago

I test in 1.5.8 ,use grabber.setOption("timeout", "10000000"); it work