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记录点滴每天成长一点点,学习是永无止境的!转载请附原文链接!!!

  • 相关阅读:
    当Django模型迁移时,报No migrations to apply 问题时
    django--各个文件的含义
    django--创建项目
    1013. Battle Over Cities (25)
    1011. World Cup Betting (20)
    1009. Product of Polynomials (25)
    1007. Maximum Subsequence Sum (25)
    1006. Sign In and Sign Out (25)
    1008. Elevator (20)
    1004. Counting Leaves (30)
  • 原文地址:https://www.cnblogs.com/bgyb/p/13583205.html
Copyright © 2011-2022 走看看