Java實現PCM格式音頻轉MP3或WAV

最近做語音合成的項目,需要把PCM格式的音頻文件轉換成MP3或WAV,記錄一下。

Java實現的PCM格式音頻文件轉換MP3格式

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * PCM 轉 MP3
 *
 * @author QC班長
 * @since 2020-02-02
 */
public class PcmToMp3 {

    public static void main(String[] agrs) throws Exception {
        //convertAudioFiles("resource/茯茶素是什麼,有什麼效果,生產工藝有哪些?.pcm", "resource/茯茶素是什麼,有什麼效果,生產工藝有哪些?.mp3");
        convertAudioFiles("tnafcs.pcm", "tnafcs.mp3");
    }

    /**
     * @param src    待轉換文件路徑
     * @param target 目標文件路徑
     * @throws IOException 拋出異常
     */
    public static String convertAudioFiles(String src, String target) throws IOException {
        FileInputStream fis = new FileInputStream(src);
        FileOutputStream fos = new FileOutputStream(target);

        //計算長度
        byte[] buf = new byte[1024 * 4];
        int size = fis.read(buf);
        int PCMSize = 0;
        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 = 16000;
        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("PCM Convert to MP3 OK!");
        return "ok";
    }
}

Java實現的PCM格式音頻文件轉換WAV格式


import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * PCM 轉 WAV
 *
 * @author QC班長
 * @since 2020-02-02
 */
public class PcmToWav {
    public static void main(String[] agrs) throws Exception {
        //convertAudioFiles("resource/茯茶素是什麼,有什麼效果,生產工藝有哪些?.pcm", "resource/茯茶素是什麼,有什麼效果,生產工藝有哪些?.mp3");
        convertAudioFiles("tnafcs.pcm", "tnafcs.mp3");
    }
    /**
     * @param src    待轉換文件路徑
     * @param target 目標文件路徑
     * @throws IOException 拋出異常
     */
    public static void convertAudioFiles(String src, String target) throws IOException {

        FileInputStream fis = new FileInputStream(src);
        FileOutputStream fos = new FileOutputStream(target);

        //計算長度
        byte[] buf = new byte[1024 * 4];
        int size = fis.read(buf);
        int PCMSize = 0;
        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 = 2;
        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!");
    }
}

 

發佈了303 篇原創文章 · 獲贊 256 · 訪問量 175萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章