回 帖 发 新 帖 刷新版面

主题:[讨论]为什么摄像头,用回调函数调用视频算据总是出错

[em15]
Dim lpszName As String * 100
    Dim lpszVer As String * 100
    Dim Caps As CAPDRIVERCAPS
    capGetDriverDescriptionA 0, lpszName, 100, lpszVer, 100 '// Retrieves driver info
    lwndC = capCreateCaptureWindowA(lpszName, WS_VISIBLE Or WS_CHILD, 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight, Picture1.hwnd, 0)
    SetWindowText lwndC, lpszName
   '// Set the video stream callback function
   'capSetCallbackOnError lwndC, AddressOf MyErrorCallback
   'capSetCallbackOnStatus lwndC, AddressOf MyStatusCallback
   'capSetCallbackOnVideoStream lwndC, AddressOf MyVideoStreamCallback
    If Not capDriverConnect(lwndC, 0) Then
       MsgBox "没有找到可选用的摄像头!", vbExclamation, Me.Caption
    End If
    
    If capDriverConnect(lwndC, 0) Then
    
        capDriverGetCaps lwndC, VarPtr(Caps), Len(Caps)
        capPreviewScale lwndC, True
      
        capPreviewRate lwndC, 34
        capOverlay lwndC, True
        capPreview lwndC, True
        
        capSetCallbackOnFrame lwndC, AddressOf MyFrameCallback
       
        capSetMCIDeviceName lwndC, VarPtr(lpszName)
        SetWindowPos lwndC, HWND_BOTTOM, 0, 0, Picture1.ScaleWidth,Picture1.ScaleHeight, SWP_NOMOVE Or SWP_NOZORDER


Function MyFrameCallback(ByVal lwnd As Long, ByVal lpVHdr As Long) As Long
Debug.Print "FrameCallBack"

Dim VideoHeader As VIDEOHDR
Dim VideoData() As Byte

'//Fill VideoHeader with data at lpVHdr
RtlMoveMemory VarPtr(VideoHeader), lpVHdr, Len(VideoHeader)

'// Make room for data
ReDim VideoData(VideoHeader.dwBytesUsed)

'//Copy data into the array
RtlMoveMemory VarPtr(VideoData(0)), VideoHeader.lpData, VideoHeader.dwBytesUsed

Debug.Print VideoHeader.dwBytesUsed
Debug.Print VideoData
End Function

怎么写才把摄像头的数据取出来,后来我用了getdc(lwndC)成功取出图像,
winsock2.SendData PictureToByteArray(hDCToPicture(GetDC(lwndC), 0, 0,Picture1.ScaleWidth, Picture1.ScaleHeight), 80)可是又出现了,摄像头被遮挡住,取到的数据就变成了遮挡的部分的位图,是怎么一会事,然后用GetDCEx(lwndC, 0, DCX_CLIPSIBLINGS),失败,不知道getdcex第二个参数是什么。请高手们指点迷经。

回复列表 (共9个回复)

沙发

If winsock2.State = 7 Then
                
          hrgnclip = CreateRectRgn(Picture1.Left, Picture1.Top, Picture1.Left + Picture1.ScaleWidth, Picture1.Top + Picture1.ScaleHeight)
          Call SelectObject(GetDC(lwndC), hrgnclip)
         Me.Picture = hDCToPicture(GetDCEx(lwndC, hrgnclip, DCX_CLIPSIBLINGS), Picture1.Left, Picture1.Top, Picture1.Left + Picture1.ScaleWidth, Picture1.Top + Picture1.ScaleHeight)
          'winsock2.SendData PictureToByteArray(hDCToPicture(GetDCEx(lwndC, hrgnclip, DCX_CLIPSIBLINGS), 0, 0, Picture1.ScaleWidth, Picture1.ScaleHeight), 80)
          DeleteObject (hrgnclip)
       End If

板凳

依然不成功。。。。

3 楼

我发的帖子里面有个现成的CAMERA部件,里面有代码,看下吧

4 楼

Shell App.Path & "\Camera.dll /regsvr32"

5 楼

我找到一点原因了,可能是我这
 Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, _
    ByVal wMsg As Long, ByVal wParam As Long, lParam As Long) As Long
    
    Public Declare Function SendMessageA Lib "user32" (ByVal hwnd As Long, _
                                            ByVal wMsg As Long, _
                                            ByVal wParam As Long, _
                                            ByRef lParam As Any) As Long
                                            
    Public Declare Function SendMessageS Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, _
    ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long这里搞混了

6 楼

回调函数如下的格式: http://www.mscto.com 

function FrameCallBack(hWnd:HWND;lpVHdr:PVIDEOHDR):DWORD;stdcall;
var
bKeyFrame:BOOL;
Buf:PBYTE;
VideoData:TVIDEO_DATA;
OutActSize:dword;
i:integer;
begin
OutActSize:=BmpInInfo.bmiHeader.biSizeImage;
Buf:=ICSeqCompressFrame(@CapVar,0,lpVHdr.lpData,@bKeyFrame,@OutActSize);

//在这里,OutActSize代表压缩后的视频数据大小
// form1.Label3.Caption:='Compressedsize:' inttostr(OutActSize); 

软件开发网


//我用的是UDP方式,因为UDP数据包大小限制,所以我控制了数据大小,超出的数据会发生丢帧
if(OutActSize<=sizeof(videodata.Buf))then
begin
zeromemory(@VideoData,sizeof(TVIDEO_DATA));

//记录是否为关键帧
VideoData.bKeyFrame:=bKeyFrame; 




copymemory(@VideoData.Buf,Buf,OutActSize);

VideoData.SampleNum:=SampleNum;//我们可以记录下帧数,可以做扩展用
VideoData.BufSize:=OutActSize; //记录数据大小,传输时用

//在这里,你可以用你喜欢的网络方式传输视频数据,

//cc1.SendBuffer(VideoData,sizeof(TVIDEO_DATA)-SendBufferSize Outactsize); http://www.mscto.com 

inc(SampleNum);
end; 
result:=0;
end; 

7 楼

看来要引入关键帧的概念。

8 楼

五一起,宁夏上调最低工资标准,增幅达24.9%。吉林省新制定的最低工资标准5月起执行,平均涨幅为22.9%。这也是自2007年7月以来,吉林省首次调整最低工资。
据统计,今年以来,江苏、浙江、广东、福建、上海、天津、山西、山东等地陆续调整最低工资标准,调整幅度都在10%以上,一些省份超过20%。人力资源和社会保障部透露,今年还将有20个省份计划调整工资标准。
您正在看的文章转载金龙网络:[url=http://www.gm080.cn]http://www.gm080.cn[/url]
原文地址:[url=http://www.gm080.cn/news/201055/32.html]http://www.gm080.cn/news/201055/32.html[/url]

9 楼

呵呵

我来回复

您尚未登录,请登录后再回复。点此登录或注册