我正在使用JavaCV处理RTSP视频流。我要做的是抓取RTSP流的每一帧并将其写入JPG文件。这是我的代码:
package test;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class PravegaCameraconnector
{
public static void grabberVideoFramer() {
Frame frame = null;
int flag = 0;
int max_value = 9999999;
FFmpegFrameGrabber fFmpegFrameGrabber = new FFmpegFrameGrabber("rtsp://192.168.1.11:8554/stream");
fFmpegFrameGrabber.setframeRate(30);
try {
fFmpegFrameGrabber.start();
BufferedImage bImage = null;
while (flag < max_value) {
String fileName = "/home/rtsp/tmp/imgs/img_" + String.valueOf(flag) + ".jpg";
File outPut = new File(fileName);
frame = fFmpegFrameGrabber.grabImage();
if (frame != null) {
ImageIO.write(FrameToBufferedImage(frame),"jpg",outPut);
}
flag++;
if (flag == max_value) {
flag = 0;
}
}
fFmpegFrameGrabber.stop();
} catch (IOException E) {
// nothing to do
}
}
public static BufferedImage FrameToBufferedImage(Frame frame) {
Java2DFrameConverter converter = new Java2DFrameConverter();
BufferedImage bufferedImage = converter.getBufferedImage(frame);
return bufferedImage;
}
public static void main(String[] args) {
grabberVideoFramer();
}
}
这似乎可行,因为我已经看到生成了许多JPG文件。
但是,在运行此代码时,我收到许多警告和错误:
[h264 @ 0x7fe1b0491780] error while decoding MB 26 37,bytestream -35
[h264 @ 0x7fe1b0491780] Cannot use next picture in error concealment
[h264 @ 0x7fe1b0491780] concealing 3743 DC,3743 AC,3743 MV errors in P frame
[rtsp @ 0x7fe1b0447480] max delay reached. need to consume packet
[rtsp @ 0x7fe1b0447480] RTP: missed 17 packets
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[h264 @ 0x7fe1b0ff6400] error while decoding MB 54 32,bytestream -15
[h264 @ 0x7fe1b0ff6400] concealing 4315 DC,4315 AC,4315 MV errors in B frame
[rtsp @ 0x7fe1b0447480] max delay reached. need to consume packet
[rtsp @ 0x7fe1b0447480] RTP: missed 1 packets
[rtsp @ 0x7fe1b0447480] RTP: dropping old packet received too late
[h264 @ 0x7fe1b0530c40] error while decoding MB 72 42,bytestream -6
我为什么要得到这些?
是因为RTSP源发送数据快而我的代码处理数据慢吗?
我需要两个线程:一个线程是从RTSP源接收数据,另一个线程是将数据写入JPG文件?