以下是我的实现方法,借鉴了网上的一些做法,整合而成。需要先安装ffshow
extern "C"
{
#include "avcodec.h"
#include "avformat.h"
#include "avio.h"
#include "avutil.h"
#include "common.h"
#include "intfloat_readwrite.h"
#include "inttypes.h"
#include "log.h"
#include "mathematics.h"
#include "mem.h"
#include "rational.h"
#include "stdint.h"
#include "swscale.h"
}
#pragma comment(lib,"avcodec.lib")
#pragma comment(lib,"avformat.lib")
#pragma comment(lib,"avutil.lib")
#define RGBTOYUV(B, G, R, Y, U, V) \
Y = ( ( 66 * R + 129 * G + 25 * B + 128) >> 8) + 16;\
U = ( ( -38 * R - 74 * G + 112 * B + 128) >> 8) + 128;\
V = ( ( 112 * R - 94 * G - 18 * B + 128) >> 8) + 128;
size_t BufSize = 9437184;
BYTE *pStream = new BYTE[BufSize];
BYTE* pBmp24;
int CALLBACK SnapThreadCallback(BYTE *pBuffer) //摄像头显示回调函数
{
pBmp24 = CameraISP(pBuffer);
if(pBmp24)
{
if (bVideo)
{
memcpy(pStream, pBmp24, BufSize);
}
CameraDisplayRGB24(pBmp24);
}
return TRUE;
}
void CXXDlg::OnBtnVideo()
{
// TODO: Add your control notification handler code here
//CWinThread *pVedioStart;
if (m_VideoMode != VIDEOMODE_PLAY)
{
GetDlgItem(IDC_BTN_VIDEO)->SetWindowText("停止录像");
AfxBeginThread((AFX_THREADPROC)VIDEO, this, THREAD_PRIORITY_ABOVE_NORMAL, 0, NULL);
m_VideoMode = VIDEOMODE_PLAY;
}
else
{
m_VideoMode = VIDEOMODE_STOP;
GetDlgItem(IDC_BTN_VIDEO)->SetWindowText("开始录像");
}
}