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

📄 video.cpp

📁 刚上传内容的相关CODEC不能单独上传。于是
💻 CPP
字号:
// Video.cpp: implementation of the CVideo class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Video.h"
#include "Image.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CVideo::CVideo()
{
	AVIFileInit();
	m_VideoStream = NULL;
	m_VideoFrame = NULL;
	m_bValidate = FALSE;
}

CVideo::CVideo(LPCTSTR lpszPathName)
{
	AVIFileInit();
	m_VideoStream = NULL;
	m_VideoFrame = NULL;
	m_bValidate = Open(lpszPathName);
}

CVideo::~CVideo()
{
	Close();
	AVIFileExit();
}

BOOL CVideo::Open(LPCTSTR lpszPathName)
{
	//PAVIFILE AviFile;
	//if( AVIFileOpen( &AviFile, lpszPathName, OF_READ, NULL ) )
	//	return FALSE;

	//if( AVIFileGetStream( AviFile, &m_VideoStream, streamtypeVIDEO, NULL ) )
	//	return FALSE;
	if( AVIStreamOpenFromFile( &m_VideoStream, lpszPathName, streamtypeVIDEO, 0, OF_READ, NULL ) )
		return FALSE;
	
	AVIStreamAddRef(m_VideoStream);
	
	AVISTREAMINFO  StreamInfo;
	if( AVIStreamInfo(m_VideoStream, &StreamInfo, sizeof(AVISTREAMINFO)) )
	{
		AVIStreamRelease(m_VideoStream);
		m_VideoStream = NULL;	
		return FALSE;
	}	
	
	m_VideoSize = ((CRect)StreamInfo.rcFrame).Size();
	m_nTotalFrame = StreamInfo.dwLength;
	m_nFramePerSec = StreamInfo.dwRate/StreamInfo.dwScale;		
	
	m_VideoFrame = AVIStreamGetFrameOpen( m_VideoStream, NULL);
	if( !m_VideoFrame )
	{
		AVIStreamRelease(m_VideoStream);		
		m_VideoStream = NULL;	
		return FALSE;
	}
	LPBITMAPINFOHEADER pBitmapInfo = (LPBITMAPINFOHEADER)AVIStreamGetFrame(m_VideoFrame, 0);
	memcpy( &m_BitmapInfo, pBitmapInfo, sizeof(BITMAPINFOHEADER) );
	m_nBitCount = m_BitmapInfo.biBitCount;	

	return TRUE;
}

BOOL CVideo::Close()
{
	if( m_VideoFrame )
	{
		AVIStreamGetFrameClose(m_VideoFrame);		
		m_VideoFrame = NULL;
	}
	if( m_VideoStream )
	{
		AVIStreamRelease(m_VideoStream);
		m_VideoStream = NULL;	
	}
	return TRUE;
}

BOOL CVideo::GetFrame(int n, CImage* pImage)
{	
	if( !m_bValidate || n > m_nTotalFrame || !m_VideoFrame ) return FALSE;

	BYTE* pDib = (BYTE*)AVIStreamGetFrame(m_VideoFrame, n)+sizeof(BITMAPINFOHEADER);
	if( !pDib ) return FALSE;

	BYTE* pDes;
	BYTE* pSrc;
	int dwSize;

	if( m_nBitCount != 16 )
	{
		if( !pImage->IsValidate() )
			pImage->CreateImage( m_VideoSize, m_nBitCount );
		
		if( m_nBitCount == 8 )
		{
			pDes = pImage->m_pDib-1024;
			pSrc = pDib-1024;
			dwSize = pImage->m_dwLineLen * pImage->m_sizeImage.cy + 1024;
		}
		else
		{
			pDes = pImage->m_pDib;
			pSrc = pDib;
			dwSize = pImage->m_dwLineLen * pImage->m_sizeImage.cy;
		}
		CopyMemory( pDes, pSrc , dwSize );
		
		return TRUE;
	}
	else
		return FALSE;
}

CImage* CVideo::GetFrame(int n)
{
	if( !m_bValidate || n >= m_nTotalFrame || !m_VideoFrame ) return FALSE;

	BYTE* pDib = (BYTE*)AVIStreamGetFrame(m_VideoFrame, n)+sizeof(BITMAPINFOHEADER);
	if( !pDib ) return FALSE;

	BYTE* pDes;
	BYTE* pSrc;
	int dwSize;
	CImage* pImage;

	if( m_nBitCount != 16 )
	{
		pImage = new CImage( m_VideoSize, m_nBitCount );
		
		if( m_nBitCount == 8 )
		{
			pDes = pImage->m_pDib-1024;
			pSrc = pDib;
			dwSize = pImage->m_dwLineLen * pImage->m_sizeImage.cy + 1024;
			CopyMemory( pDes, pSrc , dwSize );
			pImage->CreatePalette();
		}
		else
		{
			pDes = pImage->m_pDib;
			pSrc = pDib;
			dwSize = pImage->m_dwLineLen * pImage->m_sizeImage.cy;
			CopyMemory( pDes, pSrc , dwSize );			
		}		
		
		return pImage;
	}
	else
		return NULL;
}


