精华内容
下载资源
问答
  • JavaScript封装wav头信息

    2020-07-30 16:24:01
    使用Web Audio api播放wav格式的音频数据流,需要有头信息; 如果将数据分段传输/接收,不完整的数据流没有头信息,在context.decodeAudioData会出现解码音频文件失败。 如果想播放不完整的数据,需要给每一段数据...

    使用Web Audio api播放wav格式的音频数据流,需要有头信息;
    如果将数据分段传输/接收,不完整的数据流没有头信息,在context.decodeAudioData会出现解码音频文件失败。
    如果想播放不完整的数据,需要给每一段数据添加头信息。
    头信息添加方法如下:

    		//wav Header		(Buffer,声道,采样率)
    		function concatHeader(data, numberOfChannels, sampleRate) {
    			var header = new ArrayBuffer(44);
    			var d = new DataView(header);
    			d.setUint8(0, 'R'.charCodeAt(0));
    			d.setUint8(1, 'I'.charCodeAt(0));
    			d.setUint8(2, 'F'.charCodeAt(0));
    			d.setUint8(3, 'F'.charCodeAt(0));
    			d.setUint32(4, data.byteLength / 2 + 44, true);
    			d.setUint8(8, 'W'.charCodeAt(0));
    			d.setUint8(9, 'A'.charCodeAt(0));
    			d.setUint8(10, 'V'.charCodeAt(0));
    			d.setUint8(11, 'E'.charCodeAt(0));
    			d.setUint8(12, 'f'.charCodeAt(0));
    			d.setUint8(13, 'm'.charCodeAt(0));
    			d.setUint8(14, 't'.charCodeAt(0));
    			d.setUint8(15, ' '.charCodeAt(0));
    			d.setUint32(16, 16, true);
    			d.setUint16(20, 1, true);
    			d.setUint16(22, numberOfChannels, true);
    			d.setUint32(24, sampleRate, true);
    			d.setUint32(28, sampleRate * 1 * 2);
    			d.setUint16(32, numberOfChannels * 2);
    			d.setUint16(34, 16, true);
    			d.setUint8(36, 'd'.charCodeAt(0));
    			d.setUint8(37, 'a'.charCodeAt(0));
    			d.setUint8(38, 't'.charCodeAt(0));
    			d.setUint8(39, 'a'.charCodeAt(0));
    			d.setUint32(40, data.byteLength, true);
    			return concat(header, data);
    		}
    		function concat(buffer1, buffer2) {
    			var tmp = new Uint8Array(buffer1.byteLength + buffer2.byteLength);
    			tmp.set(new Uint8Array(buffer1), 0);
    			tmp.set(new Uint8Array(buffer2), buffer1.byteLength);
    			return tmp.buffer;
    		}
    
    展开全文
  • java 实现wav头信息生成byts数组

    千次阅读 2017-07-19 19:11:40
    java 实现wav头信息生成byts数组 public WavHeader(long totalAudioLen, int longSampleRate, int channels, int SamplesBits){ if(SamplesBits == AudioFormat.ENCODING_PCM_16BIT)


    java 实现wav头信息生成byts数组







     public WavHeader(long totalAudioLen, int longSampleRate, int channels, int SamplesBits){
                if(SamplesBits == AudioFormat.ENCODING_PCM_16BIT)
                    this.SamplesBits = 16;
                else if(SamplesBits == AudioFormat.ENCODING_PCM_8BIT)
                    this.SamplesBits = 8;
    
                if(channels == AudioFormat.CHANNEL_IN_STEREO )
                    this.channels = 2;
                else
                    this.channels = 1;
                this.totalAudioLen = (int)totalAudioLen;
    
                ByteArrayBuilder byteArrayBuilder = new ByteArrayBuilder();
                byteArrayBuilder.write("RIFF".getBytes());
                byteArrayBuilder.write(intToByteArray((int) (totalAudioLen + 44)));
                byteArrayBuilder.write("WAVE".getBytes());
                byteArrayBuilder.write("fmt ".getBytes());
                byteArrayBuilder.write(intToByteArray(this.SamplesBits));
                byteArrayBuilder.write(charToByteArray((char)1));
                byteArrayBuilder.write(charToByteArray((char)this.channels));
                byteArrayBuilder.write(intToByteArray(longSampleRate));
                byteArrayBuilder.write(intToByteArray(longSampleRate * channels * (this.SamplesBits/8)));
                byteArrayBuilder.write(charToByteArray((char)(channels*(this.SamplesBits/8))));
                byteArrayBuilder.write( charToByteArray((char)this.SamplesBits));
                byteArrayBuilder.write("data".getBytes());
                byteArrayBuilder.write(intToByteArray((int) totalAudioLen));
                bytes = byteArrayBuilder.toByteArray();
            };


    展开全文
  • 比较麻烦的就是windows下自带的那个录音机录下的wav,文件有58个Byte。所以,比较好的办法是,首先读取n长的一段字符,例如60个;然后从中查找关键字“data”,“data”之后的一个DWORD是实际音频数据的长度,得到...

    00H 4 char "RIFF"标志  04H 4 long int 文件长度  08H 4 char "WAVE"标志  0CH 4 char "fmt"标志  10H 4   过渡字节(不定)  14H 2 int 格式类别(10H为PCM形式的声音数据)  16H 2 int 通道数,单声道为1,双声道为2  18H 2 int 采样率(每秒样本数),表示每个通道的播放速度,  1CH 4 long int 波形音频数据传送速率,其值为通道数×每秒数据位数×每样                本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。  20H 2 int 数据块的调整数(按字节算的),其值为通道数×每样本的数据位            值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其            值用于缓冲区的调整。  22H 2   每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多          个声道,对每个声道而言,样本大小都一样。  24H 4 char 数据标记符"data"  28H 4 long int 语音数据的长度

    楼主的帖子,文件头长度加起来是42字节,但是实际长度是44个字节(用UltraEdit打开一个WAVE文件,数一下就知道了)。如果用以个结构体来定义WAVE文件头应该为: struct WAVEFILEHEADER {  char chRIFF[4];  DWORD dwRIFFLen;  char chWAVE[4];  char chFMT[4];  DWORD dwFMTLen;  PCMWAVEFORMAT pwf;  char chDATA[4];  DWORD dwDATALen; };

    但是实际测试,并不是所有的wave文件头都一样。比较麻烦的就是windows下自带的那个录音机录下的wav,文件头有58个Byte。所以,比较好的办法是,首先读取n长的一段字符,例如60个;然后从中查找关键字“data”,“data”之后的一个DWORD是实际音频数据的长度,得到这个长度len,再从这DWORD后开始读取len个字节,就可以读到文件尾。如果是双声道的,那么数据是交替存放的;如果是16bit采样的,每两个字节会以小端的方式存储一个AD值。根据这样的方式,就可以顺利读取音频数据了。

    有一个问题就是:在不知道文件头多长的情况下,采用直接读取60个Byte的方法是不够严谨的。如果是标准的wav格式,那么文件头只有44byte,就存在整个文件都没有60Byte长的可能性。实际中当然不大可能,但是严谨考虑,应该先读取36个Byte,从37开始,4个4个的读取,判断是否有“data”关键字,进而得出文件头的实际长度。

    就想到了这些,暂时记下来。

    展开全文
  • PCM转Wav(添加wav头)

    2012-11-06 10:12:46
    在做Android上传声音到服务器时,涉及到PCM转Wav的问题,其实就是为Wav添加wav头信息,代码如下  BinaryWriter binaryWriter;  FileStream fileStream; /// <summary> /// PCM to wav //...

     

    在做Android上传声音到服务器时,涉及到PCM转Wav的问题,其实就是为Wav添加wav头信息,代码如下

     
       BinaryWriter binaryWriter;
            FileStream fileStream;
     /// <summary>
            /// PCM to wav
            /// 添加Wav头文件
            /// 参考资料:http://blog.csdn.net/bluesoal/article/details/932395
            /// </summary>
            private void CreateSoundFile(string path)
            {
    
                try
                {
                    fileStream = new FileStream(path, FileMode.Create);
                }
                catch (Exception ex)
                {
                    TxtLogger.DumpException(ex);
                    //mWaveFile = new FileStream(System.DateTime.Now.ToString("yyyyMMddHHmmss") + "test2.wav", FileMode.Create);
                }
    
                binaryWriter = new BinaryWriter(fileStream);
    
                //Set up file with RIFF chunk info. 每个WAVE文件的头四个字节便是“RIFF”。
                char[] ChunkRiff = { 'R', 'I', 'F', 'F' };
                char[] ChunkType = { 'W', 'A', 'V', 'E' };
                char[] ChunkFmt = { 'f', 'm', 't', ' ' };
                char[] ChunkData = { 'd', 'a', 't', 'a' };
    
                short shPad = 1;                // File padding
    
                int nFormatChunkLength = 0x10; // Format chunk length.
    
                int nLength = 0;                // File length, minus first 8 bytes of RIFF description. This will be filled in later.
    
                short shBytesPerSample = 0;     // Bytes per sample.
    
                short BitsPerSample = 16; //每个采样需要的bit数  
    
                //这里需要注意的是有的值是short类型,有的是int,如果错了,会导致占的字节长度过长or过短
                short channels = 1;//声道数目,1-- 单声道;2-- 双声道
    
                // 一个样本点的字节数目
                shBytesPerSample = 2;
    
                // RIFF 块
                binaryWriter.Write(ChunkRiff);
                binaryWriter.Write(nLength);
                binaryWriter.Write(ChunkType);
    
                // WAVE块
                binaryWriter.Write(ChunkFmt);
                binaryWriter.Write(nFormatChunkLength);
                binaryWriter.Write(shPad);
    
    
                binaryWriter.Write(channels); // Mono,声道数目,1-- 单声道;2-- 双声道
                binaryWriter.Write(16000);// 16KHz 采样频率                   
                binaryWriter.Write(32000); //每秒所需字节数
                binaryWriter.Write(shBytesPerSample);//数据块对齐单位(每个采样需要的字节数)
                binaryWriter.Write(BitsPerSample);  // 16Bit,每个采样需要的bit数  
    
                // 数据块
                binaryWriter.Write(ChunkData);
                binaryWriter.Write((int)0);   // The sample length will be written in later.
            }
      /// <summary>
            /// 获取完整的wav流
            /// </summary>
            /// <param name="soundBytes">PCM流</param>
            /// <returns>wav流</returns>
            private byte[] GetAudioByte(HttpPostedFileBase soundBytes)
            {
                try
                {
                    string tempPath = string.Format(@"{0}\{1}.wav", AppDomain.CurrentDomain.BaseDirectory, Guid.NewGuid().ToString("n"));
                    //添加wav文件头
                    CreateSoundFile(tempPath);
    
                    byte[] bytes = new byte[soundBytes.InputStream.Length];
                    soundBytes.InputStream.Read(bytes, 0, bytes.Length);
                    binaryWriter.Write(bytes, 0, bytes.Length);
                    binaryWriter.Seek(4, SeekOrigin.Begin);
                    binaryWriter.Write((int)(bytes.Length + 36));   // 写文件长度
                    binaryWriter.Seek(40, SeekOrigin.Begin);
                    binaryWriter.Write(bytes.Length);
                    fileStream.Close();
    
                    byte[] audioBytes = ConvertToBinary(tempPath);
                    //删除文件
                    if (System.IO.File.Exists(tempPath))
                    {
                        FileInfo fi = new FileInfo(tempPath);
                        if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1)
                            fi.Attributes = FileAttributes.Normal;
                        System.IO.File.Delete(tempPath);
                    }
                    return audioBytes;
                }
                catch (Exception ex)
                {
                    TxtLogger.DumpException(ex);
                    return null;
                }
                finally
                {
                    if (fileStream != null)
                    {
                        fileStream.Close();
                    }
                }
            }

    ok,注意传过来的PCM流中的参数值。

     

    展开全文
  • 获取wav文件头信息

    2019-03-18 11:58:40
    获取wav文件,44字节。。_header.RIFF_ID = System.BitConverter.ToInt32(header_data, 0); _header.File_Size = System.BitConverter.ToInt32(header_data, 4); _header.RIFF_Type = System.BitConverter...
  • wav音频头信息

    千次阅读 2019-01-23 12:04:31
    wav文件分为两个部分,第一个部分是wav头文件,第二个部分是PCM编码的音频数据部分。 PCM编码介绍 其中,数字信号是对连续变化的模拟信号进行抽样、量化和编码产生的,称为PCM(Pulse-code modulation),即脉冲...
  • WAV文件头信息

    2013-06-08 09:57:59
    wav文件的文件 wave文件的格式:   00H 4 char "RIFF"标志  04H 4 long int 文件长度  08H 4 char "WAVE"标志  0CH 4 char "fmt"标志  10H 4 过渡字节(不定)  14H 2 int 格式...
  • 在 Qt之实现录音播放及raw(pcm)转wav格式 中我们实现了录音/播放功能,并将.raw格式的音频文件转为wav格式文件,那我们拿到一个wav文件如何获取文件的具体信息呢,这一篇将叙述对wav文件的头信息进行解析。...
  • WAV格式头部处理

    2020-05-31 21:49:36
    最近在学习Android 音频这块相关支持...1.wav文件的文件头信息详解 2.wav音频文件头解析 /** * 加入wav文件头 */ private void writeWaveFileHeader(FileOutputStream out, long totalAudioLen, long totalData
  • Wav 的封装

    2012-03-14 14:27:00
    在这就收藏一些wav 封装ADPCM的格式剖析信息 WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英文Resource Interchange File Format的缩写,每个WAVE文件的四个字节便是“RIFF...
  • 转自:... ... 一般通过麦克风采集的录音数据都是PCM格式的,即不包含头部信息,这样导致很多播放器都播放不了,你只能用像Audition这样的专业工具才能进行播放,显然是非常不方便的。为了得...
  • Linux下查看wav文件的头信息-sox

    千次阅读 2016-05-19 10:18:33
    1,只查看wav文件的头信息 命令如下:sox -V *.wav -n
  • #include <stdio.h><br /> typedef signed char INT8; typedef signed short INT16; typedef signed int INT32; typedef unsigned char UINT8; ...typ
  • WAV文件的头信息(文件头格式)

    千次阅读 2009-11-26 09:46:00
    WAV文件的头信息(文件头格式)2008年05月16日 星期五 11:53WAVE文件格式剖析] ----(数据结构与算法) ************************************************************************* WAVE文件作为多媒体中使用的声波...
  • 这一节我们先掌握如何读取头部信息和程序表头,我们先看ELF文件的大致结构:ELF文件格式最重要的就是所谓的段,特别是其中的代码段和数据段。对应上图就是.text,.data两个段。每个段都对应一个段表来描述,而...
  • Linux下查看wav文件的头信息-sox 安装sox apt install sox 查看一个wav文件的 采样率和声道 sox -V sa1.wav -n 输出结果如下:
  • 求问怎么去掉wav文件的头信息,只保留它的音频数据? 我现在需要将wav文件转为无头信息的 pcm文件 方法可行肯定给分!
  • WAV文件分析

    千次阅读 2018-04-25 10:47:23
    WAV语音文件头部含有44字节的标志信息,其含义如下://ckid:4字节 RIFF 标志,大写 wavHeader[0] = 'R'; wavHeader[1] = 'I'; wavHeader[2] = 'F'; wavHeader[3] = 'F'; //cksize:4字节文件长度,...
  • 手动解析WAV文件

    2020-07-17 14:05:52
    本文章是解析WAV,然后计算播放的总时间,以及WAV如何计算当前播放时间;您看完后,应该可以很快地得到其他信息; #include "stdio.h" #include "fs.h" typedef struct { INT8U RIFF_ID[4]; //= {'R','I','F',...
  • Wav数据格式的44个字节头部信息汇总

    千次阅读 2013-06-18 16:37:54
    为了得到wav格式的录音数据,我们在保存录音数据的时候就要自己手工加上44个字节的头部信息wav格式的音频数据的头部信息基本上是固定不变的,总共44个字节,包括以下内容:1. "RIFF"(4个字节)...
  • 读取wav文件,获取文件详细信息

    千次阅读 2010-12-22 14:09:00
    HMMIO GetWavInfo(char* pWavFileName,WAVEFORMATEX* pWavFmt,DWORD* pDataLen){ //读取wav文件,获取文件详细信息 DWORD dwFmtSize; // “fmt”数据块的大小 DWORD dwDataSize; // “data”数据块的大小 WAVE...
  • wav标准头结构 #include "stdlib.h" #include "stdio.h" int main(int argc,char *argv[]) { int i; //用作循环计数 ... //用来存储wav文件的头信息 FILE *fp; if(argc!=2){ printf(...
  • wav格式解析

    2013-06-16 12:59:03
    wav 头信息解析 详细介绍wav文件的解析,头信息对应的位置代表的信息

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 265
精华内容 106
关键字:

wav头信息