zoukankan      html  css  js  c++  java
  • 解析WAV音频文件----》生成WAV音频文件头

    前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i

    WAV音频文件介绍:

    WAV文件是在PC机平台上很常见的、最经典的多媒体音频文件,最早于1991年8月出现在Windows3.1操作系统上,文件扩展名为WAV,是WaveForm的简写,也称为波形文件,可直接存储声音波形,还原的波形曲线十分逼真。WAV文件格式简称WAV格式是一种存储声音波形的数字音频格式,是由微软公司和IBM联合设计的,WAV文件还原而成的声音的音质取决于声音卡采样样本的尺寸,采样频率越高,音质就越好,但开销就越大,WAV文件也就越大。

    对WAV音频文件截取说明:

    WAV文件不像MP3格式音频文件,对一段完整的MP3格式音频做任意截取是完全OK的,音频文件依然可以播放,因为MP3音频格式文件每一部分截取它都带有音频头文件信息,但对一段完整的WAV音频文件做部分截取,截取出来的音频文件是无法播放的,除非截取的是从第一位开始截取,截取的数据已经包含的头文件,否则文件无法解析播放。

    生成WAV头部文件需要四个参数(附代码说明):

    注:获取WAV音频信息参数

    一、声道数、

    二、采样率、

    三、采样精度

    四、音频数据总长度、

     1   /**
     2      * @param totalAudioLen  不包括header的音频数据总长度
     3      * @param longSampleRate 采样率,也就是录制时使用的频率、音频采样级别 8000 = 8KHz
     4      * @param channels       audioRecord的声道数1/2
     5      * @param audioFormat    采样精度; 譬如 16bit
     6      * @throws IOException 写文件错误
     7      */
     8     private static byte[] writeWavFileHeader(long totalAudioLen, long longSampleRate,
     9                                              int channels, int audioFormat) throws IOException {
    10         byte[] header = generateWavFileHeader(totalAudioLen, longSampleRate, channels,audioFormat);
    11         return header;
    12     }
    13 
    14     /**
    15      * @param totalAudioLen  不包括header的音频数据总长度
    16      * @param longSampleRate 采样率,也就是录制时使用的频率
    17      * @param channels       audioRecord的频道数量
    18      * @param audioFormat    采样精度; 譬如 16bit
    19      */
    20     private static byte[] generateWavFileHeader(long totalAudioLen, long longSampleRate, int channels,int audioFormat) {
    21         long totalDataLen = totalAudioLen + 36;
    22         long byteRate = longSampleRate * 2 * channels;
    23         byte[] header = new byte[44];
    24         header[0] = 'R'; // RIFF
    25         header[1] = 'I';
    26         header[2] = 'F';
    27         header[3] = 'F';
    28         //文件长度  4字节文件长度,这个长度不包括"RIFF"标志(4字节)和文件长度本身所占字节(4字节),即该长度等于整个文件长度 - 8
    29         header[4] = (byte) (totalDataLen & 0xff);
    30         header[5] = (byte) ((totalDataLen >> 8) & 0xff);
    31         header[6] = (byte) ((totalDataLen >> 16) & 0xff);
    32         header[7] = (byte) ((totalDataLen >> 24) & 0xff);
    33         //fcc type:4字节 "WAVE" 类型块标识, 大写
    34         header[8] = 'W';
    35         header[9] = 'A';
    36         header[10] = 'V';
    37         header[11] = 'E';
    38         //FMT Chunk   4字节 表示"fmt" chunk的开始,此块中包括文件内部格式信息,小写, 最后一个字符是空格
    39         header[12] = 'f'; // 'fmt '
    40         header[13] = 'm';
    41         header[14] = 't';
    42         header[15] = ' ';//过渡字节
    43         //数据大小  4字节,文件内部格式信息数据的大小,过滤字节(一般为00000010H)
    44         header[16] = 16;
    45         header[17] = 0;
    46         header[18] = 0;
    47         header[19] = 0;
    48         //编码方式 10H为PCM编码格式   FormatTag:2字节,音频数据的编码方式,1:表示是PCM 编码
    49         header[20] = 1; // format = 1
    50         header[21] = 0;
    51         //通道数  Channels:2字节,声道数,单声道为1,双声道为2
    52         header[22] = (byte) channels;
    53         header[23] = 0;
    54         //采样率,每个通道的播放速度
    55         header[24] = (byte) (longSampleRate & 0xff);
    56         header[25] = (byte) ((longSampleRate >> 8) & 0xff);
    57         header[26] = (byte) ((longSampleRate >> 16) & 0xff);
    58         header[27] = (byte) ((longSampleRate >> 24) & 0xff);
    59         //音频数据传送速率,采样率*通道数*采样深度/8
    60         //4字节,音频数据传送速率, 单位是字节。其值为采样率×每次采样大小。播放软件利用此值可以估计缓冲区的大小
    61         //byteRate = sampleRate * (bitsPerSample / 8) * channels
    62         header[28] = (byte) (byteRate & 0xff);
    63         header[29] = (byte) ((byteRate >> 8) & 0xff);
    64         header[30] = (byte) ((byteRate >> 16) & 0xff);
    65         header[31] = (byte) ((byteRate >> 24) & 0xff);
    66         // 确定系统一次要处理多少个这样字节的数据,确定缓冲区,通道数*采样位数
    67         header[32] = (byte) (2 * channels);
    68         header[33] = 0;
    69         //每个样本的数据位数
    70         //2字节,每个声道的采样精度; 譬如 16bit 在这里的值就是16。如果有多个声道,则每个声道的采样精度大小都一样的;
    71         header[34] = (byte) audioFormat;
    72         header[35] = 0;
    73         //Data chunk
    74         //ckid:4字节,数据标志符(data),表示 "data" chunk的开始。此块中包含音频数据,小写;
    75         header[36] = 'd';
    76         header[37] = 'a';
    77         header[38] = 't';
    78         header[39] = 'a';
    79         //音频数据的长度,4字节,audioDataLen = totalDataLen - 36 = fileLenIncludeHeader - 44
    80         header[40] = (byte) (totalAudioLen & 0xff);
    81         header[41] = (byte) ((totalAudioLen >> 8) & 0xff);
    82         header[42] = (byte) ((totalAudioLen >> 16) & 0xff);
    83         header[43] = (byte) ((totalAudioLen >> 24) & 0xff);
    84         return header;
    85     }

    本人亲测!!!完成以上代码即可生成WAV音频头文件,即可把头文件和截取的部分WAV音频数据进行字节数组合并,音频文件正常播放!

    参考文章一参考文章二

    个人总结:

    我是南国以南i记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!

  • 相关阅读:
    C++笔记 谓词 1
    win7 ipv6设置(isatap)
    C++笔记
    打水印
    jquery导航滚动固定在顶部
    javascript获得属性
    tr光棒效果
    按字母查找
    js购物车
    数据采集
  • 原文地址:https://www.cnblogs.com/bgyb/p/13583205.html
Copyright © 2011-2022 走看看