概述
在做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(添加wav头)的全部内容,希望文章能够帮你解决PCM转Wav(添加wav头)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复