| | |
| | | * 视频拉流和推流 |
| | | */ |
| | | public static void push_flv(String inputUrl, String outputUrl, Integer deviceNumber) { |
| | | OpenCVFrameGrabber grabber = null; |
| | | // FFmpegFrameGrabber grabber = null; |
| | | // OpenCVFrameGrabber grabber = null; |
| | | FFmpegFrameGrabber grabber = null; |
| | | FFmpegFrameRecorder recorder = null; |
| | | try { |
| | | //关闭上一个没有正确关闭的流 |
| | |
| | | FFmpegLogCallback.set(); |
| | | |
| | | //视频抓帧 |
| | | // grabber = new FFmpegFrameGrabber(inputUrl); |
| | | // grabber.setOption("rtsp_transport", "tcp"); |
| | | // // 正确设置超时时间 |
| | | // grabber.setOption("timeout", "120000"); |
| | | // grabber.start(); |
| | | // grabberMap.put(deviceNumber, grabber); |
| | | |
| | | grabber = new OpenCVFrameGrabber(0); |
| | | grabber = new FFmpegFrameGrabber(inputUrl); |
| | | grabber.setOption("rtsp_transport", "tcp"); |
| | | // 正确设置超时时间 |
| | | grabber.setOption("timeout", "120000"); |
| | | grabber.start(); |
| | | grabberMap1.put(deviceNumber, grabber); |
| | | grabberMap.put(deviceNumber, grabber); |
| | | |
| | | // grabber = new OpenCVFrameGrabber(0); |
| | | // grabber.start(); |
| | | // grabberMap1.put(deviceNumber, grabber); |
| | | |
| | | //录制视频,推送到流媒体服务器(nginx) |
| | | recorder = new FFmpegFrameRecorder(outputUrl, grabber.getImageWidth(), grabber.getImageHeight()); |
| | | recorder.setFormat("flv"); |
| | | // 设置视频比特率 |
| | | recorder.setVideoBitrate(grabber.getVideoBitrate()); |
| | | // // 设置帧率 |
| | | // recorder.setFrameRate(grabber.getVideoFrameRate()); |
| | | // // 设置关键帧间隔 |
| | | // recorder.setGopSize((int) grabber.getVideoFrameRate()); |
| | | // 设置帧率 |
| | | recorder.setFrameRate(grabber.getVideoFrameRate()); |
| | | // 设置关键帧间隔 |
| | | recorder.setGopSize((int) grabber.getVideoFrameRate()); |
| | | // CRF 是一种用于控制视频/音频质量的参数,它允许在保持目标质量的同时动态地调整比特率。较低的CRF值表示更高的质量,但也可能导致较大的文件大小 |
| | | recorder.setAudioOption("crf", "23"); |
| | | |
| | |
| | | if (!statusMap.get(deviceNumber)) { |
| | | break; |
| | | } |
| | | Thread.sleep(500); |
| | | } |
| | | } catch (FrameGrabber.Exception | FrameRecorder.Exception e) { |
| | | e.printStackTrace(); |
| | | } catch (InterruptedException e) { |
| | | throw new RuntimeException(e); |
| | | } finally { |
| | | close(deviceNumber, null); |
| | | } |
| | |
| | | try { |
| | | fFmpegFrameGrabber = grabberMap.get(deviceNumber); |
| | | if (null != fFmpegFrameGrabber) { |
| | | fFmpegFrameGrabber.flush(); |
| | | fFmpegFrameGrabber.close(); |
| | | } |
| | | openCVFrameGrabber = grabberMap1.get(deviceNumber); |
| | | if (null != openCVFrameGrabber) { |
| | | openCVFrameGrabber.flush(); |
| | | openCVFrameGrabber.close(); |
| | | } |
| | | fFmpegFrameRecorder = frameRecorderMap.get(deviceNumber); |
| | | if (null != fFmpegFrameRecorder) { |
| | | fFmpegFrameRecorder.flush(); |
| | | fFmpegFrameRecorder.close(); |
| | | } |
| | | } catch (Exception e) { |