樊帮主 2022-06-22 10:52 采纳率: 0%
浏览 187
已结题

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

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

  • 写回答

1条回答 默认 最新

  • xcLeigh 全栈领域优质创作者 2022-06-22 11:01
    关注
    获得2.50元问题酬金

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

    <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、裁剪尺⼨不能超出视频分辨率限制,按照需求⾃⾏调整。
    
    评论

报告相同问题?

问题事件

  • 系统已结题 6月30日
  • 创建了问题 6月22日

悬赏问题

  • ¥500 服务器搭建cisco AnyConnect vpn
  • ¥15 用大厂网站防红自己网站
  • ¥15 悬赏Python-playwright部署在centos7上
  • ¥15 psoc creator软件有没有人能远程安装啊
  • ¥15 快速扫描算法求解Eikonal方程咨询
  • ¥20 我的是道格手机,重置后屏幕右上角出现红色字的未写入tee key 和未写入google key请问怎么去掉啊
  • ¥15 校内二手商品转让网站
  • ¥20 高德地图聚合图层MarkerCluster聚合多个点,但是ClusterData只有其中部分数据,原因应该是有经纬度重合的地方点,现在我想让ClusterData显示所有点的信息,如何实现?
  • ¥100 求Web版SPC控制图程序包调式
  • ¥20 指导如何跑通以下两个Github代码