using System; using System.Runtime.InteropServices; namespace VedioAudioTransfer { /// <summary> /// Wave 的摘要说明。 /// </summary> public class Wave { public Wave() { // // TODO: 在此处添加构造函数逻辑 // } //读取录音设备 [DllImport("winmm.dll", EntryPoint="waveInGetNumDevs")] public static extern int waveInGetNumDevs (); //打开录音设备函数 [DllImport("winmm.dll", EntryPoint="waveInOpen")] public static extern int waveInOpen ( ref int lphWaveIn, int uDeviceID, ref WAVEFORMAT lpFormat, int dwCallback, int dwInstance, int dwFlags ); //为录音设备准备缓存函数 [DllImport("winmm.dll", EntryPoint="waveInPrepareHeader")] public static extern int waveInPrepareHeader ( int hWaveIn, ref WAVEHDR lpWaveInHdr, int uSize ); //给输入设备增加一个缓存 [DllImport("winmm.dll", EntryPoint="waveInAddBuffer")] public static extern int waveInAddBuffer ( int hWaveIn, ref WAVEHDR lpWaveInHdr, int uSize );
//开始录音 [DllImport("winmm.dll", EntryPoint="waveInStart")] public static extern int waveInStart ( int hWaveIn ); //清除缓存 [DllImport("winmm.dll", EntryPoint="waveInUnprepareHeader")] public static extern int waveInUnprepareHeader ( int hWaveIn, ref WAVEHDR lpWaveInHdr, int uSize ); //停止录音 [DllImport("winmm.dll", EntryPoint="waveInReset")] public static extern int waveInReset ( int hWaveIn ); //关闭录音设备 [DllImport("winmm.dll", EntryPoint="waveInClose")] public static extern int waveInClose ( int hWaveIn ); //Wave_audio数据格式 [StructLayout(LayoutKind.Sequential)] public struct WAVEFORMAT { public int wFormatTag; public int nChannels; public int nSamplesPerSec; public int nAvgBytesPerSec; public int nBlockAlign; } /// <summary> /// waveform-audio 缓存格式 /// </summary> [StructLayout(LayoutKind.Sequential)] public struct WAVEHDR { /// <summary> /// 指向锁定的数据缓冲区的指针 /// </summary> public string lpData; /// <summary> /// 数据缓冲区的大小 /// </summary> public int dwBufferLength; /// <summary> /// 录音时指明缓冲区中的数据量 /// </summary> public int dwBytesRecorded; /// <summary> /// 用户数据 /// </summary> public int dwUser; /// <summary> /// 提供缓冲区信息的标志 /// </summary> public int dwFlags; /// <summary> /// 循环播放的次数 /// </summary> public int dwLoops; /// <summary> /// 保留 /// </summary> public int lpNext; /// <summary> /// 保留 /// </summary> public int Reserved; } //打开回放设备 [DllImport("winmm.dll", EntryPoint="waveOutOpen")] public static extern int waveOutOpen ( ref int lphWaveOut, int uDeviceID, ref WAVEFORMAT lpFormat, int dwCallback, int dwInstance, int dwFlags ); //为回放设备准备内存块 [DllImport("winmm.dll", EntryPoint="waveOutPrepareHeader")] public static extern int waveOutPrepareHeader ( int hWaveOut, ref WAVEHDR lpWaveOutHdr, int uSize ); //写数据(放音) [DllImport("winmm.dll", EntryPoint="waveOutWrite")] public static extern int waveOutWrite ( int hWaveOut, ref WAVEHDR lpWaveOutHdr, int uSize ); //打开设备时消息,在此期间我们可以进行一些初始化工作 public const int MM_WIM_OPEN = 0x3BE; //当缓存已满或者停止录音时的消息,处理这个消息可以对缓存进行重新分配,实现不限长度录音 public const int MM_WIM_DATA = 0x3C0; //关闭录音设备时的消息 public const int MM_WOM_CLOSE = 0x3BC; // public const int WAVE_FORMAT_PCM = 1 ; public const int WAVE_MAPPER = -1; } }
using System.Runtime.InteropServices;
namespace VedioAudioTransfer
{
/// <summary>
/// Wave 的摘要说明。
/// </summary>
public class Wave
{
public Wave()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
//读取录音设备
[DllImport("winmm.dll", EntryPoint="waveInGetNumDevs")]
public static extern int waveInGetNumDevs (); //打开录音设备函数
[DllImport("winmm.dll", EntryPoint="waveInOpen")]
public static extern int waveInOpen (
ref int lphWaveIn,
int uDeviceID,
ref WAVEFORMAT lpFormat,
int dwCallback,
int dwInstance,
int dwFlags
); //为录音设备准备缓存函数
[DllImport("winmm.dll", EntryPoint="waveInPrepareHeader")]
public static extern int waveInPrepareHeader (
int hWaveIn,
ref WAVEHDR lpWaveInHdr,
int uSize
); //给输入设备增加一个缓存
[DllImport("winmm.dll", EntryPoint="waveInAddBuffer")]
public static extern int waveInAddBuffer (
int hWaveIn,
ref WAVEHDR lpWaveInHdr,
int uSize
);
//开始录音
[DllImport("winmm.dll", EntryPoint="waveInStart")]
public static extern int waveInStart (
int hWaveIn
); //清除缓存
[DllImport("winmm.dll", EntryPoint="waveInUnprepareHeader")]
public static extern int waveInUnprepareHeader (
int hWaveIn,
ref WAVEHDR lpWaveInHdr,
int uSize
);
//停止录音
[DllImport("winmm.dll", EntryPoint="waveInReset")]
public static extern int waveInReset (
int hWaveIn
); //关闭录音设备
[DllImport("winmm.dll", EntryPoint="waveInClose")]
public static extern int waveInClose (
int hWaveIn
); //Wave_audio数据格式
[StructLayout(LayoutKind.Sequential)]
public struct WAVEFORMAT
{
public int wFormatTag;
public int nChannels;
public int nSamplesPerSec;
public int nAvgBytesPerSec;
public int nBlockAlign;
}
/// <summary>
/// waveform-audio 缓存格式
/// </summary>
[StructLayout(LayoutKind.Sequential)]
public struct WAVEHDR
{
/// <summary>
/// 指向锁定的数据缓冲区的指针
/// </summary>
public string lpData;
/// <summary>
/// 数据缓冲区的大小
/// </summary>
public int dwBufferLength;
/// <summary>
/// 录音时指明缓冲区中的数据量
/// </summary>
public int dwBytesRecorded;
/// <summary>
/// 用户数据
/// </summary>
public int dwUser;
/// <summary>
/// 提供缓冲区信息的标志
/// </summary>
public int dwFlags;
/// <summary>
/// 循环播放的次数
/// </summary>
public int dwLoops;
/// <summary>
/// 保留
/// </summary>
public int lpNext;
/// <summary>
/// 保留
/// </summary>
public int Reserved;
} //打开回放设备
[DllImport("winmm.dll", EntryPoint="waveOutOpen")]
public static extern int waveOutOpen (
ref int lphWaveOut,
int uDeviceID,
ref WAVEFORMAT lpFormat,
int dwCallback,
int dwInstance,
int dwFlags
); //为回放设备准备内存块
[DllImport("winmm.dll", EntryPoint="waveOutPrepareHeader")]
public static extern int waveOutPrepareHeader (
int hWaveOut,
ref WAVEHDR lpWaveOutHdr,
int uSize
); //写数据(放音)
[DllImport("winmm.dll", EntryPoint="waveOutWrite")]
public static extern int waveOutWrite (
int hWaveOut,
ref WAVEHDR lpWaveOutHdr,
int uSize
); //打开设备时消息,在此期间我们可以进行一些初始化工作
public const int MM_WIM_OPEN = 0x3BE;
//当缓存已满或者停止录音时的消息,处理这个消息可以对缓存进行重新分配,实现不限长度录音
public const int MM_WIM_DATA = 0x3C0;
//关闭录音设备时的消息
public const int MM_WOM_CLOSE = 0x3BC;
//
public const int WAVE_FORMAT_PCM = 1 ;
public const int WAVE_MAPPER = -1;
}
}
http://msdn.microsoft.com/library/en-us/directx9_m/directx/sound/capturingwaveforms/capturing_waveforms_entry.asp?frame=true