【问题标题】:How to get PCM data from a wav file?如何从 wav 文件中获取 PCM 数据?
【发布时间】:2012-08-25 08:25:12
【问题描述】:

我有一个.wav 文件。我想从该声音文件中获取 PCM 数据,以便我可以从声音中获取各个数据块并对其进行处理。

但我不知道该怎么做。谁能告诉我该怎么做? 到目前为止,我已经这样做了:

public class test
{

    static int frameSample;
    static int timeofFrame;
    static int N;
    static int runTimes;
    static int bps;
    static int channels;
    static double times;
    static int bufSize;
    static int frameSize;
    static int frameRate;
    static long length;

    public static void main(String[] args)
    {
        try
        {
            AudioInputStream ais = AudioSystem.getAudioInputStream(new File("music/audio.wav"));
            AudioInputStream a;
            int numBytes = ais.available();
            System.out.println("numbytes: "+numBytes);
            byte[] buffer = new byte[numBytes];
            byte[] buffer1=new byte[numBytes] ;
            int k=0;
            int count=0;
            while(count!=-1){
                count=ais.read(buffer, 0, numBytes);
            }
            long value = 0;

            for (int i = 0; i < buffer.length; i++)
            {
               value = ((long) buffer[i] & 0xffL) << (8 * i);
               System.out.println("value: "+value);
            }
        } catch(Exception e) {

        }
    }
}

【问题讨论】:

  • 您想使用 Java 还是 J 来执行此操作?在您提出问题之前,我从未听说过“J”,并且怀疑您的意思是 Java。
  • 对不起。我不是说 j。我想用java来做。再次抱歉。

标签: java wav javasound pcm


【解决方案1】:

这可以通过Java Sound API 完成。

  • 使用AudioSystem 从文件中获取AudioInputStream
  • 在流​​中查询AudioFormat
  • 创建一个byte[] 以适应格式。例如。 8 位单声道是byte[1]。 16 位立体声是byte[4]
  • 读取byte[] 块中的流,它将逐帧包含声音。
  • 继续进一步处理..

【讨论】:

  • 到目前为止我已经做到了。它是否正确?我想从字节中收集整数值。代码与问题有关。
  • 请对代码块使用一致且符合逻辑的缩进。请注意,这些帧是“单个数据块”,因此您的问题已得到解答。您应该问一个单独的问题,即如何将帧转换为 int(单声道)或一对 int(立体声)。
  • 您能告诉我如何将标题与 wav 分开吗?请告诉我。
  • AudioInputStream 读取的字节是纯声音数据,无需忽略其中任何一个。但是,当您忽略有关代码格式等的建议时,我为什么还要继续提供帮助?
【解决方案2】:

这是一个使用javax.sound.sampled 包的完整示例。如果您需要有关音频格式的详细信息,您可以通过 audioInputStream.getFormat() 获取它们,这将返回一个 AudioFormat 对象。

public static byte[] getPcmByteArray(String filename) throws UnsupportedAudioFileException, IOException {

    ByteArrayOutputStream baos = new ByteArrayOutputStream(65536);
    File inputFile = new File(filename);
    AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(inputFile);

    byte[] buffer = new byte[4096];
    int bytesRead;
    while ((bytesRead = audioInputStream.read(buffer)) != -1) {
        baos.write(buffer, 0, bytesRead);
    }

    return baos.toByteArray();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多