》》》高手请进:把一个VC的视频采集压缩程序改成VB的,压缩后生成的文件只有0字节

WQ771211 2008-03-07 02:59:59
VC:
======================================
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;

typedef struct tagBITMAPCOREINFO {
BITMAPCOREHEADER bmciHeader;
RGBTRIPLE bmciColors[1];
} BITMAPCOREINFO, FAR *LPBITMAPCOREINFO, *PBITMAPCOREINFO;

__declspec(dllexport) BOOL __stdcall MV_AVIFileOpen(int index,LPCTSTR lpszFileName, LPBITMAPINFO alpb, WORD wSkipRate);

---------------------------------------------------------------
m_pImageInfo = (BITMAPINFO *) new BYTE[sizeof( BITMAPINFO ) +
(256 * sizeof( RGBQUAD )) ];
if ( m_pImageInfo == NULL ) return ;
m_pImageInfo->bmiHeader.biSize = sizeof( BITMAPINFOHEADER );
m_pImageInfo->bmiHeader.biWidth = info.Width;
m_pImageInfo->bmiHeader.biHeight = info.Heigth;
m_pImageInfo->bmiHeader.biPlanes = 1;
m_pImageInfo->bmiHeader.biBitCount = info.nColor;
m_pImageInfo->bmiHeader.biCompression = BI_RGB;
m_pImageInfo->bmiHeader.biSizeImage = info.Length;
m_pImageInfo->bmiHeader.biXPelsPerMeter = 0;
m_pImageInfo->bmiHeader.biYPelsPerMeter = 0;
m_pImageInfo->bmiHeader.biClrUsed = (info.nColor <= 8) ? 256 : 0;
m_pImageInfo->bmiHeader.biClrImportant = (info.nColor <= 8) ? 256 : 0;
if(info.nColor==8)
{
for (UINT i = 0; i < 256; i++ )
{
m_pImageInfo->bmiColors[i].rgbBlue = (BYTE) 0;
m_pImageInfo->bmiColors[i].rgbGreen = (BYTE) 0;
m_pImageInfo->bmiColors[i].rgbRed = (BYTE) i;
m_pImageInfo->bmiColors[i].rgbReserved = 0;
}
}
char AviFileName[256];
sprintf(AviFileName,"cap%d.avi",FileIndex);
BOOL bOpen=MV_AVIFileOpen(0, AviFileName, m_pImageInfo, 1);
======================================
VB:
Public Type RGBQUAD
rgbBlue As Byte
rgbGreen As Byte
rgbRed As Byte
rgbReserved As Byte
End Type

Public Type BITMAPINFO
bmiHeader As BITMAPINFOHEADER
bmiColors(0 To 256) As RGBQUAD
End Type

Public Const BI_RGB = &H0

Public Declare Function MV_AVIFileOpen Lib "MVAVI.dll" (ByVal Index As Integer, ByVal lpszFileName As String, alpb As BITMAPINFO, wSkipRate As Integer) As Boolean
Dim ImageInfo As BITMAPINFO
'MsgBox LenB(ImageInfo)
ImageInfo.bmiHeader.biSize = 40
......

Dim bOpen As Boolean
Dim fname As String
fname = "tmp1.avi"
bOpen = MV_AVIFileOpen(0, fname, ImageInfo, 1)

或者是:
Public Declare Function MV_AVIFileOpen Lib "MVAVI.dll" (ByVal Index As Integer, ByVal lpszFileName As String,ByVal alpb As Long, wSkipRate As Integer) As Boolean

Long改成Any也不行

bOpen = MV_AVIFileOpen(0, fname,byval VarPtr(ImageInfo), 1)
...全文
116 8 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yijing88 2009-04-23
  • 打赏
  • 举报
回复
接分先!
meiZiNick 2008-04-30
  • 打赏
  • 举报
回复
接分先!
WQ771211 2008-03-27
  • 打赏
  • 举报
回复
我另外开了个帖子,并贴出了代码,请大家继续讨论
http://topic.csdn.net/u/20080326/21/de484afd-ad90-48a0-938c-e3f8d6d8484d.html?seed=581811851
WQ771211 2008-03-26
  • 打赏
  • 举报
回复
谢谢回复,我现在不用他的函数了,mvavi.dll中还是用的VFW,直接调用VFW API还灵活些

不过有新的问题,我在采集完一帧的回调函数中使用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)

怎样在回调函数中进行处理呢,不会每次在回调函数中销毁流再重建吧?
由于图像大小变化了,会引起指针越界的非法操作
智能卡_Snooper 2008-03-09
  • 打赏
  • 举报
回复
Option Explicit

Private Type RGBQUAD
rgbBlue As Byte
rgbGreen As Byte
rgbRed As Byte
rgbReserved As Byte
End Type

Private Type BITMAPINFOHEADER
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type

Private Type BITMAPINFO
bmiHeader As BITMAPINFOHEADER
bmiColors(0 To 256) As RGBQUAD
End Type

Private Const BI_RGB = &H0
Private Declare Function MV_AVIFileOpen Lib "D:\Smart\vc\test8\Debug\test8.dll" (ByVal Index As Long, ByVal lpszFileName As String, ByVal alpb As Long, ByVal wSkipRate As Integer) As Long

Private Sub Command1_Click()
Dim ImageInfo As BITMAPINFO
With ImageInfo
.bmiHeader.biSize = 40
.bmiHeader.biBitCount = 88
.bmiHeader.biHeight = 99
End With

Dim bOpen As Boolean
Dim fname As String
fname = "testfdsafdsafdsatmp1.avi"
bOpen = MV_AVIFileOpen(&H1234, fname, VarPtr(ImageInfo), &H1122)
End Sub


俺写了个测试,在vc下debug跟踪没问题,传进来的都正确。
智能卡_Snooper 2008-03-09
  • 打赏
  • 举报
回复
vc中的integer到VB中必须用long
类型的指针最好也用long
CommandButton 2008-03-08
  • 打赏
  • 举报
回复
应该是VB调用外部DDL的声明有问题,主要是C参数转VB参数有问题。
但哪里有问题我也说不出,最好向V130开发商要一个VB的进程调用MV_AVIFileOpen的例程。
WQ771211 2008-03-07
  • 打赏
  • 举报
回复
MV_AVIFileOpen 函数来自威视V130采集卡开发包中的 mvavi.dll
相关推荐
发帖
API

1482

社区成员

VB API
社区管理员
  • API
加入社区
帖子事件
创建了帖子
2008-03-07 02:59
社区公告
暂无公告