如何使用java处理视频数据(剪辑)

如何使用java处理视频数据,截取某一时段的视频并生成新的视频,不限视频格式?
最近公司项目需要用java处理视频数据,从网上翻阅了一些信息,99%的信息是用FFmpeg这个软件(C语言实现),通过java编写指令让FFmpeg来处理,这不可避免的是需要安装FFmpeg,而不是单纯的通过jar包依赖来实现。实际项目中客户可能不希望有第三方exe软件安装在他们的服务器上,
那么问题就是,市面上是否有单纯通过java来处理视频,不依赖第三方软件的方案?
个人猜测,由于java不支持指针,所以无法直接处理视频数据,有没有这方面的专家可以解答一下,不胜感激!

可以实现得,有相关工具,代码如下

<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>30.1.1-jre</version>
        </dependency>
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacv-platform</artifactId>
            <version>1.5.5</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.5.2</version>
        </dependency>
package ai.guiji.csdn.tool;
import cn.hutool.core.util.IdUtil;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import org.bytedeco.javacpp.Loader;
import java.io.File;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.List;
/**
 * @Program: csdn
 * 裁剪⼯具 @Version: V1.0
 */
public class CutOutTool {
  /**
   * 视频裁剪
   *
   * @param videoPath 视频地址
   * @param outputDir 临时⽬录
   * @param startX 裁剪起始x坐标
   * @param startY 裁剪起始y坐标
   * @param weight 裁剪宽度
   * @param height 裁剪⾼度
   * @throws Exception 异常
   */
  public static String cutOutVideo(
      String videoPath,
      String outputDir,
      Integer startX,
      Integer startY,
      Integer weight,
      Integer height)
      Integer height)
      throws Exception {
    List<String> paths = Splitter.on(".").splitToList(videoPath);
    String ext = paths.get(paths.size() - 1);
    if (!Arrays.asList("mp4", "avi", "flv").contains(ext)) {
      throw new Exception("format error");
    }
    String resultPath =
        Joiner.on(File.separator).join(Arrays.asList(outputDir, IdUtil.simpleUUID() + "." + ext));
    String ffmpeg = Loader.load(org.bytedeco.ffmpeg.ffmpeg.class);
    ProcessBuilder builder =
        new ProcessBuilder(
            ffmpeg,
            "-i",
            videoPath,
            "-vf",
            MessageFormat.format(
                "crop={0}:{1}:{2}:{3}",
                String.valueOf(weight),
                String.valueOf(height),
                String.valueOf(startX),
                String.valueOf(startY)),
            "-b",
            "2000k",
            "-y",
            "-threads",
            "5",
            "-preset",
            "ultrafast",
            "-strict",
            "-2",
            resultPath);
    builder.inheritIO().start().waitFor();
    return resultPath;
  }
  public static void main(String[] args) throws Exception {
    System.out.println(
        cutOutVideo("C:\\Users\\yi\\Desktop\\3.mp4", "C:\\Users\\yi\\Desktop\\", 0, 0, 960, 1080));
  }
}
代码说明:
1、cutOutVideo⽅法参数分别为视频路径、输出临时⽬录、起始坐标x值、起始坐标y值、裁剪宽度、裁剪⾼度。
2、采⽤uuid作为临时输出唯⼀id,避免重复。
3、对⽂件后缀格式做了校验,可以按照需求⾃⾏调整。
4、裁剪尺⼨不能超出视频分辨率限制,按照需求⾃⾏调整。