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

📄 video.cpp

📁 一个完整的数字硬盘录像机系统软件
💻 CPP
字号:
// Video.cpp: implementation of the CVideo class.
//
//////////////////////////////////////////////////////////////////////

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

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
CVideo::CVideo(CWnd *pDispWnd)
{
	// 初始化成员变量
	m_bOpened = m_bPaused = m_bPlaying = FALSE;
	m_wDeviceID = 0;
	m_pDispWnd=pDispWnd;
	m_OpenParms.lpstrDeviceType = "MPEGVideo";//设置播放设备为视频播放设备
	m_OpenParms.wDeviceID = 0;
	m_OpenParms.hWndParent = m_pDispWnd->m_hWnd;//将要播放视频文件的主窗口
	m_OpenParms.dwStyle = WS_CHILD | WS_VISIBLE;
}

CVideo::~CVideo()
{
	Close ();
}
//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
BOOL CVideo::Open(CString sFilename)
{
	if(m_bOpened)
	{
	   Close();
       m_bOpened = m_bPaused = m_bPlaying = FALSE;
	}
	// 初始化成员变量
	m_bOpened = m_bPaused = m_bPlaying = FALSE;
	m_wDeviceID = 0;
	// 文件是否存在
	CFileStatus Status;
	if (!CFile::GetStatus (sFilename, Status))
		return FALSE;
	// 打开设备
	m_OpenParms.lpstrElementName=sFilename.GetBuffer(0);
	sFilename.ReleaseBuffer();
	if (mciSendCommand(NULL,MCI_OPEN, MCI_WAIT|MCI_OPEN_TYPE|MCI_OPEN_ELEMENT|MCI_DGV_OPEN_PARENT|MCI_DGV_OPEN_WS, (DWORD)(LPVOID) &m_OpenParms))
		return FALSE;
	m_wDeviceID = m_OpenParms.wDeviceID;
	m_bOpened = TRUE;
	// 将文件长度设置为帧
	MCI_DGV_SET_PARMS SetParms;
	SetParms.dwTimeFormat = MCI_FORMAT_FRAMES;
	if (mciSendCommand (m_wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD)(LPVOID) &SetParms))
	{
		Close ();
		return FALSE;
	}
	// 找到视频文件的开始位置
	mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
	//将播放画面置于主窗口之中
	MCI_DGV_PUT_PARMS PutParms;
	CRect rect;
    m_pDispWnd->GetClientRect(rect);
    PutParms.rc=rect;
	if (mciSendCommand (m_wDeviceID, MCI_PUT, MCI_WAIT | MCI_DGV_PUT_CLIENT | MCI_DGV_PUT_WINDOW | MCI_DGV_RECT, (DWORD)(LPVOID) &PutParms))
	{
		Close ();
		return FALSE;
	}
    MCI_DGV_STATUS_PARMS mciStatus;
	mciStatus.dwItem=MCI_DGV_STATUS_HWND;
	mciSendCommand(m_wDeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)&mciStatus);
	m_hVideoWnd=(HWND)mciStatus.dwReturn;
	return TRUE;
}
//////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////
void CVideo::Close (void)
{
	if (m_bOpened)
	{
		// 停止播放并关闭设备
		if (m_bPlaying || m_bPaused)
			mciSendCommand (m_wDeviceID, MCI_STOP, NULL, NULL);
		mciSendCommand (m_wDeviceID, MCI_CLOSE, NULL, NULL);
		// 清空成员变量
		m_bOpened = m_bPaused = m_bPlaying = FALSE;
		m_wDeviceID = 0;
	}
}
//////////////////////////////////////////////////////////////////////
//获得视频文件窗口的宽度
//////////////////////////////////////////////////////////////////////
int CVideo::GetWidth (void)
{
	if (m_bOpened)
	{
		MCI_DGV_WHERE_PARMS WhereParms;
		if (mciSendCommand (m_wDeviceID, MCI_WHERE, MCI_DGV_WHERE_SOURCE, (DWORD)(LPVOID) &WhereParms))
			return 0;
		return (int) WhereParms.rc.right;
	}
	return 0;
}
//////////////////////////////
//获得视频文件窗口的高度
///////////////////////////////
int CVideo::GetHeight (void)
{
	if (m_bOpened)
	{
		MCI_DGV_WHERE_PARMS WhereParms;
		if (mciSendCommand (m_wDeviceID, MCI_WHERE, MCI_DGV_WHERE_SOURCE, (DWORD)(LPVOID) &WhereParms))
		{
			return 0;
		}
		return (int) WhereParms.rc.bottom;
	}
	return 0;
}
////////////////////////
//
////////////////////////
BOOL CVideo::Play()
{
	if (m_bOpened)
	{
        //int nSpeed=GetSpeed();
		//SetSpeed(6*nSpeed);
		// 如果是视频的尾部则重新开始播放
		if (GetFrame () >= GetFrames ())
			mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
		// 播放
		MCI_DGV_PLAY_PARMS PlayParms;
		PlayParms.dwCallback = NULL;
		PlayParms.dwFrom = GetFrame ();
		DWORD dwFlags = MCI_FROM;
		if (mciSendCommand (m_wDeviceID, MCI_PLAY, dwFlags, (DWORD)(LPVOID) &PlayParms))
			return FALSE;
		m_bPaused = FALSE;
		m_bPlaying = TRUE;
		return TRUE;
	}
	return FALSE;
}
///////////////////////////
//
//////////////////////////
void CVideo::Stop (void)
{
	if (m_bOpened && m_bPlaying)
	{
		mciSendCommand (m_wDeviceID, MCI_STOP, NULL, NULL);
		mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
		m_bPlaying = FALSE;
		m_bPaused = FALSE;
	}
}
///////////////////////////
//
//////////////////////////
void CVideo::Pause( void )
{
	if (m_bOpened && m_bPlaying)
	{
		MCI_DGV_PAUSE_PARMS PauseParms;
		if (mciSendCommand (m_wDeviceID, MCI_PAUSE, 0, (DWORD)(LPVOID) &PauseParms))
			return;
		m_bPaused = TRUE;
	}
}
///////////////////////////
//
//////////////////////////
int CVideo::GetFrames (void)
{
	if (m_bOpened)
	{
		MCI_DGV_STATUS_PARMS StatusParms;
		StatusParms.dwItem = MCI_STATUS_LENGTH;
		if (mciSendCommand (m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms))
			return 0;
		return (int) StatusParms.dwReturn;
	}
	return 0;
}
///////////////////////////
//
//////////////////////////
int CVideo::GetFrame (void)
{
	if (m_bOpened)
	{
		MCI_DGV_STATUS_PARMS StatusParms;
		StatusParms.dwItem = MCI_STATUS_POSITION;
		if (mciSendCommand (m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms))
			return -1;
		return (int) StatusParms.dwReturn;
	}
	return -1;
}
///////////////////////////
//
//////////////////////////
BOOL CVideo::IsPlaying()
{
	if (m_bOpened)
	{
		MCI_DGV_STATUS_PARMS StatusParms;
		StatusParms.dwItem = MCI_STATUS_MODE;
		if (mciSendCommand (m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms))
			return FALSE;
		if (StatusParms.dwReturn == MCI_MODE_PLAY)
		{
			m_bPlaying = TRUE;
			m_bPaused = FALSE;
			return TRUE;
		}
		else if (StatusParms.dwReturn == MCI_MODE_PAUSE)
		{
			m_bPlaying = TRUE;
			m_bPaused = FALSE;
			return TRUE;
		}
		else
		{
			m_bPlaying = FALSE;
			m_bPaused = FALSE;
			return FALSE;
		}
	}
	return FALSE;
}
///////////////////////////
//
//////////////////////////
BOOL CVideo::SeekTo (int nFrame)
{
	if (m_bOpened)
	{
		MCI_SEEK_PARMS SeekParms;
		SeekParms.dwTo = nFrame;
		if (m_bPlaying && !m_bPaused)
			mciSendCommand (m_wDeviceID, MCI_PAUSE, 0, NULL);
		if (mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_TO | MCI_WAIT, (DWORD)(LPVOID) &SeekParms))
			return FALSE;
		if (m_bPlaying && !m_bPaused)
			Play ();
		return TRUE;
	}
	return FALSE;
}
///////////////////////////
//
//////////////////////////
void CVideo::Forward (int nFrames)
{
	if (m_bOpened)
	{
		if (m_bPlaying && !m_bPaused)
			Pause ();
		MCI_DGV_STEP_PARMS StepParms;
		StepParms.dwFrames = nFrames;
		mciSendCommand (m_wDeviceID, MCI_STEP, MCI_DGV_STEP_FRAMES, (DWORD)(LPVOID) &StepParms);
	}
}
///////////////////////////
//
//////////////////////////
void CVideo::Backward(int nFrames)
{
	if (m_bOpened)
	{
		if (m_bPlaying && !m_bPaused)
			Pause ();
		MCI_DGV_STEP_PARMS StepParms;
		StepParms.dwFrames = nFrames;
		mciSendCommand (m_wDeviceID, MCI_STEP, MCI_DGV_STEP_REVERSE | MCI_DGV_STEP_FRAMES, (DWORD)(LPVOID) &StepParms);
	}
}
///////////////////////////
//
//////////////////////////
int CVideo::GetSpeed()
{
	if (m_bOpened)
	{
		MCI_DGV_STATUS_PARMS StatusParms;
		StatusParms.dwItem = MCI_DGV_STATUS_SPEED;
		if (mciSendCommand (m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms))
			return -1;
		return (int) StatusParms.dwReturn;
	}
	return -1;
}
///////////////////////////
//
//////////////////////////
void CVideo::SetSpeed (int nSpeed)
{
	if (m_bOpened)
	{
		MCI_DGV_SET_PARMS SetParms;
		SetParms.dwSpeed = nSpeed;
		mciSendCommand (m_wDeviceID, MCI_SET, MCI_WAIT | MCI_DGV_SET_SPEED, (DWORD)(LPVOID) &SetParms);
	}
}
///////////////////////////
//
//////////////////////////
BOOL CVideo::GetSound()
{
	if (m_bOpened)
	{
		MCI_DGV_STATUS_PARMS StatusParms;
		StatusParms.dwItem = MCI_DGV_STATUS_AUDIO;
		if (mciSendCommand (m_wDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD)(LPVOID) &StatusParms))
			return FALSE;
		if (StatusParms.dwReturn == MCI_ON)
			return TRUE;
		else
			return FALSE;
	}
	return FALSE;
}
///////////////////////////
//
//////////////////////////
void CVideo::SetSound (BOOL bSound)
{
	if (m_bOpened)
	{
		MCI_DGV_SET_PARMS SetParms;
		SetParms.dwAudio = MCI_SET_AUDIO_ALL;
		DWORD dwFlags = MCI_SET_AUDIO;
		if (bSound)
			dwFlags |= MCI_SET_ON;
		else
			dwFlags |= MCI_SET_OFF;
		mciSendCommand (m_wDeviceID, MCI_SET, dwFlags, (DWORD)(LPVOID) &SetParms);
	}
}
///////////////////////////
//
//////////////////////////
void  CVideo::AdjustDispWndRect()
{
	Pause();
	CRect rect;
    m_pDispWnd->GetClientRect(rect);
	MoveWindow(m_hVideoWnd,rect.left,rect.top,rect.right,rect.bottom,TRUE);
	Play();
}

⌨️ 快捷键说明

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