您好,登錄后才能下訂單哦!
程序中的錄音文件之前直接保存的是 .pcm格式,一直也相安無事,用的挺好。最近有一個webview中需要加載錄音文件,出現了不兼容的問題,所以需要把 .pcm格式文件轉換為 .wav格式。
PCM
PCM(Pulse Code Modulation----脈碼調制錄音)。所謂PCM錄音就是將聲音等模擬信號變成符號化的脈沖列,再予以記錄。PCM信號是由[1]、[0]等符號構成的數字信號,而未經過任何編碼和壓縮處理。與模擬信號比,它不易受傳送系統的雜波及失真的影響。動態范圍寬,可得到音質相當好的效果。簡單的說,pcm就是沒有壓縮的音頻格式。
wav
wav全稱是WAVE,.wav是其擴展名,它是一種無損的音頻文件格式,WAV符合 RIFF(Resource Interchange File Format)規范。所有的WAV都有一個文件頭,這個文件頭是音頻流的編碼參數。WAV對音頻流的編碼沒有硬性規定,除了PCM之外,還有幾乎所有支持ACM規范的編碼都可以為WAV的音頻流進行編碼。
pcm和wav關系 pcm是無損wav文件中音頻數據的一種編碼方式,pcm加上wav文件頭就可以轉為wav格式,但wav還可以用其它方式編碼。
PcmToWavUtil
package com.hgb.mytest; import android.media.AudioFormat; import android.media.AudioRecord; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; /** * Created by HaoGuibao * Date 2016/8/26. * Description :pcm格式的音頻轉換為wav格式的工具類 */ public class PcmToWavUtil { private int mBufferSize; //緩存的音頻大小 private int mSampleRate = 8000;// 8000|16000 private int mChannel = AudioFormat.CHANNEL_IN_STEREO; //立體聲 private int mEncoding = AudioFormat.ENCODING_PCM_16BIT; public PcmToWavUtil() { this.mBufferSize = AudioRecord.getMinBufferSize(mSampleRate, mChannel, mEncoding); } /** * @param sampleRate sample rate、采樣率 * @param channel channel、聲道 * @param encoding Audio data format、音頻格式 */ public PcmToWavUtil(int sampleRate, int channel, int encoding) { this.mSampleRate = sampleRate; this.mChannel = channel; this.mEncoding = encoding; this.mBufferSize = AudioRecord.getMinBufferSize(mSampleRate, mChannel, mEncoding); } /** * pcm文件轉wav文件 * * @param inFilename 源文件路徑 * @param outFilename 目標文件路徑 */ public void pcmToWav(String inFilename, String outFilename) { FileInputStream in; FileOutputStream out; long totalAudioLen; long totalDataLen; long longSampleRate = mSampleRate; int channels = 2; long byteRate = 16 * mSampleRate * channels / 8; byte[] data = new byte[mBufferSize]; 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 (IOException e) { e.printStackTrace(); } } /** * 加入wav文件頭 */ 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'; //WAVE 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'; //data 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); } }
Demo 把手機內存卡上 /sdcard/yxck/treamentRecord/ 的123.pcm轉換為123.wav文件。
public class MainActivity extends AppCompatActivity { /** * pcm格式轉wav格式工具類 */ private PcmToWavUtil pcmToWavUtil = new PcmToWavUtil(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final String path = "/sdcard/yxck/treamentRecord/123.pcm"; //按原路徑把音頻文件后綴改一下; final String outpath = path.replace(".pcm", ".wav"); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { pcmToWavUtil.pcmToWav(path, outpath); } }); } }
pcm轉換wav格式成功
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。