【问题标题】:Play WAV file backward向后播放 WAV 文件
【发布时间】:2010-11-19 01:03:17
【问题描述】:

我正在用 Java 制作 Braid。如果你倒带时间,声音会倒退。 如何向后播放WAV文件?也许有类似previous() 的流? 在 Braid 的网站上,你能明白我的意思吗?

更新:已解决!请参阅我自己的帖子。

【问题讨论】:

  • 为你失去的代表点+1 :-)
  • 谢谢。这个赏金是一个错误
  • 如果解决了,不要只是把解决的放在那里,而是接受一个答案。

标签: java stream audio


【解决方案1】:

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--;
 }

【讨论】:

  • @Martijn 你能告诉我这一行中的auline是什么吗...“ auline.write(frameStream.getFrame(frame), 0, frameStream.frameSize());”
  • 它是声卡的音频通道。这是一个SourceDataLine 实例。看看这个例子:anyexample.com/programming/java/java_play_wav_sound_file.xml
  • @MartijnCourteaux 不错的答案。你能告诉我“for(int i = 0; i
  • @chiragsaga: 在第二个示例中,当循环完成时,int i 不会离开堆栈。这就对了。我这样做是因为我想知道我读了多少帧。查看 println。
【解决方案2】:

如果 WAV 包含 PCM,则颠倒 PCM 样本的顺序。如果它包含其他格式,它可能会复杂得多;可能最简单的方法是先将其转换为 PCM。

有关 WAV 格式的更多信息,请参阅this site

【讨论】:

  • 感谢您的快速回复。但我不知道如何用 PCM 做到这一点。也许你可以写一个例子或一个网站,我可以找到一些信息?
  • 我添加了一个指向 WAV 格式描述的链接;如果您遇到问题,请就您无法理解的部分提出具体问题。
  • 谢谢,我会尝试一下。一个非常棒的网站。
【解决方案3】:

使用 Windows 录音机(在开始 --> 程序 --> 附件 --> 娱乐中)。

它有一个功能(效果(菜单)--> 反转)来反转 .WAV 文件。您可以使用不同的名称保存反向文件,然后在您的程序中打开相应的文件。

【讨论】:

  • 他们有很多声音文件 (+50) 可以将它们全部反转。我以为已经开始了,但是...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多