2013-02-25 146 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