Как я могу перевернуть аудио файл? - PullRequest
0 голосов
/ 06 ноября 2019

Я хочу знать, как я могу взять аудиофайл, и вместо того, чтобы воспроизводить его вперед, я хочу воспроизвести его назад.

Это то, что у меня есть

    public void addSong(String song) throws IOException, UnsupportedAudioFileException, LineUnavailableException {

    AudioInputStream audioStream = AudioSystem.getAudioInputStream(new File(song + ".wav"));

    System.out.println(AudioSystem.getAudioInputStream(new File(song + ".wav")));

    AudioFormat format = audioStream.getFormat();
    DataLine.Info info = new DataLine.Info(Clip.class, format);
    Clip clip = (Clip) AudioSystem.getLine(info);

    songs.add(song);
    songsMedia.add(audioStream);
    clips.add(clip);
    //display.makeButton(song);
}
public void playSong(String song) throws LineUnavailableException, IOException, UnsupportedAudioFileException {
    if(songs.contains(song)){
        int nFrames = songsMedia.get(0).getFormat().getFrameSize();

        stopSong=true;
        index = songs.indexOf(song);


        clips.get(index).open(songsMedia.get(index));
        clips.get(index).start();
        playingSongs.add(clips.get(index));



    }else if(song == "Pause/Play"){
        System.out.print("");
    }
    else{
        System.out.println(song);
        System.out.println("Cannot Find Song");
    }
}

КакМогу ли я взять все сэмплы из аудиопотока, чтобы их можно было переставить?

1 Ответ

0 голосов
/ 07 ноября 2019

К сожалению, API Clip не предоставляет данные, хранящиеся в Clip. Но вы можете получить то, что вы хотите, используя вместо этого SourceDataLine для воспроизведения и добавив несколько шагов.

Сначала получите все отдельные сэмплы, используя AudioInputStream.

байты должны быть обработаны небольшими порциями в соответствии с размером кадра, как указано в аудиоформате, и упорядочены в обратном порядке «кадров». Например, если аудиоформату требуется четыре байта на кадр (как в стереофоническом 16-битном кодировании), обратное преобразование будет происходить порциями по четыре байта.

Например, аудиофайл длиной 4 кадра, состоящий из байтов 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, в обратном порядке кадров становится 12,13,14,15,8,9,10,11,4,5,6,7,0,1,2,3.

Байтовые данные могут бытьиграется через SourceDataLine. Я думаю, что вы должны быть в состоянии найти примеры кода SourceDataLine воспроизведения. Главное изменение, которое вам нужно будет сделать, это получить данные для воспроизведения из массива в обратном порядке, а не из AudioInputStream, как это обычно делается.

Библиотека github AudioCue была созданавокруг идеи создания своего рода супер-клипа, в котором доступны отдельные кадры данных PCM. Вы можете проверить метод loadURL в строке 359 в качестве примера загрузки данных в массив с помощью AudioInputStream. Этот пример преобразует данные в плавающие объекты PCM, а не оставляет их в байтах. Так что вам придется внести некоторые изменения / упрощения. Хранение с плавающей точкой облегчает такие вещи, как микширование и воспроизведение с переменной скоростью, что может быть полезно, если вы решите, что вы также хотите ускорить или замедлить, вперед или назад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...