bytedeco/javacv

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

Open

#1,981 opened on Feb 9, 2023

View on GitHub
 (3 comments) (0 reactions) (0 assignees)Java (1,583 forks)batch import
help wantedquestion

Repository metrics

Stars
 (6,985 stars)
PR merge metrics
 (No merged PRs in 30d)

Description

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

Contributor guide