帖子

[demo分享] PCM转MP3

[复制链接]

该用户从未签到

21045  楼主| maomaoyyuan 发表于 2016-6-14 11:48:59 1#
具体转换类:
public void convertAudioFiles(String src, String target) throws Exception {
           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位单声道 16000 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);
           }
           DebugLog.Log("***********CPMtoMP3***********");
           fis.close();
           fos.close();
           System.out.println("Convert OK!");
        }
辅助类:
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);
        }
    }

评分

参与人数 1语点 +10 收起 理由
栗子讲究 + 10 很给力!

查看全部评分

iflytek-小黑 发表于 2016-6-14 12:42:13
2#
6666
使用道具 举报 回复
蜗牛201 发表于 2016-8-18 11:45:07
3#
明明是WAV,真无语
使用道具 举报 回复
百得 发表于 2016-9-3 18:24:20
4#
看起来是做WAV的文件头。
使用道具 举报 回复
turn_and_turn@s 发表于 2018-2-22 11:20:28
5#
标准的wav和pcm好像就是一个文件头的差别吧
使用道具 举报 回复
151****7888@126 发表于 2018-3-14 17:35:58
6#
纯技术的了                                                                     
使用道具 举报 回复