首页 > 编程语言 >java把m3u8视频转为mp4

java把m3u8视频转为mp4

时间:2024-07-17 23:09:12浏览次数:9  
标签:java String m3u8 fw System mp4 File new append

java把m3u8视频转为mp4

代码

import java.io.*;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @Title: Process
 * @Author cxf
 * @Package com.example.demo.test
 * @Date 2024/7/11 10:29
 * @description: 测试
 */
public class ProcessUtils {

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        List<String> splice = splice();
        if (!splice.isEmpty()) {
            for (String command : splice) {
                int result = ProcessUtils.executeCommand(command);
                if (result == 0) {
                    try {
                        //System.out.println("command "+command);
                        String replace = command.replace("copy /b ", "");
                        String[] split = replace.split(" \\+ ");
                        String string = split[0];
                        String sub = string.substring(0, string.lastIndexOf("\\"));
                        String target = sub.substring(0, sub.lastIndexOf("\\"));
                        File file = new File(target);
                        if (file.exists()) {
                            deleteDirectory(file);
                        }
                        TimeUnit.SECONDS.sleep(3);
                    } catch (Exception e) {

                    }
                } else {
                    System.out.println(command);
                    System.out.println(result);
                }
            }
        }

        long end = System.currentTimeMillis();
        System.out.println("处理完成,耗时:" + ((end - start) / 1000) + "秒");

