2013/10/6

[c#] 錄音程式

先前有寫到有使用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

沒有留言:

張貼留言