bytedeco/javacv
View on GitHubI used FFmpegFrameGrabber and FFmpegFrameRecorder to record videos of RTSP addresses in mp4 format, but the recorded video would lag when dragging the progress bar, and the video frame would repeat in the last few seconds
Open
#2,134 opened on Nov 28, 2023
help wantedquestion
Repository metrics
- Stars
- (6,985 stars)
- PR merge metrics
- (No merged PRs in 30d)
Description
public class RTSPStreamAndRecordMP4 {
private static AtomicBoolean flag = new AtomicBoolean(true);
private static long videoTime = 0;
static {
// 设置日志的级别,高于这个级别的日志不会打印
avutil.av_log_set_level(avutil.AV_LOG_INFO);
// 开启日志
FFmpegLogCallback.set();
}
public static void main(String[] args) {
new Thread(() -> {
try {
String rtspURL = "rtsp://admin:123456@192.168.0.213:80/ch0_1.264";
String outputMP4File = "D:\\1.mp4";
FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(rtspURL);
grabber.setFormat("rtsp");
grabber.start();
FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputMP4File, grabber.getImageWidth(), grabber.getImageHeight());
recorder.setFormat("mp4");
recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
recorder.setVideoQuality(0);
recorder.setFrameRate(grabber.getFrameRate());
recorder.setAudioChannels(grabber.getAudioChannels());
recorder.setSampleRate(grabber.getSampleRate());
recorder.setVideoBitrate(grabber.getVideoBitrate());
recorder.setSampleRate(grabber.getSampleRate());
recorder.start();
long startTime = System.currentTimeMillis();
Frame frame;
while ((frame = grabber.grab()) != null && flag.get()) {
// 计算当前帧在视频中的第几秒
videoTime = (System.currentTimeMillis() - startTime) / 1000;
// 在这里可以将 elapsedTime 作为时间信息与帧一起记录或处理
recorder.record(frame);
}
System.out.println("当前视频时长:"+videoTime);
grabber.close();
recorder.flush();
recorder.close();
} catch (Exception e) {
e.printStackTrace();
}
}).start();
Scanner sc = new Scanner(System.in);
System.out.print("停止录制(输入任意字符然后回车):");
sc.next();
// 修改 flag 的值,通知子线程停止录制
flag.set(false);
}
}