在做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流中的参数值。
相关推荐
标题中的"PCM转WAV.rar_pcm_pcm 转wav_pcm转WAV js_rhythm69z_wav 转 pcm"表明这是一个关于音频格式转换的压缩包,主要涉及PCM(脉冲编码调制)和WAV(Waveform Audio Format)两种音频格式之间的相互转换。PCM是一...
3. **构建WAV头信息**:WAV文件的头部包含了详细的音频元数据。Utils类会包含生成这些元数据的方法,并将它们写入新创建的WAV文件。 4. **数据转换**:虽然PCM和WAV都包含原始音频样本,但WAV文件需要特定的格式,...
从WAV到PCM,则是剥离WAV头,提取PCM数据。 3. 写入输出文件:转换后的数据被写入新的文件,按照目标格式的要求进行编码。 使用PCM2WAV工具进行转换非常简单,用户只需指定输入文件和输出文件,程序将自动处理转换...
5. **写入WAV文件**:最后,将构建好的WAV头信息和PCM数据组合,写入一个新的WAV文件。确保所有数据正确对齐,并且文件大小与头信息中的预期值匹配。 在Android开发中,实现这个转换可能需要用到Java的IO流和...
标题"pcm2wav(PCM转换成WAV文件).rar"表明这是一个关于将PCM数据转换为WAV文件的工具或程序的压缩包。这可能包含一个名为"pcm2wav(PCM转换成WAV文件)_Jisuxz.com.exe"的可执行文件,该文件是一个转换工具,用于将PCM...
支持将PCM格式数据转换成多通道wav文件格式数据,PCM数据默认是S16_LE格式,可支持选择通道数以及采样频率,使用方法PCM2WAV -d dump.pcm -c 8 -f 16000 -o dump.wav
java源码 pcm 转wav,方法参数为pcm文件路径,wav文件路径,可以直接使用。
标题提到的"pcm转wav工具"是指一种能够将PCM格式的音频文件转换成WAV格式的软件或程序。在描述中提供的网址是一个博客文章链接,作者分享了一个名为pcm2wav.exe的工具,该工具用于执行这个转换过程。这种转换可能...
标题 "为pcm添加wav头" 指的是在PCM(脉冲编码调制)音频数据文件前添加符合WAV(Waveform Audio Format)文件格式的头部信息。这通常是因为PCM是一种裸露的数字音频格式,不含任何元数据,而WAV是一种包含所有必要...
由于PCM本身就是一种未压缩的数据格式,将其转换为WAV主要涉及添加WAV文件头的过程。WAV文件头包含了音频的采样率、位深度、通道数等元数据,这些信息对于播放器正确解析音频至关重要。 4. Java开发环境: Java是一...
2. **构建WAV头部**:根据PCM数据的参数,构造符合WAV格式规范的文件头,包括RIFF块、WAVE标识、fmt 子块和data子块。 3. **写入WAV文件**:将PCM数据写入到新建的WAV文件中,作为data子块的内容。 4. **组合并...
在压缩包"pcm16-pcm8-wav互转"中,很可能是包含了一个C++实现的音频转换工具,它可能包括了读取WAV文件、解析文件头、进行位深度转换、以及写入新格式文件的功能。这样的工具对于开发者来说非常实用,能够快速进行...
2. **解析头部信息**:虽然PCM文件本身没有标准的文件头,但在将其转换为WAV格式时,我们需要创建一个符合WAV格式标准的文件头。这个头包括RIFF块、WAVE标识符、fmt子块和data子块。fmt子块包含音频格式信息,如采样...
linux系统C语言音频文件pcm转换wav,提供代码实验用PCM文件
2. **创建WAV头信息**:根据PCM数据的参数,我们需要构造WAV文件的头信息。WAV头包括RIFF chunk、fmt subchunk和data subchunk。RIFF chunk标识文件类型,fmt subchunk包含音频格式信息,如采样率、位深度、通道数等...
tips: 需要知道原始的pcm数据的采样率、位深、和通道数才能正确转换,否则转换出来的wav无法正常使用
5. **反向转换**:从PCM转换回WAV时,需要创建一个新的WAV文件头,包含正确的采样率、位深度和通道数等信息,然后将PCM数据追加到文件中。 在C#环境下,可以使用`System.IO.BinaryReader`和`System.IO.BinaryWriter...
转换主要是将PCM数据封装到WAV文件的文件头结构中,这个文件头包含有关音频数据的元信息,如采样率、位深度和通道数等。Delphi源代码可能实现了读取原始PCM数据,然后根据这些信息创建符合WAV文件标准的文件结构。 ...
说明:本源码只提供了生成 文件头 的函数,只返回文件...),如果将pcm转成wav,请参考下面公式。WAV字节集 = 文件头字节集+PCM字节集 。让我们一起来观赏一下pcm变成wav的过程吧!。文件头:。@wly。Tags:音频文件。
这可能涉及到对元数据的添加,如写入文件头信息,以及确保数据排列符合WAV规范。 3. **创建WAV文件**:转换完成后,工具会将新包装的数据写入新的WAV文件中。WAV文件的文件头包含了关于音频流的详细信息,如文件...