Java实现视频裁剪

<dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>5.8.5</version>
    </dependency>


    <dependency>
      <groupId>org.bytedeco</groupId>
      <artifactId>javacv-platform</artifactId>
      <version>1.5.5</version>
    </dependency>

import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;


import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.map.MapUtil;

import java.util.Map;


public class Test {


    /**
     * 生成预览视频
     *
     * @param sourcePath
     * @param targetPath
     */
    public static void generatePreviewVideo(String sourcePath, String targetPath, long startMin, long durationMin) {
        try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(sourcePath);
             FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(targetPath, grabber.getImageWidth(), grabber.getImageHeight(), 2)) {
            grabber.start();
            // 重新设置 宽高
            recorder.setImageWidth(grabber.getImageWidth());
            recorder.setImageHeight(grabber.getImageHeight());

            // 解决生成的视频无法播放的问题
            recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);
            recorder.setFormat("mov");
            recorder.setFrameRate(grabber.getFrameRate());
            recorder.setSampleRate(grabber.getSampleRate());
            recorder.setAudioChannels(grabber.getAudioChannels());
            recorder.setFrameRate(grabber.getFrameRate());

            grabber.setTimestamp(startMin * 60 * 1000000);

            Map<String, Object> filter = MapUtil.filter(BeanUtil.beanToMap(grabber));

            BeanUtil.copyProperties(filter, recorder);

            recorder.start();

            Frame inFrame;
            int count = 0;
            while ((inFrame = grabber.grab()) != null) {
                // System.out.println(inFrame.timestamp);
//                if (inFrame.timestamp >= 50 * 1000 * 1000) {
//                    break;
//                }
                if (count > durationMin*60*100) {
                    break;
                }
                count++;
                recorder.record(inFrame);
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }


    public static void main(String[] args) {
        String inFile = "/Users/reedfan/Desktop/监控系统.mov";   //读取的视频
        String outFile = "/Users/reedfan/Desktop/test1.mov";  //将要生成的剪切视频
        generatePreviewVideo(inFile, outFile,1,1);
//        test();
    }
}

import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.FFmpegFrameRecorder;
import org.bytedeco.javacv.Frame;

import java.util.UUID;

public class VideoCutter {

    public static String videoPath_temp_path = "/Users/reedfan/Desktop/";


    public static void main(String[] args) {

        String videoPath = videoPath_temp_path + "监控系统.mov";

        try {
            cutVideo(videoPath,10,20,true);
        } catch (FFmpegFrameGrabber.Exception e) {
            e.printStackTrace();
        } catch (FFmpegFrameRecorder.Exception e) {
            e.printStackTrace();
        }


    }

    /**
     * @param videoPath   视频路径
     * @param start       视频开始时间 ,单位秒
     * @param end         视频结束时间
     * @param recodeAudio 是否录制音频
     * @return 生成文件路径
     * @apiNote 切割视频指定的位置
     */

    public static String cutVideo(String videoPath, Integer start, Integer end, boolean recodeAudio) throws FFmpegFrameGrabber.Exception, FFmpegFrameRecorder.Exception {
        FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(videoPath);
        grabber.start();
        String s = UUID.randomUUID().toString() + ".mov";
        FFmpegFrameRecorder fFmpegFrameRecorder = new FFmpegFrameRecorder(videoPath_temp_path + s, grabber.grabImage().imageWidth, grabber.grabImage().imageHeight, recodeAudio ? 1 : 0);
        fFmpegFrameRecorder.start();
        Frame frame = null;
        while ((frame = grabber.grabFrame(recodeAudio, true, true, false)) != null) {
            if ((start == null ? 0 : (start * 1000000)) < frame.timestamp && (end == null || ((end * 1000000) > frame.timestamp))) {
                fFmpegFrameRecorder.record(frame);
            }
        }

        fFmpegFrameRecorder.stop();
        fFmpegFrameRecorder.release();
        return s;
    }

}
  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值