0

我正在制作一个程序,以音频形式记录抽认卡,然后将它们编译成一组,这样我就可以在通勤时收听。

我试图在卡片的正面和背面之间添加一点沉默,让自己有时间思考。为此,我录制了大约 3 秒没有声音的音频,然后我计划将其连接多次以提供所需的静音量。当我尝试这样做时,我发现我实际上并没有添加任何新声音。

这是我这样做的一种简化方式:

import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import java.io.File;
import java.io.SequenceInputStream;

public class AudioConcatenaterMultiple {

        public static void main(String[] args) {
            String wavFile = "RecordAudio.wav";
            int concatenateTimes = 5;

            try {
                AudioInputStream clip = AudioSystem.getAudioInputStream(new File(wavFile));

                double clipDuration = getAudioLength(clip);
                System.out.println("Clip duration: " + clipDuration);
                System.out.println("Target duration: " + clipDuration * (concatenateTimes + 1));

                AudioInputStream appendedFiles = clip;

                for (int i = 0; i < concatenateTimes; i++) {
                    appendedFiles = concatenate(appendedFiles, clip);
                }

                double appendedDuration = getAudioLength(appendedFiles);
                System.out.println("Appended duration: " + appendedDuration);
                AudioSystem.write(appendedFiles,
                        AudioFileFormat.Type.WAVE,
                        new File("wavAppended.wav"));

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    private static double getAudioLength(AudioInputStream clip) {
        AudioFormat format = clip.getFormat();
        long frames = clip.getFrameLength();
        return (frames+0.0) / format.getFrameRate();
    }

    private static AudioInputStream concatenate(AudioInputStream clip1, AudioInputStream clip2) {
            return new AudioInputStream(
                            new SequenceInputStream(clip1, clip2),
                            clip1.getFormat(),
                            clip1.getFrameLength() + clip2.getFrameLength());
        }
}

我注意到如果我把它放在 for 循环的开头

clip = AudioSystem.getAudioInputStream(new File(wavFile));

然后它工作。

为什么每次都需要一个新的输入流?有一个更好的方法吗?就是感觉没那么干净。

谢谢

4

0 回答 0