架构深渊

慢慢走进程序的深渊……关注领域驱动设计、测试驱动开发、设计模式、企业应用架构模式……积累技术细节,以设计架构为宗。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

wav数据格式

Posted on 2008-10-14 22:09  chen eric  阅读(2271)  评论(3编辑  收藏  举报
首先你得弄明白音频格式的几个参数。
在.wav格式中还是比较好理解的。
8位16位:使用多少个bit来描述一个采样点,1byte = 8bit,所以16位需要4个byte。
采样率:每秒钟采样多少次,即每秒生成多少个采样点。
声道数:以几个声道采样。
每秒数据流量:每秒钟生成的byte数 = 声道数 * 采样率 * 采样位数 / 8

了解了这些之后我建议你在C#中可以用DirectSound来采集数据,如果你只要求.wav他再适合不过了。


【cenmengqi】:
关于详细的.wav文件头,你可以上网搜一下,因该还蛮好找的。以下我也贴出一点:
http://blog.csdn.net/kindyb/archive/2005/10/13/503024.aspx
先把.wav格式整明白。然后再考虑用DirectSound来采集声音。

【cenmengqi】:
这里有一个我自己写的例程,为了弄明白.wav文件头。
直接贴到IDE环境中去看,把里面的一个mFilePath改成你机器上的.wav文件路径。

是完后如果你觉得有兴趣用DirectSound来采集,直接发信给我,我再给你之后的资料。
cenmengqi85@163.com

using System;
using System.IO;
using System.Text;
using System.Collections.Generic;

public class MyClass
{
public static void Main()
{
// RL();
String mFilePath = @"E:\TestWaveCapture.wav"; // 把这里改成你机子上的一个.wav文件路径,运行一下。
// String mFilePath = @"E:\我的资料\Test.wav";
FileStream mFStream = null;
if (!File.Exists(mFilePath))
{
Console.WriteLine("Can not find file:{0}", mFilePath);
}
else
{
Console.WriteLine("Begin read Wav File Header");
mFStream = new FileStream(mFilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
ReadWaveHeader(mFStream);
mFStream.Close();
}
Console.ReadKey();
}

public static void ReadWaveHeader(FileStream mFStream)
{
Byte[] mBuffer = null;
mBuffer = new Byte[4];
// Read RIFF Symbol
mFStream.Read(mBuffer, 0, 4);
Console.WriteLine("00H4{0}", Encoding.ASCII.GetString(mBuffer, 0, 4));
// Read File Length
mFStream.Read(mBuffer, 0, 4);
Console.WriteLine("04H4{0}", BitConverter.ToInt32(mBuffer, 0));
// Read Wave Symbol
mFStream.Read(mBuffer, 0, 4);
Console.WriteLine("08H4{0}", Encoding.ASCII.GetString(mBuffer, 0, 4));
// Read Fmt Symbol
mFStream.Read(mBuffer, 0, 4);
Console.WriteLine("0CH4{0}", Encoding.ASCII.GetString(mBuffer, 0, 4));
// Read unknowed
mFStream.Read(mBuffer, 0, 4);
Console.WriteLine("10H4{0}", BitConverter.ToInt32(mBuffer, 0));
// 格式类型
mFStream.Read(mBuffer, 0, 2);
Console.WriteLine("14H4{0}", BitConverter.ToInt16(mBuffer, 0));
// 通道数
mFStream.Read(mBuffer, 0, 2);
Console.WriteLine("16H2{0}", BitConverter.ToInt16(mBuffer, 0));
// 采样率
mFStream.Read(mBuffer, 0, 4);
Console.WriteLine("18H4{0}", BitConverter.ToInt32(mBuffer, 0));
// 波形音频数据传送率
mFStream.Read(mBuffer, 0, 4);
Console.WriteLine("1CH4{0}", BitConverter.ToInt32(mBuffer, 0));
// 数据块调整数
mFStream.Read(mBuffer, 0, 2);
Console.WriteLine("20H2{0}", BitConverter.ToInt16(mBuffer, 0));
// 样本数据位数
mFStream.Read(mBuffer, 0, 2);
Console.WriteLine("22H2{0}", BitConverter.ToInt16(mBuffer, 0));
// 数据标记符
mFStream.Read(mBuffer, 0, 4);
Console.WriteLine("24H4{0}", Encoding.ASCII.GetString(mBuffer, 0, 4));
// 语音数据长度
mFStream.Read(mBuffer, 0, 4);
Console.WriteLine("28H4{0}", BitConverter.ToInt32(mBuffer, 0));
}
}