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<byte[]> 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) {
|
|
}
|
|
}
|
|
}
|