📄 unit1.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
extern "C"
{
#include "Sa7134Capture.h"
#include "MediaTransmit.h"
}
#include "CapturePicture.h"
#include "Global.h"
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TformMain *formMain;
HANDLE g_hCapPic;
#define MAX_DEVNUM 16
Device_Info* g_pDev = NULL;
DWORD g_dwDevNum = NULL;
DWORD g_dwPicNum = 0;
//---------------------------------------------------------------------------
LRESULT CALLBACK MyMainWndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
return DefWindowProc(hWnd, msg, wParam, lParam);
}
void CALLBACK VCAPrcVidCapCallBack(DWORD dwCard, BYTE *pbuff,DWORD dwSize)
{
g_pDev[dwCard].dwRealFrameRate++;
g_dwPicNum++;
ULONG nWidth,nHeight;
VCAGetVidCapSize(dwCard,nWidth,nHeight);
BYTE *pRGBBuffer = new BYTE[nWidth*nHeight*4];
BYTE *pYUVBuffer = new BYTE[nWidth*nHeight*2];
for(ULONG i = 0; i < nHeight; i++)
memcpy(pYUVBuffer + i * nWidth * 2, pbuff + (nHeight - i - 1) * nWidth * 2,nWidth * 2);
AnsiString szFile = AnsiString("d:\\") + IntToStr(g_dwPicNum) + ".yuv.bmp";
CaptureFileAsBmp(szFile.c_str(),pYUVBuffer,pRGBBuffer,nWidth,nHeight);
delete []pYUVBuffer;
delete []pRGBBuffer;
::SetEvent(g_hCapPic);
}
void CALLBACK VCAPrcVidMpegCallBack(DWORD dwCard, BYTE *pbuff, DWORD dwSize, BOOL isKeyFrm)
{
//设备的MPEG4捕获数据处理(注意:之前要注册回调函数)
g_pDev[dwCard].dwRealFrameRate++;
if ( g_pDev[dwCard].bNetTrans )
{
MTAWriteVideo( (BYTE)dwCard, pbuff, dwSize, isKeyFrm );
}
}
void CALLBACK VCAPrcAudMpegCallBack(DWORD dwCard, BYTE *pbuff, DWORD dwSize)
{
//设备的MPEG4捕获数据处理(注意:之前要注册回调函数)
g_pDev[dwCard].dwRealFrameRate++;
if( g_pDev[dwCard].dwRealFrameRate )
MTAWriteAudio( (BYTE)dwCard, pbuff, dwSize );
}
void CALLBACK VCAPrcVidSaveErrCallBack(DWORD dwCard)
{
//设备的捕获数据存盘错误处理(注意:之前要注册回调函数)
}
void CALLBACK VCAPrcVidOSDErrCallBack( DWORD dwCard, DWORD dwODSNum )
{
//设备的捕获数据存盘错误处理(注意:之前要注册回调函数)
}
void CALLBACK VCAPrcAudCapCallBack(DWORD dwCard, BYTE *pbuff,DWORD dwSize)
{
//设备的YUY2数据处理(注意:之前要注册回调函数)
//g_pDev[dwCard].dwRealFrameRate++;
}
void CALLBACK VCAPrcAudSaveErrCallBack(DWORD dwCard)
{
//设备的捕获数据存盘错误处理(注意:之前要注册回调函数)
}
void CALLBACK VCAPrcIoAlertCallBack (DWORD dwCard)
{
}
BYTE WINAPI ManageProc(DWORD dwIp,WORD usPort,BYTE biCardNo,BYTE biCmd,
BYTE *lpInData,WORD biInSize,BYTE *lpOutData,WORD &biOutSize)
{
if( biCmd == REQ_VI_STREAM)
MTAWriteVideo(biCardNo,lpOutData,biOutSize,FALSE);
else if ( biCmd == REQ_AU_STREAM )
MTAWriteAudio((BYTE)biCardNo,lpOutData,biOutSize);
return ERR_CMD_SUCCESS;
}
__fastcall TformMain::TformMain(TComponent* Owner)
: TForm(Owner)
{
g_hCapPic = ::CreateEvent(NULL, TRUE, FALSE, "EventSnap");
InitVideo();
}
BOOL TformMain::InitVideo()
{
// 初始化网络库
if(!MTALoadLibrary(7000,WORK_AS_SERVER))
{
int nError = MTAGetLastError();
if(nError == ERR_SYS_NOTMCARD)
{
ShowMessage("请先安装天敏VC404P");
}
else
{
ShowMessage("初始化网络系统异常!");
}
}
/*注册网络通知消息处理函数*/
MTARegNotifier(&ManageProc);
if ( !VCAInitSdk(Handle) )
{
ShowMessage("VC404卡驱动初始化失败!");
return FALSE;
}
m_dwDevNum = VCAGetDevNum();
if ( !m_dwDevNum )
{
ShowMessage("请确定VC404卡驱动程序是否安装成功!");
return FALSE;
}
g_dwDevNum = m_dwDevNum;
if ( !CreateWindowClass() )
{
ShowMessage("系统初始化错误!");
return FALSE;
}
m_pDev = new DEVICE_INFO[m_dwDevNum];
if ( !m_pDev )
{
ShowMessage("系统初始化错误!");
return FALSE;
}
DWORD dwCard = 0;
m_pDev[dwCard].hWnd = NULL;
m_pDev[dwCard].bOpen = FALSE;
m_pDev[dwCard].bDbClick = FALSE;
m_pDev[dwCard].bCapStart = FALSE;
m_pDev[dwCard].dwCard = dwCard;
strcpy( m_pDev[dwCard].strCapDir, "d:\\video.avi");
m_pDev[dwCard].dwFileNum = 0;
m_pDev[dwCard].dwDispWidth = 0;
m_pDev[dwCard].dwDispHeight = 0;
m_pDev[dwCard].dwDispPosX = 0;
m_pDev[dwCard].dwDispPosY = 0;
m_pDev[dwCard].dwCapTime = 0;
m_pDev[dwCard].dwCapHeight = 288;
m_pDev[dwCard].dwCapWeight = 352;
m_pDev[dwCard].dwFrameRate = 25;
m_pDev[dwCard].dwSwitchFreq = 0;
m_pDev[dwCard].dwBitRate = 500;
m_pDev[dwCard].dwKeyFrmInterval = 25;
m_pDev[dwCard].dwRealFrameRate = 0;
m_pDev[dwCard].enVidCapModel = CAP_MPEG4_STREAM;
m_pDev[dwCard].enVidMpegModel = MPEG4_AVIFILE_CALLBACK;
m_pDev[dwCard].enAudCapModel = CAP_MPEG4_STREAM;
m_pDev[dwCard].enAudMpegModel = MPEG4_AVIFILE_ONLY;
m_pDev[dwCard].bNetTrans = TRUE;
m_pDev[dwCard].bFrameRateReduction = FALSE;
m_pDev[dwCard].bMotionDetect = FALSE;
m_pDev[dwCard].bAudioOut = FALSE;
int i=0;
m_pDev[dwCard].stuOSDPARAM[i].cfEnableOSD = FALSE;
m_pDev[dwCard].dwSharpness = 0;
m_pDev[dwCard].dwSaturation = 64;
m_pDev[dwCard].dwContrast = 68;
m_pDev[dwCard].dwBrightness = 128;
OnCreateWindow( dwCard );
//按上文的缺省设置打开设备
m_pDev[dwCard].bOpen = VCAOpenDevice( dwCard, m_pDev[dwCard].hWnd);
if(!m_pDev[dwCard].bOpen)
{
ShowMessage("设备0捕获参数信息错误!");
return FALSE;
}
VCAStartAudioCapture( dwCard, CAP_NULL_STREAM, MPEG4_AVIFILE_ONLY );
//打开设备预览
VCAStartVideoPreview( dwCard );
// 视频回调
VCARegVidMpegCallBack( dwCard, VCAPrcVidMpegCallBack );
VCARegVidSaveErrCallBack( dwCard, VCAPrcVidSaveErrCallBack );
VCARegVidOSDErrCallBack( dwCard, VCAPrcVidOSDErrCallBack );
VCARegAudCapCallBack( dwCard, VCAPrcAudCapCallBack );
// 音频回调
VCARegAudMpegCallBack( dwCard, VCAPrcAudMpegCallBack );
VCARegAudSaveErrCallBack( dwCard, VCAPrcAudSaveErrCallBack );
VCARegIoAlertCallBack( dwCard, VCAPrcIoAlertCallBack );
g_pDev = m_pDev;
m_dwDevID = 0;
VCASetVidDeviceColor( m_dwDevID, BRIGHTNESS, m_pDev[m_dwDevID].dwBrightness );
VCASetVidDeviceColor( m_dwDevID, SATURATION, m_pDev[m_dwDevID].dwSaturation );
VCASetVidDeviceColor( m_dwDevID, CONTRAST, m_pDev[m_dwDevID].dwContrast );
VCASetVidDeviceColor( m_dwDevID, HUE, m_pDev[m_dwDevID].dwHue );
VCASetVidDeviceColor( m_dwDevID, SHARPNESS, m_pDev[m_dwDevID].dwSharpness );
return TRUE;
}
//---------------------------------------------------------------------------
BOOL TformMain::CreateWindowClass()
{
wsprintf(m_strClassname,"SAA7134_DEMO_Window");
m_wc.cbSize = sizeof(m_wc);
m_wc.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
m_wc.lpfnWndProc = &MyMainWndProc;
m_wc.hInstance = HInstance;
m_wc.lpszClassName = m_strClassname;
m_wc.hbrBackground = CreateSolidBrush( dwBackColor );
m_wc.hCursor = LoadCursor( NULL, IDC_ARROW );//LoadCursor(g_Hinstance, MAKEINTRESOURCE (IDC_ARROW));
m_wc.cbClsExtra = 0;
m_wc.cbWndExtra = 0;
m_wc.hIcon = NULL;
m_wc.hIconSm = NULL;
m_wc.lpszMenuName = NULL;
if ( 0 == RegisterClassEx( &m_wc ) &&
ERROR_CLASS_ALREADY_EXISTS != GetLastError() )
return FALSE;
return TRUE;
}
void __fastcall TformMain::btnRecordClick(TObject *Sender)
{
if ( !m_pDev[m_dwDevID].bOpen )
ShowMessage("请打开设备!");
VCAStopAudioCapture( m_dwDevID );
BOOL ret = VCAStartVideoCapture( m_dwDevID, m_pDev[m_dwDevID].enVidCapModel,
m_pDev[m_dwDevID].enVidMpegModel,
m_pDev[m_dwDevID].strCapDir );
if ( !ret )
return;
m_pDev[m_dwDevID].dwCapTime = 0;
m_pDev[m_dwDevID].dwRealFrameRate = 0;
m_pDev[m_dwDevID].bCapStart = TRUE;
btnRecord->Enabled = false;
btnStop->Enabled = true;
btnSnap->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TformMain::btnSnapClick(TObject *Sender)
{
BOOL bOK = TRUE;
int nCard =0;
bOK &=VCARegVidCapCallBack(nCard,VCAPrcVidCapCallBack);
bOK &=VCASetVidCapSize(nCard,352,288);
bOK &=VCAStartVideoCapture(nCard,CAP_ORIGIN_STREAM,MPEG4_AVIFILE_ONLY,"");
WaitForSingleObject( g_hCapPic, 10000);
VCAStopVideoCapture( nCard );
::ResetEvent(g_hCapPic);
if(!bOK)
ShowMessage("err");
}
//---------------------------------------------------------------------------
void TformMain::OnCreateWindow( DWORD dwCard )
{
DWORD dwStyle = WS_VISIBLE | WS_CHILD;
eFieldFrequency eFreq;
if ( m_pDev[dwCard].hWnd )
return;
VCAGetVidFieldFrq( dwCard, eFreq );
m_pDev[dwCard].dwDispHeight = wndShow->Height;
m_pDev[dwCard].dwDispWidth = wndShow->Width;
m_pDev[dwCard].dwDispPosX = 0;
m_pDev[dwCard].dwDispPosY = 0;
m_pDev[dwCard].hWnd = CreateWindowEx(WS_EX_TOPMOST, TEXT(m_strClassname),
NULL,
dwStyle,
m_pDev[dwCard].dwDispPosX,
m_pDev[dwCard].dwDispPosY,
m_pDev[dwCard].dwDispWidth,
m_pDev[dwCard].dwDispHeight,
wndShow->Handle,
NULL,
HInstance,
NULL);
}
void __fastcall TformMain::btnStopClick(TObject *Sender)
{
if ( !m_pDev[m_dwDevID].bOpen )
ShowMessage("请打开设备!");
BOOL ret = VCAStopVideoCapture( m_dwDevID );
if ( ret )
{
m_pDev[m_dwDevID].bCapStart = FALSE;
btnRecord->Enabled = true;
btnStop->Enabled = false;
btnSnap->Enabled = true;
}
}
//---------------------------------------------------------------------------
void TformMain::FreeResource()
{
VCAUnInitSdk();
MTAFreeLibrary();
DWORD i = 0;
if ( m_pDev[i].hWnd )
{
::DestroyWindow( m_pDev[i].hWnd );
m_pDev[i].hWnd = NULL;
}
if ( m_pDev )
{
delete[] m_pDev;
m_pDev = NULL;
}
}
void __fastcall TformMain::FormClose(TObject *Sender, TCloseAction &Action)
{
FreeResource();
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -