自学内容网 自学内容网

java进行音视频的拆分和拼接

一、下载ffmpeg并安装

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

载后解压缩如下
D:\google-download\ffmpeg-2024-01-28-git-e0da916b8f-essentials_build\bin>ls
ffmpeg.exe  ffplay.exe  ffprobe.exe
展示三个exe可执行文件

配置环境变量

配置后直接在cmd输入ffmpeg -version 验证是否配置成功

二、引入依赖包


<dependency>
    <groupId>net.bramp.ffmpeg</groupId>
    <artifactId>ffmpeg</artifactId>
    <version>0.8.0</version>
</dependency>

三、进行音频文件拆分


import net.bramp.ffmpeg.FFmpeg;
import net.bramp.ffmpeg.FFmpegExecutor;
import net.bramp.ffmpeg.FFprobe;
import net.bramp.ffmpeg.builder.FFmpegBuilder;
import net.bramp.ffmpeg.probe.FFmpegProbeResult;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

public class FFmpegAudioSplitter {

    public static void main(String[] args) {
        try {
            // 初始化FFmpeg和FFprobe
            FFmpeg ffmpeg = new FFmpeg();
            FFprobe ffprobe = new FFprobe();

            // 读取输入文件信息
            FFmpegProbeResult input = ffprobe.probe("D:\\destop\\jay.mp3");

            // 设定拆分的每段时长(以秒为单位)
            int segmentDuration = 60; // 每段时长为60秒
            double totalDuration = input.getFormat().duration; // 输入文件总时长

            // 构建FFmpeg命令以拆分音频文件
            for (int i = 0; i < Math.ceil(totalDuration / segmentDuration); i++) {
                FFmpegBuilder builder = new FFmpegBuilder()
                        .setInput("D:\\destop\\jay.mp3") // 输入文件
                        .addOutput(String.format("D:\\destop\\jayoutput_part_%d.mp3", i + 1)) // 输出文件
                        .setStartOffset(i * segmentDuration, TimeUnit.SECONDS) // 设置开始时间
                        .setDuration(segmentDuration, TimeUnit.SECONDS) // 设置持续时间
                        .addExtraArgs("-c", "copy") // 不重新编码,直接复制
                        .done();

                // 执行命令
                FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe);
                executor.createJob(builder).run();
            }

            System.out.println("音频文件拆分成功。");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

四、进行多音频文件合并


import net.bramp.ffmpeg.FFmpeg;
import net.bramp.ffmpeg.FFmpegExecutor;
import net.bramp.ffmpeg.FFprobe;
import net.bramp.ffmpeg.builder.FFmpegBuilder;

import java.util.ArrayList;
import java.util.List;


public class FFmpegMergeExample {

    public static void main(String[] args) {
        try {
            // 初始化FFmpeg和FFprobe
            // 这里配置了环境变量,可以不设置构建方法参数
            // FFmpeg ffmpeg = new FFmpeg(C:/path/to/ffmpeg);
            // FFprobe ffprobe = new FFprobe("C:/path/to/ffprobe");
            FFmpeg ffmpeg = new FFmpeg();
            FFprobe ffprobe = new FFprobe();

            List<String> list = new ArrayList();
            list.add("D:\\destop\\input1.mp3");
            list.add("D:\\destop\\test.wav");
            list.add("D:\\destop\\input1.mp3");

            // 构建FFmpeg命令
            FFmpegBuilder builder = new FFmpegBuilder()
                    .setVerbosity(FFmpegBuilder.Verbosity.ERROR) // 设置日志级别为error
                    .overrideOutputFiles(true) // 自动覆盖输出文件
                    .addOutput("D:\\destop\\202020.mp3")
                    .addExtraArgs("-map", "[out]") // 映射输出流
                    .done();

            // 拼接格式 [0:0][1:0][2:0]
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < list.size(); i++) {
                builder.addInput(list.get(i));
                sb.append("[" + i + ":0]");
            }
            // 使用复杂过滤器合并音频流
            builder.addExtraArgs("-filter_complex", sb.toString() + "concat=n=" + list.size() + ":v=0:a=1[out]");

            // 执行命令
            FFmpegExecutor executor = new FFmpegExecutor(ffmpeg, ffprobe);
            executor.createJob(builder).run();

            System.out.println("音频文件合并成功。");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


原文地址:https://blog.csdn.net/ffyyhh995511/article/details/140148046

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!