编程实现从一个视频文件(A4.mp4,总长度5min)中从第1:00min开始连续截取30s中视频,另存为A4V2.mp4。(任何语言都可)

编程实现从一个视频文件(A4.mp4,总长度5min)中从第1:00min开始连续截取30s中视频,另存为A4V2.mp4。

如果你安装了ffmpeg了的话,可以运行

ffmpeg -i A4.mp4 -ss 00:01:00 -t 30 -c copy A4V2.mp4

# 功能:对视频文件进行剪切。
# 剪切指定长度的视频,选择要裁剪的视频,选择开始时间点和停止时间点即可。
# 将处理后的视频保存为output.avi文件
import cv2  # OpenCV
import tkinter.filedialog  # Python文件对话框

def samllVideoGif(_videoPath,_videoGifPath):
    # _videoPath = "C:\\Users\\sswc\\Desktop\\gai2\\public\\showPdf\\6f3db1f9-e247-4aa5-bca7-93bae62a0079.mp4"
    # _videoGifPath = "C:\\Users\\sswc\\Desktop\\gai2\\public\\showPdf\\6f3db1f9-e247-4aa5-bca7-93bae62a0079.avi"
    cap = cv2.VideoCapture(_videoPath)  # 打开视频文件
    frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)  # 获得视频文件的帧数
    fps = cap.get(cv2.CAP_PROP_FPS)  # 获得视频文件的帧率
    width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)  # 获得视频文件的帧宽
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)  # 获得视频文件的帧高

    # 创建保存视频文件类对象
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    out = cv2.VideoWriter(_videoGifPath, fourcc, fps, (int(width), int(height)))

    # 计算视频长度/s
    video_length = frames / fps
    # print('start and stop must < %.1f' % video_length)  # 提示用户输入变量的范围
    # start = float(input('Input an start time/s:'))
    # stop = float(input('Input an stop time/s:'))
    # print('start and stop must < %.1f' % video_length)  # 提示用户输入变量的范围
    start = 0
    stop = 10
    # 设置帧读取的开始位置
    cap.set(cv2.CAP_PROP_POS_FRAMES, start * fps)
    pos = cap.get(cv2.CAP_PROP_POS_FRAMES)  # 获得帧位置
    while (pos <= stop * fps):
        ret, frame = cap.read()  # 捕获一帧图像
        out.write(frame)  # 保存帧
        pos = cap.get(cv2.CAP_PROP_POS_FRAMES)

    cap.release()
    out.release()
String filePaths = PathUtil.getFilePath(outFilePath);//获取输出视频绝对地址
    String fileName = DateUtil.getRanddom() + ".mp4";//生成输出视频文件格式,也可以用源文件的格式
    String fileFinalPath = filePaths + fileName;//完整的输出视频绝对路径
    String command = "ffmpeg -ss 00:00:10.0 -i "+file.getAbsolutePath()+" -to 00:02:00 -c copy "+fileFinalPath+" -y";//剪辑命令
    try {
        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec(command);
        InputStream stderr = proc.getErrorStream();
        InputStreamReader isr = new InputStreamReader(stderr);
        BufferedReader br = new BufferedReader(isr);
        String line = null;
        while ((line = br.readLine()) != null){
            System.out.println(line);
        }
        int exitVal = proc.waitFor();
        System.out.println("Process exitValue: " + exitVal);
        return outFilePath+fileName;
    } catch (IOException e) {
        System.out.println(e.getMessage());
    } catch (InterruptedException e) {
        System.out.println(e.getMessage());
    }
    return null ;