⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.cpp

📁 视频采集卡
💻 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 + -