2009-08-12 3 views
20

Я делаю Braid в Java. Если вы перематываете время назад, звук воспроизводится назад. Как воспроизвести WAV-файл в обратном направлении? Может быть, с потоком с чем-то вроде previous()? На сайте Braid вы можете понять, что я имею в виду.Воспроизведение WAV-файла назад

Обновление: Решено! Смотрите мой собственный пост.

+3

+1 потому что я люблю Braid :-) – ChssPly76

+2

+1 для ваших потерянных очков репутации :-) –

+0

спасибо. эта щедрость была ошибкой –

ответ

13

YEEEEEEESSSSS !!!!!!!!

Я решил это сам (14 лет !!)
Я написал этот класс:

import java.io.IOException; 
import javax.sound.sampled.AudioInputStream; 

/** 
* 
* @author Martijn 
*/ 
public class FrameBuffer { 

    private byte[][] frames; 
    private int frameSize; 

    public FrameBuffer(AudioInputStream stream) throws IOException { 
     readFrames(stream); 
    } 

    public byte[] getFrame(int i) { 
     return frames[i]; 
    } 

    public int numberFrames() 
    { 
     return frames.length; 
    } 

    public int frameSize() 
    { 
     return frameSize; 
    } 

    private void readFrames(AudioInputStream stream) throws IOException { 
     frameSize = stream.getFormat().getFrameSize(); 
     frames = new byte[stream.available()/frameSize][frameSize]; 
     int i = 0; 
     for (; i < frames.length; i++) 
     { 
      byte[] frame = new byte[frameSize]; 
      int numBytes = stream.read(frame, 0, frameSize); 
      if (numBytes == -1) 
      { 
       break; 
      } 
      frames[i] = frame; 
     } 
     System.out.println("FrameSize = " + frameSize); 
     System.out.println("Number frames = " + frames.length); 
     System.out.println("Number frames read = " + i); 
    } 
} 

А потом:

FrameBuffer frameStream = new FrameBuffer(austream); //austream is the audiostream 
int frame = frameStream.numberFrames() - 1; 
while (frame >= 0) { 
     auline.write(frameStream.getFrame(frame), 0, frameStream.frameSize()); 
     frame--; 
} 
+0

@Martijn Courteaux great :) – ant

+0

@Martijn Можете ли вы рассказать, что такое аулин в этой строке ... »auline.write (frameStream.getFrame (frame), 0, frameStream.frameSize());» – Waqas

+1

Это звуковой канал звуковой карты. Это экземпляр «SourceDataLine». Взгляните на этот пример: http://www.anyexample.com/programming/java/java_play_wav_sound_file.xml –

2

Если WAV содержит PCM, измените порядок образцов PCM. Если он содержит какой-то другой формат, он может быть намного сложнее; вероятно, проще всего просто преобразовать его в PCM.

Дополнительную информацию о формате WAV см. this site.

+0

Спасибо за ваш быстрый ответ. Но я не знаю, как это сделать с PCM. Может быть, вы можете написать пример или сайт, где я могу найти некоторую информацию? –

+1

Я добавил ссылку на описание WAV-формата; если у вас возникли проблемы, задайте конкретные вопросы о деталях, которые у вас возникли проблемы с пониманием. – bdonlan

+0

Спасибо, я попробую что-нибудь. И очень хороший сайт. –

2

Используйте Windows Sound Recorder (в меню Пуск -> Программы -> Аксессуары -> Развлечения).

У этого есть функция (Эффекты (меню) -> Реверс), чтобы отменить WAV-файл. Вы можете сохранить обратный файл с другим именем, а затем открыть соответствующий в своей программе.

+0

они для многих звуковых файлов (+50), чтобы отменить их все. Я думал, что все уже на нем, но ... –

Смежные вопросы