2013-02-25 88 views
4

我使用audioRecord類錄製音頻。現在我想將音頻原始文件轉換爲* flac格式。我轉換*原始文件爲WAV下一方式:如何在Android中將音頻原始轉換爲FLAC

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

hello用戶,如果你能夠將原始文件轉換爲flac,那麼請分享你的方式,以便我可以幫助自己。我從1周內陷入這個問題。一點幫助,將不勝感激。 – 2014-07-19 11:30:58

回答

3

您需要一個編碼器將pcm數據轉換爲flac格式。您不能只更改標題,並期望內容以flac的形式工作。

儘管從3.1開始支持解碼器(來源:http://developer.android.com/guide/appendix/media-formats.html),但Android(至少到4.1)不包含FLAC編碼器。

我沒有直接經驗,但已經看到人們使用ffmpeg作爲flac編碼器。該項目audioboo-android包含原生libFLAC/libFLAC++編碼器,看起來很有趣。

+0

嗨,請你更新'audioboo-android'的鏈接,因爲它已經死了。 – 2016-02-13 08:18:17

相關問題