我用VFW函数把采集卡的图像写入AVI文件,在采集完一帧的回调函数中使用AVIStreamWrite,但是采集的帧大小(就是高和宽)可能会经常发生变化,而建立流的时候就指定了图像大小
With aviSI
.fccType = mmioStringToFOURCC("vids", 0&) '// stream type video
.fccHandler = 0& '// default AVI handler
.dwScale = 1
.dwRate = 25 '// fps(1-30)
.dwSuggestedBufferSize = bInfo.bmiHeader.biSizeImage '// size of one frame pixels
Call SetRect(.rcFrame, 0, 0, bInfo.bmiHeader.biWidth, bInfo.bmiHeader.biHeight) '// rectangle for stream
End With
' create the stream
r = AVIFileCreateStream(pFile, ps, aviSI)
If (r <> AVIERR_OK) Then GoTo OVER
pOpts = VarPtr(opts)
r = AVISaveOptions(0, _
ICMF_CHOOSE_KEYFRAME Or ICMF_CHOOSE_DATARATE, _
1, _
ps, _
pOpts) 'returns TRUE if User presses OK, FALSE if Cancel, or error code If r <> 1 Then 'In C TRUE = 1
Call AVISaveOptionsFree(1, pOpts)
GoTo OVER
End If
'make compressed stream
r = AVIMakeCompressedStream(psCompressed, ps, opts, 0&)
If r <> AVIERR_OK Then GoTo OVER Dim tmpBIH As BITMAPINFOHEADER
tmpBIH = BInfo.bmiHeader
r = AVIStreamSetFormat(psCompressed, 0, ByVal VarPtr(tmpBIH), Len(tmpBIH))
If (r <> AVIERR_OK) Then
msg = "设置数据流格式失败"
GoTo OVER
End If 怎样在回调函数中进行处理呢,不会每次在回调函数中销毁流再重建吧?
由于图像大小变化了,会引起指针越界的非法操作 回调函数写法:
Public Function addFrame(ByVal pBuf As Long, ByVal pInfo As Long) As Long
Dim info As MV_IMAGEINFO
Call CopyMemory(ByVal VarPtr(info), ByVal pInfo, Len(info)) '拷贝MV_IMAGEINFO结构体 'Write a frame
r = AVIStreamWrite(psCompressed, _
FrameIdx, _
1, _
ByVal pBuf, _
info.Length, _
AVIIF_KEYFRAME, _
ByVal 0&, _
ByVal 0&)
FrameIdx = FrameIdx + 1
End Function =====================================
我觉得这种传统的写法结构不好,建立流的时候把大小限定死了。
请问视频采集方面还有什么好的方法没有?
解决方案 »
- 有没有可能创建这样的数据库
- 函数参数回传(超难问题,高手请进)
- 感谢“情浓风寒”
- listview中,怎么能够禁止选中listitems
- 在MSCHART中如何实现一边显示刻度值,一边显示百分比,在线等待
- MSCHART控件与数据库的连接使用问题?
- 我编一个程序要控制端口Com1,但手头没有那个设备,谁知道哪里有能模拟Com端口的软件!!
- 大虾们帮我一次好吗?先谢谢你了!
- API函数mciSendString的最后一个参数hwndCallback到底怎么用?
- 关于VCD的自动探测及音频控制问题(重奖100分).
- 如何在VB6环境用ByteArrayToString(ByVal arrInput() As Byte)这个方法?
- 一个文字画框,求教了,就这点分了
接分
end if