java 如何把多个音频合成一个

java 复制代码
    public static void main(String[] args) {
        File file1 = new File("D:\\配音\\LOL稳健4.mp3");
        File file2 = new File("D:\\配音\\LOL稳健4-2.mp3");
        File file3 = new File("D:\\配音\\LOL稳健444.mp3");

        // 创建要合并的音频文件对象列表
        List<File> sourceFiles = new ArrayList<>();
        sourceFiles.add(file1);
        sourceFiles.add(file2);

        mergeAudioFiles(sourceFiles, file3);
    }

    private static void mergeAudioFiles(List<File> audioFiles, File outputFile) {
        try {
            long totalLength = 0;
            AudioFormat audioFormat = null;
            AudioInputStream audioInputStream = null;
            List<AudioInputStream> audioInputStreams = new ArrayList<>();

            // 读取每个音频文件,获取其音频格式和音频流
            for (File audioFile : audioFiles) {
                audioInputStream = AudioSystem.getAudioInputStream(audioFile);
                totalLength += audioInputStream.getFrameLength();
                audioFormat = audioInputStream.getFormat();
                audioInputStreams.add(audioInputStream);
            }

            // 创建新的音频格式和流
            boolean isSigned = audioFormat.getEncoding() == AudioFormat.Encoding.PCM_SIGNED;
            AudioFormat newAudioFormat = new AudioFormat(audioFormat.getSampleRate(),
                audioFormat.getSampleSizeInBits(),
                audioFormat.getChannels(),
                isSigned,
                audioFormat.isBigEndian());
            AudioInputStream mergedAudioStream = new AudioInputStream(
                new SequenceInputStream(Collections.enumeration(audioInputStreams)),
                newAudioFormat,
                totalLength
            );

            // 写入合并后的音频流到输出文件
            AudioSystem.write(mergedAudioStream, AudioFileFormat.Type.WAVE, outputFile);

            // 关闭所有音频流
            for (AudioInputStream ais : audioInputStreams) {
                ais.close();
            }

            mergedAudioStream.close();
        } catch (UnsupportedAudioFileException | IOException e) {
            e.printStackTrace();
        }
    }
相关推荐
better_liang7 小时前
每日Java面试场景题知识点之-消息队列MQ核心场景与实战
java·面试·kafka·消息队列·rabbitmq·rocketmq·mq
小江的记录本7 小时前
【JVM虚拟机】垃圾回收GC:四种引用类型:强引用、软引用、弱引用、虚引用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
小马爱打代码8 小时前
Spring源码 第四篇:Spring 5 源码深度拆解:AOP 全流程核心原理
java·后端·spring
better_liang8 小时前
每日Java面试场景题知识点之-SpringBoot启动流程
java·面试·springboot·源码解析·启动流程
RyFit8 小时前
Java + AI 实战:Spring AI 从入门到企业级落地
java·人工智能·spring
君为先-bey8 小时前
CogVideoX——Transformer从文本到视频的扩散模型
深度学习·音视频·transformer·扩散模型
Raink老师8 小时前
【AI面试临阵磨枪-77】音视频 + AI:实时字幕、翻译、降噪、虚拟人、多模态对话
人工智能·面试·音视频
ZhengEnCi9 小时前
01-如何监听接口调用情况?
java·spring boot·后端
FrameNotWork9 小时前
HarmonyOS 短视频滑动交互实现:打造流畅的上下切换体验
音视频·交互·harmonyos
JAVA面经实录91710 小时前
MyBatis学习体系
java·mybatis