C# mci SoundRecord / 錄音
錄音我一般更喜歡mci方式,當然也有另一種方式及DirectSound不過它會麻煩許多
但是它卻有一個讓我感到較好的特點,首先可以選擇錄音設備源,第二它不像mci
必須要寫到本地磁盤,它是把錄制音頻流存放在內存中,在速度上我認為它會快很
多,不過它也有一個缺點讓我不舒服,它不如mci哪樣是默認集成在系統中的,我這
個人特喜歡使用系統自帶的函數,主要你不需要去拷貝DLL因為系統是默認就有的,
只需要去調用就行了,方便 當然mci提供的操作命令我比較討厭mciSendCommand
原因在于我自己得寫一大堆結構體 是讓我感到非常討厭的,mciSendString則是通過
字符串,屬于輕量操作函數我倒是喜歡的緊。
private SoundRecord m_Record = new SoundRecord();
private void MainForm_Load(object sender, EventArgs e)
{
this.m_Record.OpenRecord(); // 打開錄音
this.m_Record.StartRecord(); // 開始錄音
}
private void BtnStopAndSave_Click(object sender, EventArgs e)
{
this.m_Record.StopRecord(); // 停止錄音
this.m_Record.SaveRecord(@"C:\Users\windo\Desktop\1.wav"); // 保存錄音
this.m_Record.CloseRecord(); // 關閉錄音
} 上面的代碼只是一個簡單的錄音并保存的過程,不過該類本身就很簡單 而且我也附
有注釋,想必你們應該不會感到學習困難,錄音屬性配置默認初始化在構造函數中。
public partial class SoundRecord
{
[DllImport("WinMm.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)]
private static extern int mciSendString(string lpstrCommand, string lpstrReturnString, int uReturnLength, int hwndCallback);
private const int ERROR_SUCCESS = 0;
private const string MODE_UNKNOWN = "unknown";
private static bool mciSendString(string strCommand)
{
return mciSendString(strCommand, null, 0, 0) != ERROR_SUCCESS;
}
}
public partial class SoundRecord
{
private int m_channels;
private int m_sample_spersec;
private string m_format_tag;
private int m_bits_per_sample;
public SoundRecord()
{
this.Channels = 2;
this.FormatTag = "pcm";
this.BitsPerSample = 8;
this.SampleSpersec = 11025;
}
// 采樣位數
public virtual int BitsPerSample
{
set
{
if (mciSendString("set wave bitpersample " + value))
this.m_bits_per_sample = value;
}
get
{
return this.m_bits_per_sample;
}
}
// 采樣頻率
public virtual int SampleSpersec
{
get
{
return this.m_sample_spersec;
}
set
{
if (mciSendString("set wave samplespersec " + value))
this.m_sample_spersec = value;
}
}
// 聲道
public virtual int Channels
{
get
{
return m_channels;
}
set
{
if (mciSendString("set wave channels " + value))
this.m_channels = value;
}
}
// 格式標簽
public virtual string FormatTag
{
get
{
return this.m_format_tag;
}
set
{
if (mciSendString("set wave format tag " + value))
this.m_format_tag = value;
}
}
// 打開錄音
public virtual bool OpenRecord()
{
return mciSendString("open new type waveaudio alias movie");
}
// 開始錄音
public virtual bool StartRecord()
{
return mciSendString("record movie");
}
// 停止錄音
public virtual bool StopRecord()
{
return mciSendString("stop movie");
}
// 保存錄音
public virtual bool SaveRecord(string saveFileName)
{
return mciSendString("save movie " + saveFileName);
}
// 關閉錄音
public virtual bool CloseRecord()
{
return mciSendString("close movie");
}
// 暫停錄音
public virtual bool PauseRecord()
{
return mciSendString("pause movie");
}
// 恢復錄音
public virtual bool ResumeRecord()
{
return mciSendString("resume movie");
}
// 執行狀態
public virtual string Status
{
get
{
string strBuffer = new string('\0', 12);
if (mciSendString("status movie mode", strBuffer, 12, 0) != ERROR_SUCCESS)
return MODE_UNKNOWN;
if ((strBuffer = strBuffer.Remove(strBuffer.IndexOf('\0'))).Length <= 0)
return MODE_UNKNOWN;
return strBuffer;
}
}
}
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!