wav自定义头文件

WAV文件是常见多媒体音频文件,由微软和IBM联合设计,可用于多种操作系统。若要为WAV文件添加附加信息,需了解其头文件组成,可尝试在data chunk之前自定义一个chunk,文中给出安卓端模拟代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WAV文件是在PC机平台上很常见的、最经典的多媒体音频文件,最早于1991年8月出现在Windows 3.1操作系统上,文件扩展名为WAV,是WaveFom的简写,也称为波形文件,可直接存储声音波形,还原的波形曲线十分逼真。WAV文件格式简称WAV格式是一种存储声音波形的数字音频格式,是由微软公司和IBM联合设计的,经过了多次修订,可用于Windows,Macintosh,Linix等多种操作系统

那么如果有需求需要向为每一个wav文件添加附加信息,我们需要怎么做呢?

首先看一下wav头文件的具体组成部分:
在这里插入图片描述

通过上图我们可以推测,如果想加入自定义信息的话,我们可以试试自定义一个chunk 当然这个自定义的chunk必须在data chunk之前,不然无法正常使用, 以下是安卓端模拟代码.自定义部分为info chunk:

 /**
     * 加入wav文件头
     */
    private void writeWaveFileHeader(FileOutputStream out, long totalAudioLen,
                                     long totalDataLen, long longSampleRate, int channels, long byteRate)
            throws IOException {
        byte[] header = new byte[92];
        // RIFF/WAVE header
        header[0] = 'R';
        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);
        //WAVE
        header[8] = 'W';
        header[9] = 'A';
        header[10] = 'V';
        header[11] = 'E';
        // 'fmt ' chunk
        header[12] = 'f';
        header[13] = 'm';
        header[14] = 't';
        header[15] = ' ';
        // 4 bytes: size of 'fmt ' chunk
        header[16] = 18;
        header[17] = 0;
        header[18] = 0;
        header[19] = 0;
        // format = 1
        header[20] = 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);
        // block align
        header[32] = (byte) (2 * 16 / 8);
        header[33] = 0;
        // bits per sample
        header[34] = 16;
        header[35] = 0;

        header[36] = 0;
        header[37] = 0;


        //info Chunk
        header[38] = 'i';
        header[39] = 'n';
        header[40] = 'f';
        header[41] = 'o';

        // 4 bytes: size of 'info ' chunk
        header[42] = (byte) 38 ;
        header[43] = (byte) 0;
        header[44] = (byte) 0;
        header[45] = (byte) 0;

        //开启tx信道录音
        header[46] = (byte) 13;
        header[47] = (byte) 0;

        //本机id
        header[48] = (byte) 64;
        header[49] = (byte) -30;
        header[50] = (byte) 1;
        header[51] = (byte) 0;

        //远端id
        header[52] = (byte) 1;
        header[53] = (byte) 0;
        header[54] = (byte) 0;
        header[55] = (byte) 0;

        //区号
        header[56] = (byte) 1;

        //信道号
        header[57] = (byte) 1;

        //信道类型
        header[58] = (byte) 0;

        //录音类型
        header[59] = (byte) 1;

        //tx频率
        header[60] = (byte) -64;
        header[61] = (byte) 74;
        header[62] = (byte) 5;
        header[63] = (byte) 24;

        //rx频率
        header[64] = (byte) -64;
        header[65] = (byte) 74;
        header[66] = (byte) 5;
        header[67] = (byte) 24;

        //本机序列号
        header[68] = (byte) 48;
        header[69] = (byte) 0;
        header[70] = (byte) 54;
        header[71] = (byte) 0;
        header[72] = (byte) 48;
        header[73] = (byte) 0;
        header[74] = (byte) 56;
        header[75] = (byte) 0;
        header[76] = (byte) 82;
        header[77] = (byte) 0;
        header[78] = (byte) 68;
        header[79] = (byte) 0;
        header[80] = (byte) 49;
        header[81] = (byte) 0;
        header[82] = (byte) 48;
        header[83] = (byte) 0;


        //data
        header[84] = 'd';
        header[85] = 'a';
        header[86] = 't';
        header[87] = 'a';

        header[88] = (byte) (totalAudioLen & 0xff);
        header[89] = (byte) ((totalAudioLen >> 8) & 0xff);
        header[90] = (byte) ((totalAudioLen >> 16) & 0xff);
        header[91] = (byte) ((totalAudioLen >> 24) & 0xff);
        out.write(header, 0, 92);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值