📄 playview.cpp
字号:
WORD flags;
//打开设备驱动
m_hVFDrv = OpenDriver (L"av8api.dll", NULL, NULL);
if (!m_hVFDrv)
{
MessageBox("Can't OpenDriver()");
return -1;
}
//检查是否有设备驱动可用,如有,将打开的设备与驱动程序关联起来
if (!HVFAssign(m_hVFDrv, 0))
{
MessageBox("没有合适的视频设备!");
return -1;
}
//锁定设备
HVFLock(m_hVFDrv, VF_CAP_ALL);
flags = VF_FLAG_MPEG | VF_FLAG_ENCODE | VF_FLAG_OUTBUF;
//打开流数据
m_bStream = static_cast<BYTE> (HVFOpen(m_hVFDrv, flags,
reinterpret_cast<unsigned long>(MyCallBack)));
//配置流数据的编码信息
InitEncodeVideoVxD();
InitEncodeAudioVxD();
//开始采集数据
if (m_bStream)
HVFRecord(m_hVFDrv, m_bStream, NULL, NULL);
return 0;
}
void CPlayView::ClearDriver()
{
//将流数据的大小置为0
m_bStream = 0;
if (m_hVFDrv)
{
//停止采集数据
HVFStop(m_hVFDrv, m_bStream);
//关闭流数据
HVFClose(m_hVFDrv, m_bStream);
//释放设备
HVFUnlock(m_hVFDrv, VF_CAP_ALL);
//关闭设备驱动
CloseDriver(m_hVFDrv, NULL, NULL);
//将驱动句柄置为0
m_hVFDrv = 0;
//采集标志设为FALSE
m_Capture=FALSE;
}
}
//配置视频流的编码信息
void CPlayView::InitEncodeVideoVxD()
{
DWORD dwValue;
WORD wWidth, wHeight;
wWidth = 352;
wHeight = 288;
dwValue = MAKELONG(wWidth, wHeight);
//设置视频的输出大小,取MAKELONG(352, 288)
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_OUTPUTSIZE, dwValue);
wWidth = (wWidth * 45) / 44;
dwValue = MAKELONG(wWidth, wHeight);
//设置视频的输入大小,取MAKELONG(360, 288)
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_INPUTSIZE, dwValue);
//设置视频的比特率,取1152000bits/s
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_BITRATE, BITRATE_DEFAULT);
//设置视频帧速,25帧/s
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_RATE, VF_FLAG_VID_25);
//设置MPEG压缩的I帧间隔,取15
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_IINTERVAL, IINTERVAL_DEFAULT);
//设置MPEG压缩的P帧间隔,取3
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_BINTERVAL, PINTERVAL_DEFAULT);
//设置视频的制式,采用PAL制式
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_MODE, VF_FLAG_VID_PAL);
//设置视频的输入源的类型,采用混合类型
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_SOURCE, VF_FLAG_VID_COMPOSITE);
//设置视频的压缩算法,采用MPEG编码
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_ALGORITHM, VF_FLAG_VID_MPEG);
//设置视频的亮度
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_BRIGHTNESS, BRIGHTNESS_DEFAULT);
//设置视频的对比度
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_CONTRAST, CONTRAST_DEFAULT);
//设置视频的色调
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_HUE, HUE_DEFAULT);
//设置视频的饱和度
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_VID_SATURATION, SATURATION_DEFAULT);
}
void CPlayView::DiskSpace(TCHAR sDriver)
{//检查磁盘空间
struct _diskfree_t diskfree;
int nDriver =sDriver-'A'+1;
if (_getdiskfree(nDriver, &diskfree) == 0)
{
FreeDiskSpace.Format("硬盘%c剩余:%luMB",sDriver,
(DWORD)diskfree.avail_clusters *
(DWORD)diskfree.sectors_per_cluster *
(DWORD)diskfree.bytes_per_sector / ((DWORD)1024L*(DWORD)1024L));
}
else
return;
}
void CPlayView::OnCaptureSave()
{
// TODO: Add your command handler code here
CString strCaptureSave;
TCHAR Driver;
CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CFileDialog FileDlg(TRUE,NULL,"temp",NULL,"mpeg文件(*.mpg)|*.mpg|AVI文件(*.avi)|*.avi");
FileDlg.m_ofn.lpstrInitialDir="c:\\temp";
CStopModeDlg StopModeDlg;
FileDlg.m_ofn.lpstrTitle="指定采集文件名";
if(FileDlg.DoModal()==IDOK)
{
//选择采集文件
CapFileName=FileDlg.GetPathName();
Driver=CapFileName.GetAt(0);
strCaptureSave.Format("采集到:%s",CapFileName);
//检查磁盘剩余空间
DiskSpace(Driver);
CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
pFrame->m_wndStatusBar.SetPaneText(1,strCaptureSave);
pFrame->m_wndStatusBar.SetPaneText(2,FreeDiskSpace);
//选择自动停止采集方式
if(StopModeDlg.DoModal()==IDOK)
{
if(StopModeDlg.m_SizeCheck)
{//选择根据文件大小停止
sscanf(StopModeDlg.m_size,"%f",&m_size);
m_SizeCheck=StopModeDlg.m_SizeCheck;
}
if(StopModeDlg.m_TimeCheck)
{//选择根据采集时间停止
sscanf(StopModeDlg.m_time,"%d",&m_time);
m_TimeCheck=StopModeDlg.m_TimeCheck;
}
}
}
}
void CPlayView::OnBeginCapture()
{
// TODO: Add your command handler code here
DWORD dwFlags = 0;
RECT Srct,Erct,Prct;
int width;
UINT Sid;
UINT SStyle;
//如果当前不在实时发送数据而且不在采集,
//对设备进行初始化,开始采集数据
if((!m_RealSend)&&(!m_Capture))
if(InitDriver()<0)
return;
//采集标志设为TRUE
m_Capture=TRUE;
LPSTR caFileName=CapFileName.GetBuffer(_MAX_PATH);
CapFileName.ReleaseBuffer();
dwFlags = MMIO_CREATE | MMIO_WRITE;
//打开采集文件
hmmioOutput = mmioOpen(caFileName, (LPMMIOINFO)NULL, dwFlags);
//在状态栏中显示相关信息
CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
pFrame->m_wndStatusBar.SetPaneText(0,"");
pFrame->m_wndStatusBar.GetPaneInfo(0,Sid,SStyle,width);
::GetClientRect(pFrame->m_wndStatusBar.m_hWnd,&Prct);
Srct.left=10;
Srct.top=4;
Srct.right=width/2-20;
Srct.bottom=Prct.bottom-1;
Erct.left=width/2;
Erct.top=4;
Erct.right=width-10;
Erct.bottom=Prct.bottom-1;
m_static.Create(_T("已采集(时:分:秒)"),WS_CHILD|WS_VISIBLE|SS_LEFT,
Srct,&pFrame->m_wndStatusBar,ID_STATIC);
m_static.SetFont(&m_font);
m_edit.Create(ES_CENTER|WS_BORDER|WS_VISIBLE,Erct,&pFrame->m_wndStatusBar,ID_EDIT);
m_edit.SetWindowText("00:00:00");
//采集定时器标志设为TRUE
m_TCapture=TRUE;
//设定计时器
SetTimer(ID_TIMER,1000,NULL);
}
void CPlayView::OnStopCapture()
{
//关闭计时器
KillTimer(ID_TIMER);
//采集定时器标志设为FALSE
m_TCapture=FALSE;
//如果现在不在实时发送数据,
//停止采集数据,并关闭相关设备
if(!m_RealSend)
ClearDriver();
//关闭采集文件
FILE_CLOSE(hmmioOutput);
Ts=CTimeSpan(0,0,0,0);
m_static.DestroyWindow();
m_edit.DestroyWindow();
CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
pFrame->m_wndStatusBar.SetPaneText(0,"停止采集");
}
void CPlayView::OnPauseCapture()
{
//关闭计时器
KillTimer(ID_TIMER);
//采集计时器标志设为FALSE
m_TCapture=FALSE;
//暂停采集
HVFPause(m_hVFDrv, m_bStream);
CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
pFrame->m_wndStatusBar.SetPaneText(0,"暂停采集");
}
void CPlayView::OnResumeCapture()
{
// TODO: Add your command handler code here
//继续采集
HVFResume(m_hVFDrv, m_bStream);
//采集计时器标志设为TRUE
m_TCapture=TRUE;
//设定计时器
SetTimer(ID_TIMER,1000,NULL);
CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
pFrame->m_wndStatusBar.SetPaneText(0,"");
}
void CPlayView::OnOpenPlayfile()
{
CString FTemp;
CFileDialog dlg(TRUE,NULL,NULL,NULL,"mpeg文件(*.mpg)|*.mpg|AVI文件(*.avi)|*.avi");
dlg.m_ofn.lpstrTitle="打开多媒体文件";
//dlg.m_ofn.lpstrInitialDir="c:\\Windows\\Temp";
CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
if(dlg.DoModal()==IDOK)
{
Fname=dlg.GetPathName();
FTemp.Format("播放:%s",Fname);
pFrame->m_wndStatusBar.SetPaneText(0,"停止");
pFrame->m_wndStatusBar.SetPaneText(1,FTemp);
}
}
void CPlayView::OnPlayfile()
{
// TODO: Add your command handler code here
RECT Srct,Prct;
int width;
UINT Sid;
UINT SStyle;
CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
if(!pVideoPlay)
pVideoPlay=new CVideoPlay(this->m_hWnd);
pFrame->m_wndStatusBar.SetPaneText(0,"播放");
pFrame->m_wndStatusBar.GetPaneInfo(0,Sid,SStyle,width);
::GetClientRect(pFrame->m_wndStatusBar.m_hWnd,&Srct);
Prct.left=40;
Prct.top=4;
Prct.right=width;
Prct.bottom=Srct.bottom-1;
m_prog.Create(PBS_SMOOTH,Prct,&pFrame->m_wndStatusBar,ID_PROGRESS);
pVideoPlay->PlayFromFile(Fname);
m_prog.SetRange(0,(int)pVideoPlay->tLength);
m_prog.ShowWindow(SW_SHOW);
m_TPlayFile=TRUE;
SetTimer(ID_TIMER,1000,NULL);
}
LRESULT CPlayView::OnPlayOver(WPARAM wParam,LPARAM lParam)
{
int status;
status=pVideoPlay->PlayOver();
if(status==0)
{
KillTimer(ID_TIMER);
m_prog.DestroyWindow();
CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
pFrame->m_wndStatusBar.SetPaneText(0,"停止");
Pos=0;
Ts=CTimeSpan(0,0,0,0);
m_TPlayFile=FALSE;
}
return 0;
}
void CPlayView::OnFileStop()
{
// TODO: Add your command handler code here
KillTimer(ID_TIMER);
m_prog.DestroyWindow();
CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
pFrame->m_wndStatusBar.SetPaneText(0,"停止");
Pos=0;
Ts=CTimeSpan(0,0,0,0);
m_TPlayFile=FALSE;
RELEASE_CVIDEOPLAY;
}
void CPlayView::OnRealplay()
{
// TODO: Add your command handler code here
int i,MenuCount;
CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
pVideoPlay=new CVideoPlay(this->m_hWnd);
pVideoPlay->RealPlay();
pFrame->m_wndStatusBar.SetPaneText(0,"实时播放");
pFrame->m_wndStatusBar.SetPaneText(1,"");
CMenu* pSubMenu=PopMenu.GetSubMenu(0);
MenuCount=pSubMenu->GetMenuItemCount();
for(i=0;i<2;i++)
pSubMenu->EnableMenuItem(i,MF_ENABLED|MF_BYPOSITION);
}
void CPlayView::OnRealStop()
{
// TODO: Add your command handler code here
CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
pFrame->m_wndStatusBar.SetPaneText(0,"");
RELEASE_CVIDEOPLAY;
}
void CPlayView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CTimeSpan TsAdd(1);
Ts=TsAdd+Ts;
if(m_TPlayFile)
{
CString s1 =Ts.Format("已播放:%H:%M:%S");
Pos=Pos+1;
m_prog.SetPos(Pos);
CDC* pControlDC=m_prog.GetDC();
CFont* pOldFont = (CFont*) pControlDC->SelectObject(&m_font);
//CPen* pOldPen =(CPen*) pControlDC->SelectObject(&Wpen);
int iOld = pControlDC->GetBkMode();
int iOldMode = pControlDC->GetROP2();
pControlDC->SetROP2(R2_XORPEN);
CRect rc;
m_prog.GetClientRect(&rc);
pControlDC->SetBkMode(TRANSPARENT);
m_prog.Invalidate();
m_prog.UpdateWindow();
pControlDC->DrawText(s1, &rc, DT_CENTER | DT_VCENTER);
pControlDC->SelectObject(pOldFont);
pControlDC->SetROP2(iOldMode);
pControlDC->SetBkMode(iOld);
m_prog.ReleaseDC(pControlDC);
}
if(m_TCapture)
{
CString s2 =Ts.Format("%H:%M:%S");
m_edit.SetWindowText(s2);
if(m_TimeCheck)
{
m_TimeIndex++;
if(m_TimeIndex==m_time+1)
{
OnStopCapture();
MessageBox("采集时间到,停止采集");
m_TimeCheck=FALSE;
m_TimeIndex=0;
}
}
}
CView::OnTimer(nIDEvent);
}
void CPlayView::OnPausePlay()
{
// TODO: Add your command handler code here
pVideoPlay->PausePlay();
KillTimer(ID_TIMER);
CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
pFrame->m_wndStatusBar.SetPaneText(0,"暂停");
}
void CPlayView::OnResumePlay()
{
// TODO: Add your command handler code here
pVideoPlay->ResumePlay();
SetTimer(ID_TIMER,1000,NULL);
CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
pFrame->m_wndStatusBar.SetPaneText(0,"播放");
}
void CPlayView::InitEncodeSystemVxD()
{
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_STM_TYPE, VF_FLAG_MPGSYS);
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_STM_ENCODEMODE, VF_FLAG_STM_NORMAL);
}
/////////////////////////////////////////////////////////////////////////////
// CMyEdit
IMPLEMENT_DYNAMIC(CMyEdit,CEdit)
CMyEdit::CMyEdit()
{
m_clrFont =RGB(0 , 255 , 0) ; // yellow text
m_clrBack=RGB(0 , 0 , 0) ; // blue background
m_brush.CreateSolidBrush(m_clrBack);
m_font.CreatePointFont(90, "宋体");
}
CMyEdit::~CMyEdit()
{
}
BEGIN_MESSAGE_MAP(CMyEdit, CEdit)
//{{AFX_MSG_MAP(CMyEdit)
ON_WM_CREATE()
ON_WM_CTLCOLOR_REFLECT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyEdit message handlers
int CMyEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CEdit::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
SetFont(&m_font);
return 0;
}
HBRUSH CMyEdit::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: Change any attributes of the DC here
pDC->SetTextColor (m_clrFont);
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)m_brush.GetSafeHandle ();
}
//配置音频流的编码信息
void CPlayView::InitEncodeAudioVxD()
{
DWORD dwValue;
//设置音频的采样率,取默认值44100 kHz
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_AUD_SAMPLE, SAMPLE_RATE_DEFAULT);
//设置音频的比特率,取默认值224000bits/s
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_AUD_BITRATE, BIT_RATE_DEFAULT);
dwValue=VF_FLAG_AUD_MPEG;
dwValue=(dwValue<<16)+VF_FLAG_AUD_NONE;
//设置音频的压缩算法,采用MPEG编码
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_AUD_ALGORITHM, dwValue);
//设置音频方式,为立体声
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_AUD_MODE, MODE_DEFAULT);
//设置音频的音量大小,取默认值100
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_AUD_VOLUME, VOLUME_DEFAULT);
//设置音频电平,取默认值0
HVFSet(m_hVFDrv, m_bStream, VF_INDEX_AUD_GAIN, GAIN_DEFAULT);
}
BOOL CPlayView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
// Create a pruple brush.
CBrush Brush (RGB (0,0,255) );
CBrush* pOldBrush = pDC->SelectObject(&Brush);
CRect reClip ;
pDC->GetClipBox(&reClip);
pDC->PatBlt (reClip.left , reClip.top ,
reClip.Width ( ) , reClip.Height ( ) , PATCOPY );
pDC->SelectObject (pOldBrush );
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -