2016-11-25 13 views
0

Я хочу построить график формы волны из аудиоформата .wav. Я нахожу в этом месте функции, извлечь байты .wav:График графика звуковых волн Java

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
BufferedInputStream in = null; 
try { 
    in = new BufferedInputStream(new FileInputStream(args[0])); 
} catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

int read; 
byte[] buff = new byte[1024]; 
while ((read = in.read(buff)) > 0) 
{ 
    out.write(buff, 0, read); 
} 
out.flush(); 

byte[] audioBytes = out.toByteArray(); 
for (int i=0; i<audioBytes.length; i++) { 
    System.out.println(audioBytes[i]); 
} 

Затем я использую те моменты, которые я нашел в консоли (System.out ...), чтобы построить свое аудио сигнала в «Microsoft Excel» и risult является:

waveform on Excel НО это сигнал моего файла .wav сильно отличается от сигнала, что участки (т.е.) с открытым исходным кодом «Praat»:

waveform on Praat Где я неправ? Не байты файла, которые я должен взять?

ответ

2

в массиве «результат» есть пункт, что вы нашли бы

public double[] extract(File inputFile) { 
     AudioInputStream in = null; 
     try { 
      in = AudioSystem.getAudioInputStream(inputFile); 
     } catch (Exception e) { 
      System.out.println("Cannot read audio file"); 
      return new double[0]; 
     } 
     AudioFormat format = in.getFormat(); 
     byte[] audioBytes = readBytes(in); 

     int[] result = null; 
     if (format.getSampleSizeInBits() == 16) { 
      int samplesLength = audioBytes.length/2; 
      result = new int[samplesLength]; 
      if (format.isBigEndian()) { 
       for (int i = 0; i < samplesLength; ++i) { 
        byte MSB = audioBytes[i * 2]; 
        byte LSB = audioBytes[i * 2 + 1]; 
        result[i] = MSB << 8 | (255 & LSB); 
       } 
      } else { 
       for (int i = 0; i < samplesLength; i += 2) { 
        byte LSB = audioBytes[i * 2]; 
        byte MSB = audioBytes[i * 2 + 1]; 
        result[i/2] = MSB << 8 | (255 & LSB); 
       } 
      } 
     } else { 
      int samplesLength = audioBytes.length; 
      result = new int[samplesLength]; 
      if (format.getEncoding().toString().startsWith("PCM_SIGN")) { 
       for (int i = 0; i < samplesLength; ++i) { 
        result[i] = audioBytes[i]; 
       } 
      } else { 
       for (int i = 0; i < samplesLength; ++i) { 
        result[i] = audioBytes[i] - 128; 
       } 
      } 
     } 

     return result; 
    } 
0

Кажется, вы считаете, что каждый байт в файле представляет собой амплитуду волны в следующий момент времени. Это (вообще говоря) не случай. Помимо того, что файл начинается с заголовка, каждый образец состоит из нескольких каналов и внутри каждого канала, образец может занимать меньше (например, 4 бит или более (например, 16 бит) пространства, чем один байт. См. пример этого объяснения:. http://www.topherlee.com/software/pcm-tut-wavformat.html

+0

Ну правильно Итак, для вас, какие моменты следует принять, чтобы иметь эту схему как в.! образ Праат? –