`

PCM转Wav(添加wav头)

    博客分类:
  • Tool
阅读更多

 

在做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.rar_pcm_pcm 转wav_pcm转WAV js_rhythm69z_wav 转 pcm"表明这是一个关于音频格式转换的压缩包,主要涉及PCM(脉冲编码调制)和WAV(Waveform Audio Format)两种音频格式之间的相互转换。PCM是一...

    JAVA 音频文件PCM转WAV Utils类

    3. **构建WAV头信息**:WAV文件的头部包含了详细的音频元数据。Utils类会包含生成这些元数据的方法,并将它们写入新创建的WAV文件。 4. **数据转换**:虽然PCM和WAV都包含原始音频样本,但WAV文件需要特定的格式,...

    PCM2WAV_pcm_wav_pcm和wav格式的互相转换_语音转换_

    从WAV到PCM,则是剥离WAV头,提取PCM数据。 3. 写入输出文件:转换后的数据被写入新的文件,按照目标格式的要求进行编码。 使用PCM2WAV工具进行转换非常简单,用户只需指定输入文件和输出文件,程序将自动处理转换...

    PCM转WAV文件

    5. **写入WAV文件**:最后,将构建好的WAV头信息和PCM数据组合,写入一个新的WAV文件。确保所有数据正确对齐,并且文件大小与头信息中的预期值匹配。 在Android开发中,实现这个转换可能需要用到Java的IO流和...

    PCM转WAV音频文件转换器

    支持将PCM格式数据转换成多通道wav文件格式数据,PCM数据默认是S16_LE格式,可支持选择通道数以及采样频率,使用方法PCM2WAV -d dump.pcm -c 8 -f 16000 -o dump.wav

    java pcm转wav

    java源码 pcm 转wav,方法参数为pcm文件路径,wav文件路径,可以直接使用。

    pcm转wav工具

    标题提到的"pcm转wav工具"是指一种能够将PCM格式的音频文件转换成WAV格式的软件或程序。在描述中提供的网址是一个博客文章链接,作者分享了一个名为pcm2wav.exe的工具,该工具用于执行这个转换过程。这种转换可能...

    为pcm添加wav头

    标题 "为pcm添加wav头" 指的是在PCM(脉冲编码调制)音频数据文件前添加符合WAV(Waveform Audio Format)文件格式的头部信息。这通常是因为PCM是一种裸露的数字音频格式,不含任何元数据,而WAV是一种包含所有必要...

    PCM音频转WAV格式音频

    由于PCM本身就是一种未压缩的数据格式,将其转换为WAV主要涉及添加WAV文件头的过程。WAV文件头包含了音频的采样率、位深度、通道数等元数据,这些信息对于播放器正确解析音频至关重要。 4. Java开发环境: Java是一...

    音频转码,pcm 转 wav 格式

    2. **构建WAV头部**:根据PCM数据的参数,构造符合WAV格式规范的文件头,包括RIFF块、WAVE标识、fmt 子块和data子块。 3. **写入WAV文件**:将PCM数据写入到新建的WAV文件中,作为data子块的内容。 4. **组合并...

    PCM16转wav转pcm8

    在压缩包"pcm16-pcm8-wav互转"中,很可能是包含了一个C++实现的音频转换工具,它可能包括了读取WAV文件、解析文件头、进行位深度转换、以及写入新格式文件的功能。这样的工具对于开发者来说非常实用,能够快速进行...

    pcm2wav(PCM转换成WAV文件).rar

    标题"pcm2wav(PCM转换成WAV文件).rar"表明这是一个关于将PCM数据转换为WAV文件的工具或程序的压缩包。这可能包含一个名为"pcm2wav(PCM转换成WAV文件)_Jisuxz.com.exe"的可执行文件,该文件是一个转换工具,用于将PCM...

    PCM 转 WAV 格式

    2. **解析头部信息**:虽然PCM文件本身没有标准的文件头,但在将其转换为WAV格式时,我们需要创建一个符合WAV格式标准的文件头。这个头包括RIFF块、WAVE标识符、fmt子块和data子块。fmt子块包含音频格式信息,如采样...

    pcm转换成wav

    2. **创建WAV头信息**:根据PCM数据的参数,我们需要构造WAV文件的头信息。WAV头包括RIFF chunk、fmt subchunk和data subchunk。RIFF chunk标识文件类型,fmt subchunk包含音频格式信息,如采样率、位深度、通道数等...

    pcm转wav数据格式程序

    tips: 需要知道原始的pcm数据的采样率、位深、和通道数才能正确转换,否则转换出来的wav无法正常使用

    PCM相互转换WAV

    5. **反向转换**:从PCM转换回WAV时,需要创建一个新的WAV文件头,包含正确的采样率、位深度和通道数等信息,然后将PCM数据追加到文件中。 在C#环境下,可以使用`System.IO.BinaryReader`和`System.IO.BinaryWriter...

    pcm_wav.zip_WAV P_pcm_pcm 转 wav_pcm 转换_pcm文件

    转换主要是将PCM数据封装到WAV文件的文件头结构中,这个文件头包含有关音频数据的元信息,如采样率、位深度和通道数等。Delphi源代码可能实现了读取原始PCM数据,然后根据这些信息创建符合WAV文件标准的文件结构。 ...

    音频文件PCM转wav源码

    说明:本源码只提供了生成 文件头 的函数,只返回文件...),如果将pcm转成wav,请参考下面公式。WAV字节集 = 文件头字节集+PCM字节集 。让我们一起来观赏一下pcm变成wav的过程吧!。文件头:。@wly。Tags:音频文件。

    pcm格式转换为wav格式.zip

    这可能涉及到对元数据的添加,如写入文件头信息,以及确保数据排列符合WAV规范。 3. **创建WAV文件**:转换完成后,工具会将新包装的数据写入新的WAV文件中。WAV文件的文件头包含了关于音频流的详细信息,如文件...

    ios录音播放,包括录取的PCM转WAV播放

    以上就是iOS平台上录音、PCM转WAV以及播放WAV的基本流程。在实际应用中,你可能还需要处理错误、添加音量控制、支持暂停和恢复等功能。MCAudioInputQueue可能是用于处理音频输入队列的一个自定义类或第三方库,它...

Global site tag (gtag.js) - Google Analytics