Private Sub Command1_Click()
SendMessage ctCapWin, WM_CAP_Sequence, 0, 0 '開始錄像,錄像未結束前不會回傳
End Sub
Private Sub Command2_Click()
Image9.Visible = False
Image2.Visible = True
Dim nStyle As Long, T As Long
If ctCapWin = 0 Then '創建一個視頻視窗,大小:640*480
T = Me.ScaleY(200, Me.ScaleMode, 3) '視頻視窗垂直位置:像素
'nStyle = WS_Child + WS_Visible + WS_Caption + WS_ThickFrame '子視窗(在Form1內)+可見+標題欄+邊框
'nStyle = WS_Child + WS_Visible '視頻視窗無標題欄和邊框
nStyle = WS_Visible '視頻視窗為獨立視窗,關閉主視窗視頻視窗也會自動關閉
ctCapWin = capCreateCaptureWindow("視頻監視中", nStyle, 0, T, 640, 480, Me.hWnd, 0)
End If
'將視頻視窗連接到攝像頭,如無后面兩條陳述句視頻視窗畫面不會變化
SendMessage ctCapWin, WM_CAP_Connect, 0, 0 '連接攝像頭
SendMessage ctCapWin, WM_CAP_Set_PreView, 1, 0 '第三個引數:1-預覽模式有效,0-預覽模式無效
SendMessage ctCapWin, WM_CAP_Set_PreViewRate, 30, 0 '第三個引數:設定預覽顯示頻率為每秒 30 幀
End Sub
問題,如上程式所述,分別采用兩個COMMAND 觸發來實作視頻建立連接和錄相是完全沒有問題的,但我用串口中斷接收指令的形式來建立連接和錄相就會出現白屏或卡死的現象,很奇怪,求高人指導。謝謝
uj5u.com熱心網友回復:
推薦你個控制元件,我們公司在用。VideoCapX,自己百度。
uj5u.com熱心網友回復:
串口中斷接收指令?怎么用?和串口有什么關系?攝像頭是串口的?還有你的中斷指令是什么回事?你跳過API直接觸發 Ring 3 的CPU中斷?但“串口中斷”又好像是DOS的概念,
你到底說寫什么?怎么完全沒搞清楚你的是什么狀況呢?
我知道的目前在Windows上比較流行的采集攝像頭方法有兩種。
1、是VFW技術,就是你用的 capCreateCaptureWindow 這種東西,其實你仔細看一下模塊代碼,你會發現也是windows訊息,只是封裝一下而已,和你else下面的SendMessage并無二異,為非是封裝了SendMessage而已。
2、DirectShow,這看DX版本的,不過高版本的DX沒有VB6的范例,DX8.1還有。
相對來說VFW的使用是VB6最常用的,只是兼容性不高,如系統版本,硬體支持等可能會存在問題。
不過對于固定的老系統和固定的硬體在兼容性上看到是問題不大。
而DirectShow兼容性好好很多,VFW不能正常訪問的硬體DirectShow也能正常,而且效率高。只是vb6嘛還是用vfw吧。不然就在別的開發工具用DirectShow弄個控制元件出來給vb6用也可以。
對于vfw,你可以看看這個范例,是采集用的(不用顯示出來也可采集到攝像頭的位圖資料)
http://blog.csdn.net/supermanking/article/details/3207341
如果你想了解DirectShow,你可以去下個DX SDK,不過新版本的 DX SDK通常都是VC.NET 或是 VB.NET 的。
uj5u.com熱心網友回復:
謝謝你的建議,我的硬體系統是這樣的:單片機系統做為下位機與電腦通過232串口連接,電腦上插有USB的視頻攝像頭,作業的某個時候,單片機會向電腦串口發送一個開始錄相的指令,電腦上的VB軟體接收到這個指令后,自動打開錄相視窗并開始錄相,直到下位機再次向電腦串口發送停止錄相指令,這時自動關閉錄相視窗斷開攝像頭連接,并自動保存視頻到默認目錄下。基本功能就是這樣了,我現在單獨做視頻采集可以,只是一加上串口指令中斷處理程式就會卡死。是不是得用多執行緒啊??uj5u.com熱心網友回復:
你的串口指令回應沒回傳就錄像,所以卡死了。用不著多執行緒,只要加個 Timer 控制元件進行延時應該就可以了:
串口指令回應程序中開啟 Timer 后就回傳;
一小段延時后 Timer 事件觸發,把 Timer 停止,然后開始錄像。
uj5u.com熱心網友回復:
可以考慮使用多行程。不要做A語言代碼修改為B語言代碼的無用功。
也不要做用A語言代碼直接呼叫B語言代碼庫這樣復雜、這樣容易出錯的傻事。
只需讓A、B語言代碼的輸入輸出重定向到文本檔案,或修改A、B語言代碼讓其通過文本檔案輸入輸出。
即可很方便地讓A、B兩種語言之間協調作業。
比如:
A將請求資料寫到檔案a.txt,寫完后改名為aa.txt
B發現aa.txt存在時,讀取其內容,呼叫相應功能,將結果寫到檔案b.txt,寫完后洗掉aa.txt,改名為bb.txt
A發現bb.txt存在時,讀取其內容,讀完后洗掉bb.txt
以上A可以替換為任何一種開發語言或開發環境,B可以替換為任何一種與A不同的開發語言或開發環境。
除非A或B不支持判斷檔案是否存在、檔案讀寫和檔案更名。
但是誰又能舉出不支持判斷檔案是否存在、檔案讀寫和檔案更名的開發語言或開發環境呢?
可以將臨時檔案放在RamDisk上提高效率減少磨損磁盤。
資料的結構很復雜的話,文本檔案的格式問題可參考json或xml
共享臨時文本檔案這種行程之間的通訊方法相比其它方法的優點有很多,下面僅列出我現在能想到的:
·行程之間松耦合
·行程可在同一臺機器上,也可跨機,跨作業系統,跨硬體平臺,甚至跨國。
·方便除錯和監視,只需讓第三方或人工查看該臨時文本檔案即可。
·方便在線開關服務,只需洗掉或創建該臨時文本檔案即可。
·方便實作分布式和負載均衡。
·方便佇列化提供服務,而且幾乎不可能發生佇列滿的情況(除非硬碟空間滿)
·……
“跨語言、跨機,跨作業系統,跨硬體平臺,跨國,跨*.*的”苦海無邊,
回頭是“使用共享純文本檔案進行資訊交流”的岸!
uj5u.com熱心網友回復:
Private Sub MSComm1_OnComm()
Dim i As Integer
Dim c As String
Dim S As Integer
Dim N As Integer
Dim H As Integer
On Error GoTo Err
With MSComm1
Select Case MSComm1.CommEvent
Case comEvReceive
'MSComm1.RThreshold = 0
revbuf = MSComm1.Input
For i = 1 To Len(revbuf)
c = Mid(revbuf, i, 1)
TextReceive.Text = TextReceive.Text & c '輸出顯示
Next i
If Mid(revbuf, 1, 1) = "S" Then '對接收字串是否符合要求作判斷,本句擬增加接收字串長做判斷.
Image2.Visible = False
Image9.Visible = True
Label1.Caption = Mid(revbuf, 2, 3)
Label2.Caption = Mid(revbuf, 6, 3)
End If
If Mid(revbuf, 1, 1) = "H" Then '對接收字串是否符合要求作判斷,本句擬增加接收字串長做判斷.
Label3.Caption = Mid(revbuf, 2, 2)
End If
Call jieshou
'MSComm1.RThreshold = 1
End Select
End With
revbuf = ""
Err:
End Sub
Public Function jieshou()
Dim data(1) As Byte
Dim nStyle As Long, T As Long
Select Case revbuf
Case "count=1;"
If ctCapWin = 0 Then '創建一個視頻視窗,大小:640*480
T = Me.ScaleY(200, Me.ScaleMode, 3) '視頻視窗垂直位置:像素
'nStyle = WS_Child + WS_Visible + WS_Caption + WS_ThickFrame '子視窗(在Form1內)+可見+標題欄+邊框
'nStyle = WS_Child + WS_Visible '視頻視窗無標題欄和邊框
nStyle = WS_Visible '視頻視窗為獨立視窗,關閉主視窗視頻視窗也會自動關閉
ctCapWin = capCreateCaptureWindow("視頻監視中", nStyle, 0, T, 640, 480, Me.hWnd, 0)
End If
'將視頻視窗連接到攝像頭,如無后面兩條陳述句視頻視窗畫面不會變化
SendMessage ctCapWin, WM_CAP_Connect, 0, 0 '連接攝像頭
SendMessage ctCapWin, WM_CAP_Set_PreView, 1, 0 '第三個引數:1-預覽模式有效,0-預覽模式無效
SendMessage ctCapWin, WM_CAP_Set_PreViewRate, 30, 0 '第三個引數:設定預覽顯示頻率為每秒 30 幀
SendMessage ctCapWin, WM_CAP_Sequence, 0, 0 '開始錄像,錄像未結束前不會回傳
Case "count=0;"
SendMessage ctCapWin, WM_CAP_Stop, 0, 0 '終止視頻捕獲
SendMessage ctCapWin, WM_CAP_DisConnect, 0, 0 '斷開攝像頭連接
SendMessage ctCapWin, WM_CLOSE, 0, 0 '關閉指定表單標題的表單
ctCapWin = 0
Case Else
End Select
End Function
謝謝Tiger_Zhao的指點!本人VB算是菜鳥水平,還請前輩費心指導,現在程式是這樣的,電腦串口接收到單片機系統發來的指令后進入Function jieshou()程式中處理,是不是錄相程序中還沒有串口中斷回傳啊?
uj5u.com熱心網友回復:
是啊。把呼叫 jieshou 改為啟動 Timer,在 Timer 事件中再呼叫 jieshou。uj5u.com熱心網友回復:
謝謝Tiger_Zhao的指點!按照你的方式,效果好多了,但是我把錄相功能單獨生成了個EXE檔案,TIMER觸發打開這個錄相程式或者關閉,這樣會比在程式里加載錄相好些,但有時會出現錄相界面變成一片綠的現象,但相比以前的白屏和卡住問題沒有了,看來還是把問題想復雜了,一直在琢磨多執行緒了,呵呵。uj5u.com熱心網友回復:
關于綠屏的猜測:你單獨的錄像程式可能表單還沒有完全加載你就開始錄像了,也可以加個timer延時啟動錄像。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/76817.html
標籤:VB基礎類
上一篇:VC++6.0工具使用問題
