用VC++5.0播放AVI文件的两种方法
用Visual C++开发的面向对象的多媒体应用软件可编译成
真正的EXE可执行文件,无需附加动态库和控件,如VBX和OCX
等。有两种方法可以实现这个功能,一种方法是使用底层AVI
文件函数,从AVI视频文件中读取视频流;另一种是使用现有的
Video forin dows SDK的窗口类MCIWnd(媒体控制界面窗)。
本文将介绍基于VC++5.0环境下,开发播放AVI文件的两种方
法,这两种方法略作改动, 还可为应用程序播放其它的媒体文
件(如声音文件等)。
一. VC++5.0可通过调用VFW.H和VFW32.LIB和MCIWnd API
函数来创建MCIWnd窗口实现AVI多媒体文件的调用和播放。
1. MCIWnd是一个控制多媒体设备(如MIDI、数字视频、VCR
以及CD音频设备等)的窗口类,要制作多媒体封面只需创建该
类的一个窗口,然后向它发送打开和控制MCI设置的消息。
MCIWnd窗口底部的播放条(Playbar )包括一个播放/暂停
(Play/Pause)按键、一个显示菜单(menu)按键和一个用于报告
播放进程的标尺。在播放窗口的任何地方单击鼠标右键都会显
示一个弹出菜单, 用于调整MCIWnd窗口的大小、MCI多媒体文
件的声音、速度的大小、MCI命令等。而且在父窗口外单击鼠
标右键可关闭和清除MCIWnd窗口,单击鼠标左键则可恢复
MCIWnd窗口。
2.编程步骤
首先在VC++5.0中建立一个名为playavi项目( project)。
然后,通过调用VC++5.0的类库,从而建立OnLButtonDown()和
OnRButtonDown()函数。在相应的视文件(playaviView.cpp)
开始处加入一行#include "vfw.h",在显示类的构造函数中加
入一行" m_mmWnd=NULL",在相应的视文件的头文件中加入:
private:
HWND m_mmWnd;
BOLL m_pause;
在源文件playavi.cpp相应的函数中输入如下代码:
// CPlayaviView message handlers
void CPlayaviView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//加入我的代码
CString filename("/filename.avi");//键入文件路径及文件名
if(m_mmWnd==NULL)
m_mmWnd=MCIWndCreate(this->GetSafeHwnd(),AfxGetInstanceHandle(),
WS_CHILD|WS_CAPTION|WS_VISIBLE|MCIWNDF_SHOWPOS|MCIWNDF_SHOWNAME,
//以上为开关选项
filename);// filename为要播放的avi文件名
else
{
//设置播放句柄
if(m_pause)
{
MCIWndPlay(m_mmWnd);
m_pause=FALSE;
}
//设置中断句柄
else
{
MCIWndPause(m_mmWnd);
m_pause=TRUE;
}
}
//结束我的代码
CView::OnLButtonDown(nFlags, point);
}
void CPlayaviView::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//加入我的代码
if (m_mmWnd!=NULL)
{
MCIWndDestroy(m_mmWnd);
m_mmWnd=NULL;
}
//结束我的代码
CView::OnRButtonDown(nFlags, point);
}
最后,在Project Setting对话框的Link表中将VFW32·LIB加
入Object/Library Modules对话框,最后编译该项目,即可播放了。
二. 在VC++5.0创建MCIWnd一个窗口,然后向它发送打开和控制MCI
设置的消息,也可实现播放AVI文件。
1.编辑Stdafx.h
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
#if !defined(AFX_STDAFX_H__A851EC08_00FE_11D2_B7EF_00C0DF81AC80__INCLUDED_)
#define AFX_STDAFX_H__A851EC08_00FE_11D2_B7EF_00C0DF81AC80__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows
headers
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <vfw.h>
#pragma comment(lib,"vfw32.lib")
#include <afxdisp.h> // MFC OLE automation classes
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>
// MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations
immediately
//before the previous line.
#endif
// !defined(AFX_STDAFX_H__A851EC08_00FE_11D2_B7EF_00C0DF81AC80__INCLUDED_)
2.编辑CExampleApp::InitInstance()
注册MCIWnd窗口类,打开MCIWnd窗口,并播放AVI文件,最后关闭
MCIWnd窗口,然后开始应用程序的常规初始化。
BOOL CAApp::InitInstance()
{
// CG: The following block was added by the Splash Screen
component.
{
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
}
// CG: The following block was added by the Splash Screen
component.
{
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
}
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
//加入我的代码
if(!MCIWndRegisterClass())//注册MCIWnd窗口类
return FALSE;
HWND m_hAVI;//定义一个播放AVI文件的窗口句柄
m_hAVI=MCIWndCreate(NULL,AfxGetInstanceHandle(),
WS_VISIBLE|WS_POPUP,NULL);//创建MCIWnd窗口
if(m_hAVI==NULL)
return FALSE;
CString filename="/filename.avi");//键入文件路径及文件名
if(filename.GetLength()>0)
{
MCIWndOpen(m_hAVI,(LPCSTR)filename,0);//打开设备文件
if(MCIWndUseTime(m_hAVI)!=0)
//设置MCI时间格式
return FALSE;
long PlayTime=MCIWndGetLength(m_hAVI);
//获得AVI文件的播放时间长度
MCIWndPlay(m_hAVI);//播放AVI影视文件
::Sleep(PlayTime);//进程休眠
MCIWndDestroy(m_hAVI);//关闭MCI窗口
}
//结束我的代码
//开始常规初始化
#ifdef _AFXDLL
Enable3dControls();
// Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic();
// Call this when linking to MFC statically
#endif
// Change the registry key under which our settings are stored.
// You should modify this string to be something appropriate
// such as the name of your company or organization.
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
LoadStdProfileSettings();
// Load standard INI file options (including MRU)
// Register the application`s document templates. Document
templates
// serve as the connection between documents, frame windows and
//views.
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CADoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CAView));
AddDocTemplate(pDocTemplate);
// Parse command line for standard shell commands, DDE, file open
//CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// The one and only window has been initialized, so show and update
//it.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
三. 结束语
以上两种方法,笔者在VC++5.0中已调试通过。只要略作改动, 它
们还可为应用程序播放其它的多媒体文件(如声音文件等)。亲爱的读
者,您不妨一试!
用VC++5.0播放AVI文件的两种方法相关推荐
- C#读写txt文件的两种方法介绍[转]
C#读写txt文件的两种方法介绍 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出 ...
- 文字转语音文件的两种方法
文件转语音文件的两种方法.小伙伴们在日常的工作.学习或是生活当中,是否遇到过以下这种情况.在工作中每天要阅读大量文件资料,在学习中每天要阅读各种课文,在生活中也会观看各种小说.但是长时间的用眼阅读,就 ...
- linux实现复制文件的两种方法
分享在linux系统下拷贝文件的两种方法: 1 使用系统调用的read和write实现文件拷贝: #include <stdio.h> #include <sys/types.h&g ...
- java遍历文件和归类_java读取文件的两种方法:java.io和java.lang.ClassLoader
java读取文件的两种方法:java.io和java.lang.ClassLoader 什么时候使用java.io,什么时候使用java.lang.ClassLoader呢? (注:要是之前读xml文 ...
- HTML5动态加载资源方式,动态加载JavaScript文件的两种方法
这篇文章主要为大家详细介绍了动态加载JavaScript文件的两种方法,感兴趣的小伙伴们可以参考一下 第一种便是利用ajax方式,把script文件代码从背景加载到前台,而后对加载到的内容经过eval ...
- 导入mdf文件的两种方法
导入mdf文件的两种方法: 1: 在企业管理器里面的菜单 操作->所有任务->附加数据库里面,根据需求填写就搞定了. 2:在查询分析器里执行如下语句 exec sp_attach_db ' ...
- 合并BIN文件的两种方法
合并BIN文件的两种方法 在单片机的开发过程中,经常需要将两个单独的BIN文件合并成一个文件,方便烧写和生产.下面结合STM32的IAP Bootloader Code和Application Cod ...
- 编辑PDF文件的两种方法
PDF文件具备较好的稳定性.兼容性,在日常工作中的应用非常广泛,但想要编辑文件内容就不那么容易了,下面来说说编辑PDF文件的两种方法. 方法一: 我们知道,查看PDF文件只需要阅读器就可以了,如果想对 ...
- linux启动sh文件命令,Linux 运行 .sh 文件的两种方法
Linux 运行 .sh 文件的两种方法 文章作者:网友投稿 发布时间:2010-06-15 13:31:16 来源:网络 一个中等水平的Linux用户一定少不了经常执行.sh文件,当然了,你可以在图 ...
- elf格式转换为hex格式文件的两种方法
这周工作终于不太忙了,可以写点笔记总结一下了. 之前的文章如何在Keil-MDK开发环境生成Bin格式文件,介绍了如何在Keil开发环境使用fromelf软件,将生成的axf文件转换为bin文件,这次 ...
最新文章
- STC单片机的命名规则
- 销售易移动CRM助力制造业转型智能制造
- 上传ML模型,一键可视化,终于能看懂神经网络到底在干啥了
- 开辟与退出一个新的栈帧常用的汇编语言指令
- MySQL buffer pool中的三种链
- Linux中基础指令
- 2020年阴阳师服务器维护,2020阴阳师2月19日更新官方公告及内容汇总
- python下绘制叠加区域图和叠加柱状图
- 聊聊汽车智能化时代的ASIL
- 只需10行代码就能对Excel文件进行批量去重~
- 如何让一个PNG图片背景透明
- 如何用软件测试交易系统的胜率,通达信官网程序交易测试
- 《软件工程之美》打卡第六周,春招我借这份PDF的复习思路
- 2018春招京东实习编程题解
- wxpython 界面 加密系统
- JAVASE面向对象基础
- Hexo-Theme-Buer主题修改介绍
- 教你用Canvas将图片截成圆图
- Apple Pay 在线远程支付
- SpringCloud微服务组件:Sentinel限流熔断
热门文章
- 原谅我,无法刻骨铭心地记住你
- 微博小尾巴自定义去掉android,新浪微博小尾巴怎么改 自定义微博小尾巴修改教程...
- mysql dump 拒绝访问_mysqldump访问被拒绝
- Codeforces 1027C. Minimum Value Rectangle
- 计算机毕业设计Python+Django的医院排队叫号系统(源码+系统+mysql数据库+Lw文档)
- linux挂载VMFS硬盘,挂载ESXi服务器VMFS存储卷
- h264和aac 封装成flv
- 手写一个简单的mybatis
- 计算机知识学习——window10台式电脑显示未插入扬声器或耳机解决方案
- php网站做分享到朋友圈,PHP实现微信分享朋友圈