You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现音频文件按指定长度裁剪的技术求助

嘿,我来帮你完善这个音频裁剪的Java程序!看起来你已经搭建好了基础框架,接下来我们把核心的裁剪逻辑补全,实现把WAV音频文件裁剪到指定长度的功能。

完整实现代码

import java.util.*;
import java.io.*;
import javax.sound.sampled.*;

public class cuttest_3 {
    public static void main(String[] args) {
        int totalFramesRead = 0;
        File fileIn = new File("output1.wav");
        // 这里可以自定义要裁剪到的时长(单位:秒)
        double targetDuration = 10.0;
        File croppedFile = new File("cropped_audio.wav");

        try {
            AudioInputStream originalStream = AudioSystem.getAudioInputStream(fileIn);
            AudioFormat audioFormat = originalStream.getFormat();

            // 计算目标时长对应的音频帧数:时长 × 采样率 × 通道数
            float sampleRate = audioFormat.getSampleRate();
            int channelCount = audioFormat.getChannels();
            long targetFrameCount = (long) (targetDuration * sampleRate * channelCount);

            // 创建仅包含目标帧数的音频输入流(从文件开头截取)
            AudioInputStream croppedStream = new AudioInputStream(
                    originalStream,
                    audioFormat,
                    targetFrameCount
            );

            // 将裁剪后的音频写入输出文件
            AudioSystem.write(croppedStream, AudioFileFormat.Type.WAVE, croppedFile);

            // 关闭资源
            croppedStream.close();
            originalStream.close();

            System.out.println("裁剪完成!输出文件路径:" + croppedFile.getAbsolutePath());

        } catch (UnsupportedAudioFileException e) {
            System.err.println("错误:不支持该音频文件格式 → " + e.getMessage());
        } catch (IOException e) {
            System.err.println("IO错误:文件读取/写入失败 → " + e.getMessage());
        } catch (LineUnavailableException e) {
            System.err.println("音频线路错误:无法访问音频资源 → " + e.getMessage());
        }
    }
}

关键逻辑说明

  • 帧数计算:音频的"帧"对应所有通道的一组采样点,所以目标帧数的计算公式是 目标时长(秒) × 采样率(Hz) × 通道数。比如44100Hz采样率的立体声音频,10秒对应的帧数就是 10 × 44100 × 2 = 882000。
  • 裁剪流创建:通过AudioInputStream的重载构造方法,直接基于原流生成一个仅包含指定帧数的新流,这是JavaSound API内置的便捷裁剪方式。
  • 文件写入:使用AudioSystem.write()将裁剪后的流输出为WAV文件,确保指定格式为AudioFileFormat.Type.WAVE。

额外扩展提示

如果需要裁剪音频的中间片段(不是从开头截取),可以先跳过指定帧数再截取:

// 示例:跳过前5秒的音频,再截取10秒
long skipFrames = (long) (5.0 * sampleRate * channelCount);
originalStream.skip(skipFrames);
long targetFrameCount = (long) (10.0 * sampleRate * channelCount);

注意:JavaSound API仅原生支持WAV格式,若要处理MP3等其他格式,需要引入第三方库(比如JavaLayer)。

内容的提问来源于stack exchange,提问作者Flowso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:50:34