bytedeco/javacv

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

Open

#1981 aperta il 9 feb 2023

Vedi su GitHub
 (3 commenti) (0 reazioni) (0 assegnatari)Java (1583 fork)batch import
help wantedquestion

Metriche repository

Star
 (6985 star)
Metriche merge PR
 (Nessuna PR mergiata in 30 g)

Descrizione

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; }

Guida contributor