|
@@ -0,0 +1,88 @@
|
|
|
+package com.ozs.utils;
|
|
|
+
|
|
|
+import org.bytedeco.javacpp.avcodec;
|
|
|
+import org.bytedeco.javacv.FFmpegFrameGrabber;
|
|
|
+import org.bytedeco.javacv.FFmpegFrameRecorder;
|
|
|
+import org.bytedeco.javacv.Frame;
|
|
|
+import org.bytedeco.javacv.FrameGrabber;
|
|
|
+import org.bytedeco.javacv.FrameRecorder;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.io.IOException;
|
|
|
+
|
|
|
+public class FfmpegUtil implements Runnable {
|
|
|
+
|
|
|
+ private String stream_url = "rtmp://58.200.131.2:1935/livetv/hunantv";// 流地址 例如:rtmp://58.200.131.2:1935/livetv/hunantv 湖南卫视
|
|
|
+ private Long times_sec = 0L;// 停止录制时长 0为不限制时长
|
|
|
+ private String out_file_path;//输出路径
|
|
|
+ private String file_format = "mp4";//录制的文件格式
|
|
|
+ private boolean is_audio = false;//是否录制声音
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+// 获取视频源
|
|
|
+ FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(stream_url);
|
|
|
+ FFmpegFrameRecorder recorder = null;
|
|
|
+ try {
|
|
|
+ grabber.start();
|
|
|
+ Frame frame = grabber.grabFrame();
|
|
|
+ if (frame != null) {
|
|
|
+//保存到本地的文件
|
|
|
+ File outFile = new File(out_file_path);
|
|
|
+// 如果文件不存在或者不是一个文件 则根据文件的路径创建一个文件
|
|
|
+ if (out_file_path.isEmpty() || !outFile.exists() || outFile.isFile()) {
|
|
|
+ outFile.createNewFile();
|
|
|
+ } else {
|
|
|
+ System.out.println("输出文件无法创建");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+// 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)
|
|
|
+ recorder = new FFmpegFrameRecorder(out_file_path, frame.imageWidth, frame.imageHeight, is_audio ? 1 : 0);
|
|
|
+ recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);//直播流格式
|
|
|
+ recorder.setFormat(file_format);//录制的视频格式
|
|
|
+ recorder.setFrameRate(25);//帧数
|
|
|
+ recorder.start();//开始录制
|
|
|
+// 计算结束时间
|
|
|
+ long endTime = System.currentTimeMillis() + times_sec * 1000;
|
|
|
+// 如果没有到录制结束时间并且获取到了下一帧则继续录制
|
|
|
+ while ((System.currentTimeMillis() < endTime) && (frame != null)) {
|
|
|
+ recorder.record(frame);//录制
|
|
|
+ frame = grabber.grabFrame();//获取下一帧
|
|
|
+ }
|
|
|
+ recorder.record(frame);
|
|
|
+ }
|
|
|
+ } catch (FrameGrabber.Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (FrameRecorder.Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+//停止录制
|
|
|
+ if (null != grabber) {
|
|
|
+ try {
|
|
|
+ grabber.stop();
|
|
|
+ } catch (FrameGrabber.Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (recorder != null) {
|
|
|
+ try {
|
|
|
+ recorder.stop();
|
|
|
+ } catch (FrameRecorder.Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ System.out.println("录制完成,录制时长:" + times_sec + "秒(0为没有限制录制时长)");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+ FfmpegUtil recordVideoThread = new FfmpegUtil();
|
|
|
+ recordVideoThread.out_file_path = "D://1.mp4";
|
|
|
+ recordVideoThread.times_sec = 10L;// 最好设置结束时长 如直接停止程序会造成输出文件的损坏无法正常播放
|
|
|
+ recordVideoThread.is_audio = true;
|
|
|
+ new Thread(recordVideoThread).start();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|