1 安装FFmpeg
https://www.gyan.dev/ffmpeg/builds/
2 代码

        String inputVideoPath = "D:\\workspace\\demo\\input.mp4"; // 输入视频文件的路径
        String outputVideoPath = "D:\\workspace\\demo\\out_mark.mp4"; // 输出视频文件的路径

        ProcessBuilder processBuilder = new ProcessBuilder(
                "ffmpeg",
                "-i", inputVideoPath, // -i 标志后的参数是输入文件
                "-c:v", "libx265", // 使用x265编码器
                "-vf", "drawtext=fontfile=C:\\Windows\\Fonts\\simhei.ttf:text='hello':fontsize=24:x=10:y=10:fontcolor=white",
                "-crf", "28", // 设置常量速率因子,数值越小,质量越高
                outputVideoPath // 输出文件路径
        );

        Process process = processBuilder.inheritIO().start(); 
        // 开始转码过程


        // 等待FFmpeg进程结束,
        /*
         * BufferedReader reader1 = new BufferedReader(new
         * InputStreamReader(process.getInputStream()));
         * BufferedReader reader2 = new BufferedReader(new
         * InputStreamReader(process.getErrorStream()));
         * 在调用 waitFor()
         * 方法时,Java虚拟机(JVM)会等待关联的进程结束。如果在进程结束之前,其标准输出流(inputStream)或标准错误流(errorStream)
         * 的缓冲区满了,那么 waitFor() 方法可能会阻塞,因为操作系统的管道机制会阻止进程继续执行直到缓冲区中的数据被读取。
         * 或者在start()之前, 调用 processBuilder.inheritIO()将所有信息输出至控制台上
         */
        int exitCode = process.waitFor();
        if (exitCode == 0) {
            System.out.println("Video transcoding completed successfully.");
        } else {
            System.out.println("Video transcoding failed with exit code " + exitCode);
        }

3 使用iPhone拍的一个4MB的小视频, 转化后为1MB。使用肉眼基本分辨不出质量的下降


supermassive
1 声望1 粉丝