Java pcm檔案與wav檔案互轉
阿新 • • 發佈:2018-12-29
Java pcm檔案與wav檔案互轉
2018年05月15日 14:32:28 -過期罐頭 閱讀數:1432
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/lys1220/article/details/80322562
程式碼所需要的jar包,百度雲盤連結:https://pan.baidu.com/s/1eX-zxMaaG1zZNL8AhLNs1A 密碼:uogp
pcm轉wav:
package test.voice; /** * pcm格式的檔案轉wav * @author 樑豔鬆 * */ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class PcmToWav { public void aaaa() throws IOException{ String src = "C://Users//dell-pc//Desktop//16k.pcm"; FileInputStream fis = new FileInputStream(src); FileOutputStream fos = new FileOutputStream("C://Users//dell-pc//Desktop//test_DDDDD.wav"); //計算長度 int PCMSize = 0; byte[] buf = new byte[1024 * 4]; int size = fis.read(buf); while (size != -1) { PCMSize += size; size = fis.read(buf); } fis.close(); //填入引數,位元率等等。這裡用的是16位單聲道 8000 hz WaveHeader header = new WaveHeader(); //長度欄位 = 內容的大小(PCMSize) + 頭部欄位的大小(不包括前面4位元組的識別符號RIFF以及fileLength本身的4位元組) header.fileLength = PCMSize + (44 - 8); header.FmtHdrLeth = 16; header.BitsPerSample = 16; header.Channels = 1; header.FormatTag = 0x0001; header.SamplesPerSec = 8000; header.BlockAlign = (short)(header.Channels * header.BitsPerSample / 8); header.AvgBytesPerSec = header.BlockAlign * header.SamplesPerSec; header.DataHdrLeth = PCMSize; byte[] h = header.getHeader(); assert h.length == 44; //WAV標準,頭部應該是44位元組 //write header fos.write(h, 0, h.length); //write data stream fis = new FileInputStream(src); size = fis.read(buf); while (size != -1) { fos.write(buf, 0, size); size = fis.read(buf); } fis.close(); fos.close(); System.out.println("Convert OK!"); } }
wav轉pcm:
package test.voice; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arrays; import org.apache.commons.io.IOUtils; public class WavToPcm { /** * WAV轉PCM檔案 * @param wavfilepath wav檔案路徑 * @param pcmfilepath pcm要儲存的檔案路徑及檔名 * @return */ public String convertAudioFiles(String wavfilepath,String pcmfilepath){ FileInputStream fileInputStream; FileOutputStream fileOutputStream; try { fileInputStream = new FileInputStream(wavfilepath); fileOutputStream = new FileOutputStream(pcmfilepath); byte[] wavbyte = InputStreamToByte(fileInputStream); byte[] pcmbyte = Arrays.copyOfRange(wavbyte, 44, wavbyte.length); fileOutputStream.write(pcmbyte); IOUtils.closeQuietly(fileInputStream); IOUtils.closeQuietly(fileOutputStream); } catch (Exception e) { System.out.println(e.getMessage()); } return pcmfilepath; } /** * 輸入流轉byte二進位制資料 * @param fis * @return * @throws IOException */ private static byte[] InputStreamToByte(FileInputStream fis) throws IOException { ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); long size = fis.getChannel().size(); byte[] buffer = null; if (size <= Integer.MAX_VALUE) { buffer = new byte[(int) size]; } else { buffer = new byte[8]; for (int ix = 0; ix < 8; ++ix) { int offset = 64 - (ix + 1) * 8; buffer[ix] = (byte) ((size >> offset) & 0xff); } } int len; while ((len = fis.read(buffer)) != -1) { byteStream.write(buffer, 0, len); } byte[] data = byteStream.toByteArray(); IOUtils.closeQuietly(byteStream); return data; } }