       /* try {
            TimeUnit.MINUTES.sleep(4);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/
    }

    private static List<String> splice() {
        int count = 0;
        int stop = 10;
        // 25个小文件合成一个临时文件
        int batchSize = 30;

        List<String> strList = new ArrayList<>();
        try {
            // ts文件所在目录
            String dirPath = "D:\\movie";
            // MP4存放目录
            String moviePath = "D:\\video\\";
            File file = new File(dirPath);
            if (file.exists()) {// 1.判断文件是否存在
                File[] movieDir = file.listFiles();
                for (File dir : movieDir) {
                    if (count > stop) {
                        break;
                    }
                    File[] tsDir = dir.listFiles();
                    if(tsDir.length > 0){
                        count++;
                        if (dir.isDirectory()) {
                            String tmpDir = dir.getAbsolutePath();
                            File videoPath = new File(tmpDir);
                            File[] files = videoPath.listFiles();
                            List<String> sortList = new ArrayList<String>();
                            for (File file2 : files) {
                                if (file2.isDirectory()) {
                                    String absolutePath = file2.getAbsolutePath();

                                    File videos = new File(absolutePath + "");
                                    File[] ts = videos.listFiles();
                                    int total = ts.length;
                                    if (total > 0) {
                                        for (File t : ts) {
                                            String name = t.getName();
                                            if (!(name.endsWith(".class") || name.endsWith(".bat"))) {
                                                if (name.endsWith("ts")) {
                                                    sortList.add(name);
                                                }
                                            }
                                        }
                                        sortList.sort((o1, o2) -> {
                                            String split1 = o1.split("\\.")[0];
                                            String split2 = o2.split("\\.")[0];
                                            int parseInt1;
                                            int parseInt2;
                                            try {
                                                parseInt1 = Integer.parseInt(split1);
                                                parseInt2 = Integer.parseInt(split2);
                                            } catch (NumberFormatException e) {//如果是非数字,按照原来的顺序
                                                return 0;
                                            }
                                            if (parseInt1 > parseInt2) {
                                                return 1;
                                            } else {
                                                return -1;
                                            }
                                        });
                                        int size = sortList.size();

                                        if (size > batchSize) {
                                            List<String> temList = new ArrayList<>();
                                            String tmp = tmpDir + "\\tmp\\";
                                            File t = new File(tmp);
                                            if (!t.exists()) {
                                                t.mkdir();
                                            } else {
                                                tmp = tmpDir + "\\tmp2\\";
                                                t = new File(tmp);
                                                t.mkdir();
                                            }

                                            for (int s = 0; s < size; s += batchSize) {
                                                int endIndex = Math.min(s + batchSize, size);
                                                List<String> subList = sortList.subList(s, endIndex);
                                                int subListSize = subList.size();
                                                StringBuffer fw = new StringBuffer("copy /b ");
                                                for (int i = 0; i < subListSize; i++) {
                                                    if (i == subListSize - 1) {
                                                        fw.append(absolutePath).append("\\");
                                                        fw.append(subList.get(i));
                                                        break;
                                                    }
                                                    fw.append(absolutePath).append("\\");
                                                    fw.append(subList.get(i)).append(" + ");
                                                }
                                                long timeMillis = System.currentTimeMillis();

                                                fw.append(" ").append(tmp);
                                                fw.append(timeMillis).append(".ts");

                                                String com = fw.toString();
                                                //System.out.println(com);
                                                temList.add(com);
                                                TimeUnit.MILLISECONDS.sleep(500);
                                            }
                                            tmpVideo(temList, absolutePath);
                                        } else {
                                            StringBuffer fw = new StringBuffer("copy /b ");
                                            for (int i = 0; i < size; i++) {
                                                if (i == size - 1) {
                                                    fw.append(absolutePath).append("\\");
                                                    fw.append(sortList.get(i));
                                                    break;
                                                }
                                                fw.append(absolutePath).append("\\");
                                                fw.append(sortList.get(i)).append(" + ");
                                            }
                                            long timeMillis = System.currentTimeMillis();
                                            fw.append(" ").append(moviePath);
                                            fw.append(timeMillis).append(".mp4");
                                            String com = fw.toString();
                                            //System.out.println(com);
                                            strList.add(com);
                                            TimeUnit.MILLISECONDS.sleep(1000);
                                        }
                                    }
                                }
                            }
                        }
                    }else{
                        System.out.println("空文件夹 "+ dir.getAbsolutePath());
                     dir.delete();
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return strList;
    }

    // 将多个小文件合成临时文件,删除小文件
    private static void tmpVideo(List<String> strList, String path) throws Exception {
        if (!strList.isEmpty()) {
            boolean flag = true;
            int r = 0;
            for (String com : strList) {
                //System.out.println(com);
                int result = ProcessUtils.executeCommand(com);
                r++;
                if (result == 0) {
                    //TimeUnit.MILLISECONDS.sleep(1000);
                } else {
                    flag = false;
                    System.out.println("失败批次:" + com);
                }
            }
            if (flag) {
                deleteDirectory(new File(path));
                System.out.println("删除 " + path + " 成功");
            }

        }
    }


    public static int executeCommand(String command) {
        int exitCode = 1;
        Charset charset = System.getProperty("os.name").toLowerCase().contains("win") ? Charset.forName("GBK") : Charset.defaultCharset();
        String os = System.getProperty("os.name").toLowerCase();
        List<String> commands = new ArrayList<>();

        // 判断操作系统类型,并准备命令
        if (os.contains("win")) {
            // Windows
            commands.add("cmd");
            commands.add("/c");
        } else {
            // Unix/Linux/MacOS
            commands.add("/bin/sh");
            commands.add("-c");
        }

        commands.add(command);

        // 执行命令并获取结果
        try {
            ProcessBuilder processBuilder = new ProcessBuilder(commands);
            Process process = processBuilder.start();

            // 获取输出
            String output = readStream(process.getInputStream(), charset);
            // 等待进程结束
            exitCode = process.waitFor();
            if (exitCode == 0) {
                return exitCode;
            } else {
                String error = readStream(process.getErrorStream(), charset);
                System.out.println("exit code " + exitCode + " and error: " + error);
                throw new IOException("exit code " + exitCode + " and error: " + error + output);
            }
        } catch (IOException | InterruptedException e) {
            Thread.currentThread().interrupt();
            //return "Error: " + e.getMessage();
        }
        return exitCode;
    }

    private static void deleteDirectory(File directory) throws Exception {
        if (directory.exists()) {
            Files.walk(directory.toPath())
                    .sorted((p1, p2) -> -p1.compareTo(p2))
                    .map(Path::toFile)
                    .forEach(File::delete);

            System.out.println("已删除: " + directory.getAbsolutePath());
        }
    }

    private static String readStream(InputStream inputStream, Charset charset) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, charset));
        StringBuilder builder = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            builder.append(line);
            builder.append(System.getProperty("line.separator"));
        }
        return builder.toString();
    }

    public static void test(String[] args) throws IOException {
        String property = System.getProperty("user.dir");
        File file = new File(property);// 文件夹
        String runFilePath = property + "/new.bat";
        File runFile = new File(runFilePath);// 生成的可执行文件
        FileWriter fw = null;
        try {
            fw = new FileWriter(runFile);
            fw.append("copy /b ");
            fw.flush();
            if (file.exists()) {// 1.判断文件是否存在
                if (file.isDirectory()) {// 2.判断是否为文件夹
                    File[] listFiles = file.listFiles();
                    List<String> sortList = new ArrayList<String>();
                    for (File file2 : listFiles) {
                        String name = file2.getName();// 获取名字
                        if (!(name.endsWith(".class") || name.endsWith(".bat"))) {
                            sortList.add(name);
                        }
                    }
                    //4.排序
                    sortList.sort((o1, o2) -> {
                        String split1 = o1.split("\\.")[0];
                        String split2 = o2.split("\\.")[0];
                        int parseInt1;
                        int parseInt2;
                        try {
                            parseInt1 = Integer.parseInt(split1);
                            parseInt2 = Integer.parseInt(split2);
                        } catch (NumberFormatException e) {//如果是非数字,按照原来的顺序
                            return 0;
                        }
                        if (parseInt1 > parseInt2) {
                            return 1;
                        } else {
                            return -1;
                        }
                    });
                    int size = sortList.size();
                    for (int i = 0; i < size; i++) {
                        System.out.println(sortList.get(i));
                        if (i == size - 1) {
                            fw.append(sortList.get(i));
                            break;
                        }
                        fw.append(sortList.get(i) + "+");
                        fw.flush();
                    }
                    fw.append(" new.mp4");
                    fw.flush();
                    fw.close();
                }
            }
            callCmd(runFilePath);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fw != null) {
                fw.close();
            }
        }
    }


    private static void callCmd(String locationCmd) {
        StringBuilder sb = new StringBuilder();
        InputStream in = null;
        BufferedReader bufferedReader = null;
        try {
            Process child = Runtime.getRuntime().exec(locationCmd);
            in = child.getInputStream();
            bufferedReader = new BufferedReader(new InputStreamReader(in));
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                sb.append(line + "\n");
            }
            bufferedReader.close();
            in.close();
            try {
                child.waitFor();
            } catch (InterruptedException e) {
                System.out.println(e);
            }
            System.out.println("sb:" + sb.toString());
            System.out.println("callCmd execute finished");
            //执行完成后,将执行文件删除。
            File file = new File(locationCmd);
            file.delete();
        } catch (IOException e) {
            System.out.println(e);
        } finally {
            try {
                //将流关闭,从小往大关,防止流未关闭占用内存
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException e) {
            }
        }
    }


}

标签:java,String,m3u8,fw,System,mp4,File,new,append
From: https://www.cnblogs.com/cxfbk/p/18308486

相关文章

  • 编程世界的对决:JavaScript vs Java
    在编程领域,Java和JavaScript这两门语言各有千秋。它们不仅在语法上有着明显的区别,在编程理念、表现力、类型转换以及代码的易读性和复杂性方面也有着巨大的差异。本文将深入探讨JavaScript相较于Java的优势,以及两者在代码风格和开发体验上的不同。1.表现力的对比1.1JavaScr......
  • 【头歌】HBase开发: Java API 管理表 答案
    专栏已收集头歌大数据所有答案第一关JavaAPI获取表的列表:packagestep1; importjava.util.ArrayList;importjava.util.List; importorg.apache.hadoop.conf.*;importorg.apache.hadoop.hbase.*;importorg.apache.hadoop.hbase.client.*;importorg.apache.......
  • Java二叉树经典例题
    目录一.相同的树二.翻转二叉树三.平衡二叉树四.对称二叉树五.根据前(后)和中序排序构建二叉树1.前序和中序构建2.后序和中序构建六.二叉树的层序遍历七.二叉树非递归遍历1.前序遍历2.中序遍历3.后序遍历八.总结前言:前面说过树是通过递归定义的。做二叉树的题,递......
  • JavaSE--分支、循环结构
    流程控制语句    流程控制语句就是在Java中用来设置Java代码如何运行及运行顺序的。    分类:    顺序结构【默认结构】    分支结构【选择结构】    循环结构【重复结构】顺序结构    顺序结构是Java程序中用来设置Java......
  • JavaSE--基础语法
    JDK、JVM、JRE的区别以及作用    JDK:Java开发工具包(包括JRE和相关工具包)    JVM:Java虚拟机(通过JVM可以实现跨平台开发)    JRE:Java运行环境(包含JVM及Java核心类库)Java语言特性    简单    面向对象    跨平台(一次编译......
  • Java生成二维码的方法,QRCode、JQuery、Zxing
    QRcode国标简单示例相关资源下载zxing实现生成 /***生成二维码**@paramwidth*@paramheight*@paramname*@paramformat*@paramcontent*/publicstaticStringgenerateQRCodeByZxing(intwidth,i......
  • Java面试 : String
    串池:StringTable,可以理解为一个对象数组["a","b","ab"]每一个元素都是一个字符串对象1.常量池与串池的关系Strings1="a";Strings2="b";Strings3="ab";上述代码的运行过程:常量池中的信息会被加载到运行时常量池中,这时abab都是常量池中的符号,还没有变成Java......
  • Java核心API——Object类
    Object简介         Object类是所有类的根类,这意味着在Java中创建的每一个类都直接或间接地继承自Object类(除了Object类本身以外,因为它没有父类)    看到这里你或许还是不明为什么要有Object类下面我就详细解释。首先这里就不得不提到Java这门语言让人熟......
  • Java——IO流
    1.IO流简介流是一个抽象的概念,它是一串连续动态的数据集合Java.io包中几乎包含了所有操作输入和输出需要的类,同时也支持很多格式,比如:基本类型,对象,本地化字符等io包中主要包括四大抽象类,分别是Writer,OutputStream,InputStream,Reader,其中Writer和OutputStream属于......
  • 常用的 JavaScript 数组处理方法
    1.map方法用于创建一个新数组,其结果是该数组中的每个元素调用一个提供的函数后返回的结果。letitems=[{id:1,name:'item1'},{id:2,name:'item2'},{id:3,name:'item3'}];letitemNames=items.map(item=>item.name);console.log(itemNames);......