2015-08-18 8 views
0

Я хочу создать WAV-файл, поэтому я могу воспроизвести его позже, если потребуется, но AudioRecord (мне нужно использовать AudioRecord) отправляет мне данные в необработанном формате. Поэтому я попытался добавить заголовок .wav в свой файл, как и другие ответы, но я не могу заставить его работать, что я делаю неправильно?Android AudioRecord исходная дата в .wav или какой-либо другой формат

это мой метод, который сохраняет временный файл с расширением .raw:

private void onWriteAudioDataToFile(int index, short[] sData) { 
    String filename = getFilename(index, false); 
    FileOutputStream os; 
    try { 
     os = new FileOutputStream(filename); 
     byte bData[] = short2byte(sData); 
     os.write(bData); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    copyWaveFile(getFilename(index, false), getFilename(index, true)); 
} 

это метод, который читает этот файл и преобразует его в формат .wav, добавив заголовок:

private void copyWaveFile(String inFilename, String outFilename) { 
    int channels = 2; 
    long byteRate = 16 * 44100 * channels/8; 
    long longSampleRate = 44100; 

    FileInputStream in; 
    FileOutputStream out; 
    long totalAudioLen; 
    long totalDataLen; 

    byte[] data = new byte[bufferSize]; 

    try { 
     in = new FileInputStream(inFilename); 
     out = new FileOutputStream(outFilename); 
     totalAudioLen = in.getChannel().size(); 
     totalDataLen = totalAudioLen + 36; 

     WriteWaveFileHeader(out, totalAudioLen, totalDataLen, 
       longSampleRate, channels, byteRate); 

     while (in.read(data) != -1) { 
      out.write(data); 
     } 

     in.close(); 
     out.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

и последним, если необходимо, это способ добавления заголовка:

private void WriteWaveFileHeader(
     FileOutputStream out, long totalAudioLen, 
     long totalDataLen, long longSampleRate, int channels, 
     long byteRate) throws IOException { 
    byte[] header = new byte[44]; 

    header[0] = 'R'; // RIFF/WAVE header 
    header[1] = 'I'; 
    header[2] = 'F'; 
    header[3] = 'F'; 
    header[4] = (byte) (totalDataLen & 0xff); 
    header[5] = (byte) ((totalDataLen >> 8) & 0xff); 
    header[6] = (byte) ((totalDataLen >> 16) & 0xff); 
    header[7] = (byte) ((totalDataLen >> 24) & 0xff); 
    header[8] = 'W'; 
    header[9] = 'A'; 
    header[10] = 'V'; 
    header[11] = 'E'; 
    header[12] = 'f'; // 'fmt ' chunk 
    header[13] = 'm'; 
    header[14] = 't'; 
    header[15] = ' '; 
    header[16] = 16; // 4 bytes: size of 'fmt ' chunk 
    header[17] = 0; 
    header[18] = 0; 
    header[19] = 0; 
    header[20] = 1; // format = 1 
    header[21] = 0; 
    header[22] = (byte) channels; 
    header[23] = 0; 
    header[24] = (byte) (longSampleRate & 0xff); 
    header[25] = (byte) ((longSampleRate >> 8) & 0xff); 
    header[26] = (byte) ((longSampleRate >> 16) & 0xff); 
    header[27] = (byte) ((longSampleRate >> 24) & 0xff); 
    header[28] = (byte) (byteRate & 0xff); 
    header[29] = (byte) ((byteRate >> 8) & 0xff); 
    header[30] = (byte) ((byteRate >> 16) & 0xff); 
    header[31] = (byte) ((byteRate >> 24) & 0xff); 
    header[32] = (byte) (2 * 16/8); // block align 
    header[33] = 0; 
    header[34] = 16; // bits per sample 
    header[35] = 0; 
    header[36] = 'd'; 
    header[37] = 'a'; 
    header[38] = 't'; 
    header[39] = 'a'; 
    header[40] = (byte) (totalAudioLen & 0xff); 
    header[41] = (byte) ((totalAudioLen >> 8) & 0xff); 
    header[42] = (byte) ((totalAudioLen >> 16) & 0xff); 
    header[43] = (byte) ((totalAudioLen >> 24) & 0xff); 

    out.write(header, 0, 44); 
} 
+0

Не могли бы вы также добавить свой код записи – Zharf

+0

. В чем проблема с результирующим файлом? – Zharf

ответ

0

Наиболее распространенный формат волны это PCM. Файл android.media.AudioRecord поддерживает вывод PCM. Вам нужно только записать это в файл. Взято из how to record .wav format file in android

+0

в нем также говорится: «После созданного вами файла вы должны запрограммировать собственный конвертер на волне (или искать для него онлайн-библиотеку)». и я пытаюсь сделать именно это, но по какой-то причине он не работает –

+0

Посмотрите на это http://stackoverflow.com/questions/9179536/writing-pcm-recorded-data-into-a-wav-file- Java-андроид – Bhargav