現在用winform做了個界面,界面上有個框,可以實時顯示攝像頭拍下的影像,代碼用的是這個網站上的代碼https://www.cnblogs.com/hahaqi/archive/2011/06/02/2068558.html(不過這個應該不是重點)。
現在想做的是,點擊一個按鍵之后,可以一邊實時顯示,一邊錄像(在點擊之前已經自動實時顯示了),然后存在一個avi檔案里。功能都已經實作好了,大致思路是:在點擊函式里建立一個執行緒,將錄像函式系結在該執行緒上,然后啟動該執行緒。代碼如下
private void collectStart_Click(object sender, EventArgs e)
{
CamThread = new Thread(CamReadFun);
CamThread.Start();
}
private void CamReadFun()
{
video.StarKinescope(Path.Combine(newpath, DateTime.Now.ToString("yyyy-MM-dd(HH.mm.ss)") + ".avi"));
//這個函式就是上面網頁里的函式,引數為保存的路徑
}
但是問題就來了,當我點擊按鍵之后,滑鼠就會變成加載中的狀態,如果我想點擊按鍵,視窗就會變成未回應狀態。
這時只要隨便另外打開一個非最大化視窗(比如瀏覽器),那么視窗就會恢復正常,而錄制也會自動停止。
————————————————————————————————————————————————
現在懷疑是播放和錄制在不同執行緒同時占用視頻流資源,導致卡死,所以嘗試了異步,但是也沒效果。代碼如下:
delegate void StarKinescopeInvoker(string path);
private void CamReadFun()//開始錄像
{
StarKinescopeInvoker Invoker = new StarKinescopeInvoker(video.StarKinescope);
Invoker.BeginInvoke(Path.Combine(newpath, DateTime.Now.ToString("yyyy-MM-dd(HH.mm.ss)") + ".avi"),null,null);
}
順便一提,影像顯示也只是用了兩行代碼:
video = new cVideo(picCapture.Handle, 640, 480);//picCapture是PictureBox型別的變數,用來顯示
Status_cam = video.StartWebCam();//如果連接成功的話大概會是true吧
如果不執行StartWebCam函式的話根本就無法錄制,所以也無法單獨錄制來實驗。
————————————————————————————————————————————————
如果有大佬知道怎么解不勝感激ORZ
uj5u.com熱心網友回復:
private void Save()
{
Task.Run(() =>
{
Status_cam = video.StartWebCam();//如果連接成功的話大概會是true吧
});
}
uj5u.com熱心網友回復:
把錄制的地方啟動一個執行緒去執行 不要直接在界面執行緒執行uj5u.com熱心網友回復:
不好意思,你發代碼的那個部分是實時顯示的部分啊,這個部分雖然在主執行緒里,但是這部分沒有問題啊,單獨跑實時顯示是沒有問題的。
至于下面那個回復里說“錄制的地方啟動一個執行緒去執行”,我就是這么做的啊,錄制的部分是這樣的
private void CamReadFun()
{
video.StarKinescope(Path.Combine(newpath, DateTime.Now.ToString("yyyy-MM-dd(HH.mm.ss)") + ".avi"));
//這個函式就是上面網頁里的函式,引數為保存的路徑
}
這個部分就是另開的執行緒寫的啊,開了個CamThread執行緒
——————————————————————————————————————————————
uj5u.com熱心網友回復:
沒有用過你這個組件,你要不要放到 委托里處理。會不會執行緒沖突了轉載請註明出處,本文鏈接:https://www.uj5u.com/net/117652.html
標籤:C#
