javacv + rtsp +ffmpge 設定編碼格式 幀率
private boolean isStart = true;
public void frameRecord(String inputFile, String outputFile, int audioChannel) throws Exception, org.bytedeco.javacv.FrameRecorder.Exception { // 獲取視訊源 FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(inputFile); grabber.setOption("rtsp_transport","tcp"); grabber.setFrameRate(30); grabber.setVideoBitrate(3000000); // 流媒體輸出地址,解析度(長,高),是否錄製音訊(0:不錄製/1:錄製) FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile, 1280, 720,audioChannel); recorder.setFrameRate(30); recorder.setVideoBitrate(3000000); recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); //avcodec.AV_CODEC_ID_H264 //AV_CODEC_ID_MPEG4 recordByFrame(grabber, recorder); }
private void recordByFrame(FFmpegFrameGrabber grabber, FFmpegFrameRecorder recorder) throws Exception, org.bytedeco.javacv.FrameRecorder.Exception { try {// 建議線上程中使用該方法 grabber.start(); recorder.start(); //CanvasFrame canvas = new CanvasFrame("攝像頭");//新建一個視窗 // canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //canvas.setAlwaysOnTop(true);
long t1 = System.currentTimeMillis(); Frame frame = null;
while (isStart && (frame = grabber.grabFrame()) != null) { long t2 = System.currentTimeMillis(); if(t2-t1 > 2*60*60*1000){ break; }else{ recorder.record(frame); //TODO your work } //canvas.showImage(grabber.grab());//獲取攝像頭影象並放到視窗上顯示, 這裡的Frame frame=grabber.grab(); frame是一幀視訊影象 } recorder.stop(); grabber.stop(); } finally { if (grabber != null) { grabber.stop(); } } }