void CVideo::PaintFrame( int n, CDC* pDC, int mode )
{	
	PaintFrame( n, pDC, CPoint(0,0), mode );
}

void CVideo::PaintFrame( int n, CDC* pDC, CPoint des, int mode )
{
	if( !m_bValidate || n > m_nTotalFrame || !m_VideoFrame ) return;

	BYTE* pDib = (BYTE*)AVIStreamGetFrame(m_VideoFrame, n);
	if( !pDib ) return;

	LPSTR    lpDIBBits;          
	BOOL     bSuccess = FALSE;     
	LPBITMAPINFO bmpInfo;
		
	if( m_nBitCount == 8 )
		lpDIBBits = (LPSTR)pDib+sizeof(BITMAPINFOHEADER)+1024;
	else
		lpDIBBits = (LPSTR)pDib+sizeof(BITMAPINFOHEADER);
	bmpInfo = (LPBITMAPINFO)pDib;

	::SetDIBitsToDevice(	pDC->m_hDC,			// hDC
							0,					// DestX
							0,					// DestY
							m_VideoSize.cx,		// nDestWidth
							m_VideoSize.cy,		// nDestHeight
							0,					// SrcX
							0,					// SrcY
							0,					// nStartScan
							(WORD)m_VideoSize.cy,	// nNumScans
							lpDIBBits,			// lpBits
							bmpInfo,			// lpBitsInfo
							DIB_RGB_COLORS );	// wUsage
	
}

void CVideo::PaintFrame( int n, CDC* pDC, CSize dessize, int mode )
{
	PaintFrame( n, pDC, CPoint(0,0), dessize, CPoint(0,0), m_VideoSize, mode );
}

void CVideo::PaintFrame( int n, CDC* pDC, CPoint des, CSize dessize, int mode )
{
	PaintFrame( n, pDC, des, dessize, CPoint(0,0), m_VideoSize, mode );
}

void CVideo::PaintFrame( int n, CDC* pDC, CPoint des, CSize dessize, CPoint src, int mode )
{
	PaintFrame( n, pDC, des, dessize, src, m_VideoSize, mode );
}

void CVideo::PaintFrame( int n, CDC* pDC, CPoint des, CSize dessize, CPoint src, CSize srcsize, int mode )
{
	if( !m_bValidate || n > m_nTotalFrame || !m_VideoFrame ) return;

	BYTE* pDib = (BYTE*)AVIStreamGetFrame(m_VideoFrame, n);
	if( !pDib ) return;

	LPSTR    lpDIBBits;          
	BOOL     bSuccess = FALSE;     
	LPBITMAPINFO bmpInfo;
		
	if( m_nBitCount == 8 )
		lpDIBBits = (LPSTR)pDib+sizeof(BITMAPINFOHEADER)+1024;
	else
		lpDIBBits = (LPSTR)pDib+sizeof(BITMAPINFOHEADER);
	bmpInfo = (LPBITMAPINFO)pDib;


	CDC	MemDC;
	MemDC.CreateCompatibleDC( pDC );
	CBitmap bmScreen;
	bmScreen.CreateCompatibleBitmap( pDC, dessize.cx, dessize.cy );

	CBitmap* pBitmap = MemDC.SelectObject( &bmScreen );

	::SetStretchBltMode( MemDC.m_hDC , COLORONCOLOR );

	::StretchDIBits(	MemDC.m_hDC,			// hDC
						0,						// DestX
						0,						// DestY
						dessize.cx,				// nDestWidth
						dessize.cy,				// nDestHeight
						src.x,					// SrcX
						src.y,					// SrcY
						srcsize.cx,				// SrcWidth
						srcsize.cy,				// SrcHeight
						lpDIBBits,              // lpBits
						bmpInfo,				// lpBitsInfo
						DIB_RGB_COLORS, SRCCOPY );// wUsage
	
	pDC->BitBlt( des.x, des.y, dessize.cx, dessize.cy , &MemDC, 0, 0, mode );
	
	MemDC.SelectObject( pBitmap );
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -