java调用第三方工具ffmpeg将所有的ts片段合成.mp4视屏

package org.springeos.modules.quartz.m3u8.main;

import org.springeos.common.utils.FastDFSClient;
import ws.schild.jave.*;

import java.io.*;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListSet;

public class test {
   //安装ffmpeg的存放路径
   private static String ffmpeg = "F:\\ffmpeg\\ffmpeg-4.4-essentials_build\\ffmpeg-4.4-essentials_build\\bin\\ffmpeg.exe";
   //提取的音频、合成的视频存放路径,不存在会自动创建
   private static String saveMediaPath = "F:\\ts\\";
   static {
      //如果没有文件夹,则创建
      File saveMediaFile = new File(saveMediaPath);
      if (!saveMediaFile.exists() && !saveMediaFile.isDirectory()) {
         saveMediaFile.mkdirs();
      }
   }
   public static void main(String[] args) throws IOException {
      //多视频拼接合并为一个mp4格式视频
      File file=new File("F:\\ts\\1.ts");
      File file1=new File("F:\\ts\\6.ts");
      File file2=new File("F:\\ts\\5.ts");
      File file3=new File("F:\\ts\\2.ts");
      File file4=new File("F:\\ts\\3.ts");
      File file5=new File("F:\\ts\\4.ts");
      File file6=new File("F:\\ts\\7.ts");
      File file7=new File("F:\\ts\\8.ts");
      File file8=new File("F:\\ts\\9.ts");
      //这儿用的集合是set,因为set集合可以去重,因为无序,所以用lamada表达式做了排序
      Set<File> finishedFiles = new ConcurrentSkipListSet<>(Comparator.comparingInt(o -> Integer.parseInt(o.getName().replace(".ts", ""))));
      finishedFiles.add(file);
      finishedFiles.add(file1);
      finishedFiles.add(file2);
      finishedFiles.add(file3);
      finishedFiles.add(file4);
      finishedFiles.add(file5);
      finishedFiles.add(file6);
      finishedFiles.add(file7);
      finishedFiles.add(file8);
      mergeVideos(finishedFiles);
      //下面这个是用List集合
      List<String> video = new ArrayList<>();
      video.add("F:\\ts\\1.ts");
      video.add("F:\\ts\\2.ts");
      video.add("F:\\ts\\3.ts");
      video.add("F:\\ts\\4.ts");
      video.add("F:\\ts\\5.ts");
      video.add("F:\\ts\\6.ts");
      video.add("F:\\ts\\7.ts");
      video.add("F:\\ts\\8.ts");
      video.add("F:\\ts\\9.ts");
      mergelistVideos(video);

   }
   /**
    * 多视频拼接合并
    *
    * @param videoList 视频文件路径的List
    */
   public static void mergeVideos(Set<File> videoList) {
      //时间作为合并后的视频名
      String getdatatime = nowTime();
      //所有要合并的视频转换为ts格式存到videoList里
      List<String> command1 = new ArrayList<>();
      command1.add(ffmpeg);
      command1.add("-i");
      StringBuffer buffer = new StringBuffer("\"concat:");
      //迭代器循环
      Iterator<File> it = videoList.iterator();
      //迭代器循环,判断有没有当前元素
      while (it.hasNext()) {
         File str = it.next();
         buffer.append(str);
         System.out.println(str);
         buffer.append("|");
      }
      buffer.append("\"");
      command1.add(String.valueOf(buffer));
      command1.add("-c");
      command1.add("copy");
      command1.add(saveMediaPath + "视频合并" + getdatatime + ".mp4");
      commandStart(command1);
   }
   /**
    * 多视频拼接合并
    *
    * @param videoList 视频文件路径的List
    */
   public static void mergelistVideos(List<String> videoList) {
      //时间作为合并后的视频名
      String getdatatime = nowTime();
      //所有要合并的视频转换为ts格式存到videoList里
      List<String> command1 = new ArrayList<>();
      command1.add(ffmpeg);
      command1.add("-i");
      StringBuffer buffer = new StringBuffer("\"concat:");
      for (int i = 0; i < videoList.size(); i++) {
         buffer.append(videoList.get(i));
         if (i != videoList.size() - 1) {
            buffer.append("|");
         } else {
            buffer.append("\"");
         }
      }
      command1.add(String.valueOf(buffer));
      command1.add("-c");
      command1.add("copy");
      command1.add(saveMediaPath + "视频合并" + getdatatime + ".mp4");
      commandStart(command1);
   }


   /**
    * 获取当前时间,用于作为文件名
    */
   public static String nowTime() {
      DateTimeFormatter f3 = DateTimeFormatter.ofPattern("yyyy-MM-dd-HH-mm-ss");
      LocalDate nowdata = LocalDate.now();
      LocalTime nowTime = LocalTime.now();
      return nowdata.atTime(nowTime).format(f3);
   }
   /**
    * 调用命令行执行
    *
    * @param command 命令行参数
    */
   public static void commandStart(List<String> command) {
      command.forEach(v -> System.out.print(v + " "));
      System.out.println();
      System.out.println();
      ProcessBuilder builder = new ProcessBuilder();
      //正常信息和错误信息合并输出
      builder.redirectErrorStream(true);
      builder.command(command);
      //开始执行命令
      Process process = null;
      try {
         process = builder.start();
         //如果你想获取到执行完后的信息,那么下面的代码也是需要的
         String line = "";
         BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
         while ((line = br.readLine()) != null) {
            System.out.println(line);
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

}

要执行上面的代码必须先下载安装ffmpeg工具,去下面的官网链接下载

官网地址:http://ffmpeg.org/download.html

下载Windows版本的时候点击如下图

点击进去之后如下图选择

然后将其解压,解压完成后会有三个文件

这三个文件,分别对应的是,一个工具执行命令,第二个是播放的执行命令。第三个是查看文件内容信息工具执行命令。

下载完成解压后接着配置环境变量在电脑中

配置如下图:

选择电脑的系统变量中的path,然后加上你的安装目录,一直到bin这层目录

我的加入的是 F:\ffmpeg\ffmpeg-4.4-essentials_build\ffmpeg-4.4-essentials_build\bin,记住加到bin这层目录才可以

配置完环境变量之后,在cmd命令窗口中输入命令:ffmpeg -version

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值