📄 video.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 + -