先前有寫到有使用
WebCam錄影的功能
但是錄製的影片只有影像沒有聲音的
想要加入聲音,但是研究後發現 EmguCV無法加入聲音
而且只支援.avi格式的限制
所以就先來個寫個錄音的小程式
之後再來做整合
首先先拉畫面
有三個按鈕 "錄音"、"結束"、"播放"
接著是下面的 WindowsMediaPlayer的元件
這邊會遇到一些小問題,可能會在工具箱裡面找不到
在工具 -->選擇工具箱項目 可以設定
選擇 COM元件 ,將 Windows Media Player打勾
之後在工具箱裡就可以找到了
接著就可以開始寫程式碼了
這邊遇到一個新的東西 -- DllImport
稍微研究一下是說要使用第三方非在管理範圍中DLL的方法
還沒有完全研究完,等之後有比較清楚再進行補充
//使用非託管(Unmanaged)的DLL
[DllImport("winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto)]
public static extern int mciSendString(
string lpstrCommand,
string lpstrReturnString,
int uReturnLength,
int hwndCallback
);
mciSendString 是用來播放多媒體資料的API
參考文獻
開始錄音,有一些的參數設定
可以依據需求去調整
//開始錄音
private void button1_Click(object sender, EventArgs e)
{
mciSendString("set wave bitpersample 8", "", 0, 0);
mciSendString("set wave samplespersec 20000", "", 0, 0);
mciSendString("set wave channels 2", "", 0, 0);
mciSendString("set wave format tag pcm", "", 0, 0);
mciSendString("open new type WAVEAudio alias movie", "", 0, 0);
mciSendString("record movie", "", 0, 0);
button1.Enabled = false;
button2.Enabled = true;
}
結束錄音時,將檔案存在我們定義的路徑跟檔名
//結束錄音
private void button2_Click(object sender, EventArgs e)
{
//檔案存放的路徑
fileName = string.Format("{0}{1}{2}", voiceDirectory, DateTime.Now.ToString("yyyyMMddHmmss"), ".avi");
mciSendString("stop movie", "", 0, 0);
mciSendString("save movie " + fileName, "", 0, 0);
mciSendString("close movie", "", 0, 0);
button1.Enabled = true;
button2.Enabled = false;
button3.Enabled = true;
}
之後我們可以播放一下剛剛的錄音檔
看錄製的效果如何
//播放錄音檔
private void button3_Click(object sender, EventArgs e)
{
if (!playing)
{
playing = true;
button3.Text = "停止";
//播放錄製的檔案
this.axWindowsMediaPlayer1.URL = fileName;
axWindowsMediaPlayer1.Ctlcontrols.play();
}
else
{
axWindowsMediaPlayer1.Ctlcontrols.stop();
playing = false;
button3.Text = "播放";
}
}
這樣就可以達成簡單的錄音程式
如果要陽春一點,這邊就可以跟之前的WebCam錄影程式整合
雖然會是影像跟音效檔分開,但是只要在程式裡面使用兩個WindowsMediaPlayer的元件
就可以同時有影像跟聲音了....
但是這使用上還是很不方便
之後再來研究有沒有更完整的方法吧
DEMO