suntianwu 3 rokov pred
rodič
commit
239e7d741b

+ 36 - 0
src/main/java/com/iden/common/enums/TimeoutOption.java

@@ -0,0 +1,36 @@
+package com.iden.common.enums;
+
+/**
+ * 流媒体超时没有通用选项。每个协议都有 自己的选项列表。
+ */
+public enum TimeoutOption {
+
+    /**
+     * 取决于协议(FTP,HTTP,RTMP,SMB,SSH,TCP,UDP或UNIX)。
+     *
+     * http://ffmpeg.org/ffmpeg-all.html
+     */
+    TIMEOUT,
+    /**
+     * 协议
+     *
+     * 等待(网络)读/写操作完成的最长时间, 以微秒为单位。
+     *
+     * http://ffmpeg.org/ffmpeg-all.html#Protocols
+     */
+    RW_TIMEOUT,
+    /**
+     * Protocols -> RTSP
+     *
+     * 设置套接字TCP I / O超时(以微秒为单位)。
+     *
+     * http://ffmpeg.org/ffmpeg-all.html#rtsp
+     */
+    STIMEOUT;
+
+    public String getKey() {
+        return toString().toLowerCase();
+    }
+
+}
+

+ 47 - 2
src/main/java/com/iden/common/util/VideoUtil.java

@@ -1,7 +1,9 @@
 package com.iden.common.util;
 
 
+import com.iden.common.enums.TimeoutOption;
 import org.bytedeco.javacv.FFmpegFrameGrabber;
+import org.bytedeco.javacv.FFmpegFrameRecorder;
 import org.bytedeco.javacv.Frame;
 import org.bytedeco.javacv.Java2DFrameConverter;
 import org.slf4j.Logger;
@@ -197,6 +199,49 @@ public class VideoUtil {
     }
 
 
+    /**
+     * 视频截取
+     * @param videoFile
+     * @throws Exception
+     */
+    public static void cut(File videoFile, File outputFile) throws Exception{
+        boolean isStart = true;// 该变量建议设置为全局控制变量,用于控制录制结束
+        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoFile);
+//        // 微秒 大概为设置时间的两倍
+ //      grabber.setOption(TimeoutOption.RW_TIMEOUT.getKey(), "10000000");
+        // rtsp 默认udp 丢包 改为tcp
+       // grabber.setOption("rtsp_transport", "tcp");
+        // rtsp 默认udp 丢包 改为tcp
+  //      grabber.setOption("rtsp_transport", "tcp");
+        grabber.start();
+        //好多视频熟悉可以获取后打印 示例几个
+        System.out.println("ImageWidth:" + grabber.getImageWidth());
+        System.out.println("ImageHeight:" + grabber.getImageHeight());
+        System.out.println("AudioChannels:" + grabber.getAudioChannels());
+        System.out.println("Format:" + grabber.getFormat());
+        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(outputFile,  grabber.getImageWidth(), grabber.getImageHeight(), grabber.getAudioChannels());
+        recorder.setFrameRate(grabber.getFrameRate());
+//					recorder.setAudioBitrate(grabber.getAudioBitrate());
+//					recorder.setSampleRate(grabber.getSampleRate());
+//					recorder.setGopSize(2);
+        recorder.setFormat( grabber.getFormat());
+      //  recorder.setAudioCodecName("aac");
+        recorder.setVideoCodec(grabber.getVideoCodec());
+        Frame frame = null;
+        //如果想截取规定时间段视频 请看系列文章二
+        while (isStart) {
+            frame = grabber.grabFrame();
+            if (frame != null && frame.image != null) {
+                recorder.record(frame);
+            }
+        }
+        recorder.stop();
+        recorder.release();
+        grabber.stop();
+        grabber.release();
+
+
+    }
     public static void main(String[] args) {
         try {
             //getList(10,113);
@@ -205,8 +250,8 @@ public class VideoUtil {
 //            List<File> files = VideoUtil.fetchPicByCount(file, "E:/223", 100);
 //            System.out.println(files.get(0).getName());
 //            System.out.println(VideoUtil.getVideoTime(file));
-            fetchAllPic(file,"E:/223",new Date());
-
+//            fetchAllPic(file,"E:/223",new Date());
+            cut(file,new File("e:/a.mp4"));
         } catch (Exception e) {
             e.printStackTrace();
         }