You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

59 lines
1.6 KiB

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) {
}
}
}