当前位置: 首页 > 图灵资讯 > 技术篇> Java实现PCM格式音频转MP3或WAV——CV即用,质量保证

Java实现PCM格式音频转MP3或WAV——CV即用,质量保证

来源:图灵教育
时间:2023-06-06 09:30:36

```bashimport java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException; /** * PCM 转 MP3 * * @author laowang * @since 2020-04-02 */public class PcmTomp3 {    /**     * @param src    待转换文件路径     * @param target 目标文件路径(该工具是在源文件的基础上形成另一个文件,target样例:D:/landscape/music/25745664665456.mp3,必须写完,否则报io“无法访问错误”     * @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";    }}``````bash import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException; /** * PCM 转 WAV * * @author laowang * @since 2020-04-02 */public class PcmToWav {    /**     * @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!");    }}```**waveHeader处理函数**```bashpackage com.test.shell;import java.io.ByteArrayOutputStream;import java.io.IOException;public class WaveHeader {    public final char fileID[] = {'R', 'I', 'F', 'F'};    public int fileLength;    public char wavTag[] = {'W', 'A', 'V', 'E'};;    public char FmtHdrID[] = {'f', 'm', 't', ' '};    public int FmtHdrLeth;    public short FormatTag;    public short Channels;    public int SamplesPerSec;    public int AvgBytesPerSec;    public short BlockAlign;    public short BitsPerSample;    public char DataHdrID[] = {'d','a','t','a'};    public int DataHdrLeth;    public byte[] getHeader() throws IOException {        ByteArrayOutputStream bos = new ByteArrayOutputStream();        WriteChar(bos, fileID);        WriteInt(bos, fileLength);        WriteChar(bos, wavTag);        WriteChar(bos, FmtHdrID);        WriteInt(bos,FmtHdrLeth);        WriteShort(bos,FormatTag);        WriteShort(bos,Channels);        WriteInt(bos,SamplesPerSec);        WriteInt(bos,AvgBytesPerSec);        WriteShort(bos,BlockAlign);        WriteShort(bos,BitsPerSample);        WriteChar(bos,DataHdrID);        WriteInt(bos,DataHdrLeth);        bos.flush();        byte[] r = bos.toByteArray();        bos.close();        return r;    }    private void WriteShort(ByteArrayOutputStream bos, int s) throws IOException {        byte[] mybyte = new byte[2];        mybyte[1] =(byte)( (s << 16) >> 24 );        mybyte[0] =(byte)( (s << 24) >> 24 );        bos.write(mybyte);    }    private void WriteInt(ByteArrayOutputStream bos, int n) throws IOException {        byte[] buf = new byte[4];        buf[3] =(byte)( n >> 24 );        buf[2] =(byte)( (n << 8) >> 24 );        buf[1] =(byte)( (n << 16) >> 24 );        buf[0] =(byte)( (n << 24) >> 24 );        bos.write(buf);    }    private void WriteChar(ByteArrayOutputStream bos, char[] id) {        for (int i=0; i<id.length; i++) {            char c = id[i];            bos.write(c);        }    }}**写博客要负责人,最好不要发没有质量保证的东西!以免耽误孩子和兄弟的时间!以免耽误孩子和兄弟的时间!**```