package com.inspect.tcpserver.sip.stream; import org.bytedeco.ffmpeg.avcodec.AVPacket; import org.bytedeco.javacv.FFmpegFrameGrabber; import java.nio.ByteBuffer; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; public class RtspClient { private final String url; private FFmpegFrameGrabber grabber; private final AtomicBoolean running = new AtomicBoolean(false); public RtspClient(String url) { this.url = url; } public void start(Consumer onH264) throws Exception { grabber = new FFmpegFrameGrabber(url); grabber.setOption("rtsp_transport", "tcp"); grabber.setOption("stimeout", "5000000"); grabber.start(); running.set(true); new Thread(() -> { try { while (running.get()) { AVPacket pkt = grabber.grabPacket(); if (pkt == null || pkt.size() <= 0) { continue; } byte[] annexB = H264AnnexBExtractor.extractFromAvPacket(pkt); if (annexB != null) { onH264.accept(annexB); } } } catch (Exception e) { e.printStackTrace(); } finally { stop(); } }, "RtspClient-Thread").start(); } public void stop() { running.set(false); try { if (grabber != null) { grabber.stop(); grabber.release(); } } catch (Exception ignored) { } } }