Java实现视频裁剪

xml 复制代码
<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>

java 复制代码
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();
    }
}
相关推荐
星云API技术支持2 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
niucloud-admin2 小时前
JAVA V6 多商户商城 开发文档——job 计划任务开发
java·python·github
海宇AI3 小时前
零信任架构实战:基于海宇柠檬查出险-登记证构建自动化车抵贷核保网关
java·人工智能·架构·自动化
xiangyun614 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun614 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
cfm_29145 小时前
单例模式详解
java
我叫张土豆5 小时前
本体论、DDD、SDD、TDD:AI 编程时代的四层认知栈
java·人工智能
白远山5 小时前
家政服务家政社区派单实战:调度系统架构设计与实现指南
java·开发语言·小程序·架构·需求分析
海南java第二人5 小时前
从诞生到回收:JVM对象生命周期与垃圾回收全链路解析
java
SL_staff6 小时前
JVS-Logic:从页面配置工具到企业级业务逻辑中枢的技术演进
java·算法·全栈