2013-02-25 2 views
4

Я записываю аудио с классом audoiRecord. Теперь я хочу преобразовать аудиофайлы в формат * flac. Я конвертировать * необработанный файл Wav следующий путь:Как конвертировать аудио raw в flac в Android

private void copyWaveFile(String inFilename,String outFilename){ 
    FileInputStream in = null; 
    FileOutputStream out = null; 
    long totalAudioLen = 0; 
    long totalDataLen = totalAudioLen + 36; 
    long longSampleRate = sampleRate; 
    int channels = 2; 
    long byteRate = RECORDER_BPP * sampleRate * channels/8; 
    byte[] data_pcm = new byte[mAudioBufferSize]; 
    try { 
     in = new FileInputStream(inFilename); 
     out = new FileOutputStream(outFilename); 
     totalAudioLen = in.getChannel().size(); 
     totalDataLen = totalAudioLen + 36; 
     Log.i(TAG,"File size: " + totalDataLen); 
     WriteWaveFileHeader(out, totalAudioLen, totalDataLen, 
     longSampleRate, channels, byteRate); 
     while(in.read(data_pcm) != -1){ 
      out.write(data_pcm); 
     } 
     in.close(); 
     out.close(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException 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] = RECORDER_BPP; // 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); 
} 

Я не понимаю, что должно быть параметры файла * FLAC

+0

привет, пользователь, если вы можете преобразовать необработанный файл в flac, то, пожалуйста, поделитесь своим путем, чтобы я мог сам помочь. Я застрял в этой проблеме с 1 недели. Небольшая помощь будет оценена. –

ответ

3

Вам нужен кодер для преобразования данных pcm в формат flac. Вы не можете просто изменить заголовок и ожидать, что контент будет работать как flac.

Android (по крайней мере до 4.1) не включает кодировщик FLAC, хотя имеется декодер, поддерживаемый с 3,1 года (источник: http://developer.android.com/guide/appendix/media-formats.html).

У меня нет прямого опыта, но вы видели, как люди используют ffmpeg в качестве кодировщика flac. Этот проект audioboo-android, который содержит собственный кодировщик libFLAC/libFLAC++, выглядит интересным.

+0

Привет, не могли бы вы обновить ссылку для 'audioboo-android', потому что она мертва. –

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

  • Нет связанных вопросов^_^