高分求avi播放器源代码(不使用控件)
rt 问题点数:100、回复次数:13Top
1 楼lirb()回复于 2002-06-03 11:56:12 得分 0
可以另外给多100-200分Top
2 楼westboy(雨中漫步)回复于 2002-06-09 14:05:57 得分 0
有个开放源码的MPEG4播放软件
名字忘了Top
3 楼madmanahong(疯子阿虹)回复于 2002-06-09 14:10:24 得分 0
madmanahong@163.comTop
4 楼madmanahong(疯子阿虹)回复于 2002-06-09 14:11:39 得分 0
madmanahong@163.comTop
5 楼qxj82()回复于 2002-06-09 14:24:36 得分 0
qxj@ccermail.netTop
6 楼rbxhome(阿龙)回复于 2002-06-09 20:34:09 得分 20
有MCI比较容易实现的,我用COM技术结合MCI做了一个比较好的,我现在对MCI比较了解,如果有问题可与我联系:QQ:22487534Top
7 楼xunknown(爱你是我一生中理想)回复于 2002-06-09 20:38:46 得分 0
VC编程资源光盘有一个mp3的,全部源文件.我编译过,可以播放!
但是我没有细看,恩,粗看时没有看到有用控件的.
Top
8 楼huqiming(Super)回复于 2002-06-09 20:38:56 得分 10
参考一下msdn中的例子aviview
或者用Directxsdk里的dshow
比较简单的Top
9 楼xunknown(爱你是我一生中理想)回复于 2002-06-09 20:42:04 得分 0
VC编程资源大全光盘有一个mp3的全部源文件.我编译过,ok!
我没有细看,粗看时没有看到有用控件的.Top
10 楼goldolphin(心向天空)回复于 2002-06-09 20:50:33 得分 0
用MCI,那用低级设备函数也可以了。Top
11 楼eastrock(东方之石)回复于 2002-06-09 22:37:47 得分 0
没错。用mci,如果要,我这儿有一个classTop
12 楼summerw()回复于 2002-06-10 09:51:57 得分 70
// DigitalVideo.cpp: implementation of the CDigitalvideo class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
//#include "VideoPlayer.h"
#include "Digitalvideo.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDigitalvideo::CDigitalvideo()
{
// 初始化成员变量
m_Open = m_Pause = m_Playing = FALSE;
m_DeviceID = 0;
}
CDigitalvideo::~CDigitalvideo()
{
Close ();
}
BOOL CDigitalvideo::GetPause ()//是否暂停
{
return m_Pause;
}
BOOL CDigitalvideo::Open (CString Filename, CWnd *pWnd, int left, int top,int width,int height)
{
if (!m_Open){//如果m_Open=false,没有打开设备
// 初始化成员变量
m_Open = m_Pause = m_Playing = FALSE;
m_DeviceID = 0;
// 文件是否存在
CFileStatus Status;
if (!CFile::GetStatus (Filename, Status))
return FALSE;
// 打开设备
MCI_DGV_OPEN_PARMS MCIOpen;
MCIOpen.lpstrDeviceType = "avivideo";//设置播放设备为视频播放设备
MCIOpen.lpstrElementName = (LPSTR) Filename.GetBuffer (0);//文件名
MCIOpen.wDeviceID = NULL;
MCIOpen.hWndParent = pWnd->m_hWnd;//可播放视频文件窗口指针
MCIOpen.dwStyle = WS_CHILD | WS_VISIBLE;
if (mciSendCommand (NULL, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE |
MCI_OPEN_ELEMENT | MCI_DGV_OPEN_PARENT | MCI_DGV_OPEN_WS, (DWORD)(LPVOID) &MCIOpen))
return FALSE;
m_DeviceID = MCIOpen.wDeviceID;
m_Open = TRUE;
// 将文件长度设置为帧
MCI_DGV_SET_PARMS MCISet;
MCISet.dwTimeFormat = MCI_FORMAT_FRAMES;
if (mciSendCommand (m_DeviceID, MCI_SET, MCI_SET_TIME_FORMAT, (DWORD)(LPVOID) &MCISet)){
Close ();
return FALSE;
}
// 找到视频文件的开始位置
mciSendCommand (m_DeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
//将播放画面置于主窗口之中
MCI_DGV_PUT_PARMS MCIPut;
MCIPut.rc.left = left;
MCIPut.rc.top = top;
MCIPut.rc.right = width;
MCIPut.rc.bottom = height;
if (mciSendCommand (m_DeviceID, MCI_PUT, MCI_WAIT | MCI_DGV_PUT_CLIENT |
MCI_DGV_PUT_WINDOW | MCI_DGV_RECT, (DWORD)(LPVOID) &MCIPut)){
Close ();
return FALSE;
}
}
return TRUE;
}
void CDigitalvideo::Close (void)
{
if (m_Open){// 停止播放并关闭设备
if (m_Playing || m_Pause)
mciSendCommand (m_DeviceID, MCI_STOP, NULL, NULL);
mciSendCommand (m_DeviceID, MCI_CLOSE, NULL, NULL);
// 清空成员变量
m_Open = m_Pause = m_Playing = FALSE;
m_DeviceID = NULL;
}
}
//获得视频文件窗口的宽度
int CDigitalvideo::GetWidth (void)
{
if (m_Open){
MCI_DGV_WHERE_PARMS MCIWhere;
if (mciSendCommand (m_DeviceID, MCI_WHERE, MCI_DGV_WHERE_SOURCE,
(DWORD)(LPVOID) &MCIWhere)){
return 0;
}
return (int) MCIWhere.rc.right;
}
return 0;
}
//获得视频文件窗口的高度
int CDigitalvideo::GetHeight (void)
{
if (m_Open){
MCI_DGV_WHERE_PARMS MCIWhere;
if (mciSendCommand (m_DeviceID, MCI_WHERE, MCI_DGV_WHERE_SOURCE,
(DWORD)(LPVOID) &MCIWhere)){
return 0;
}
return (int) MCIWhere.rc.bottom;
}
return 0;
}
BOOL CDigitalvideo::Play (BOOL bLoop, BOOL bFullScreen)
{
if (m_Open){
// 如果是视频的尾部则重新开始播放
if (GetFrame () >= GetFrames ())
mciSendCommand (m_DeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
// 播放
MCI_DGV_PLAY_PARMS MCIPlay;
MCIPlay.dwCallback = NULL;
MCIPlay.dwFrom = GetFrame ();
DWORD dwFlags = MCI_FROM;
if (bLoop)
dwFlags |= MCI_DGV_PLAY_REPEAT;
if (bFullScreen)
dwFlags |= MCI_MCIAVI_PLAY_FULLSCREEN;
if (mciSendCommand (m_DeviceID, MCI_PLAY, dwFlags, (DWORD)(LPVOID) &MCIPlay))
return FALSE;
m_Pause = FALSE;
m_Playing = TRUE;
return TRUE;
}
return FALSE;
}
void CDigitalvideo::Stop (void)
{
if (m_Open && m_Playing){
mciSendCommand (m_DeviceID, MCI_STOP, NULL, NULL);
mciSendCommand (m_DeviceID, MCI_SEEK, MCI_SEEK_TO_START, NULL);
m_Playing = FALSE;
m_Pause = TRUE;
}
}
void CDigitalvideo::Pause( void )
{
if (m_Open ){
MCI_DGV_PAUSE_PARMS MCIPause;
if (mciSendCommand (m_DeviceID, MCI_PAUSE, 0, (DWORD)(LPVOID) &MCIPause))
return;
m_Pause = TRUE;
}
}
int CDigitalvideo::GetFrames (void)
{
if (m_Open){
MCI_DGV_STATUS_PARMS MCIStatus;
MCIStatus.dwItem = MCI_STATUS_LENGTH;
if (mciSendCommand (m_DeviceID, MCI_STATUS, MCI_WAIT |
MCI_STATUS_ITEM, (DWORD)(LPVOID) &MCIStatus))
return 0;
return (int) MCIStatus.dwReturn;
}
return 0;
}
int CDigitalvideo::GetFrame (void)
{
if (m_Open){
MCI_DGV_STATUS_PARMS MCIStatus;
MCIStatus.dwItem = MCI_STATUS_POSITION;
if (mciSendCommand (m_DeviceID, MCI_STATUS, MCI_WAIT |
MCI_STATUS_ITEM, (DWORD)(LPVOID) &MCIStatus))
return -1;
return (int) MCIStatus.dwReturn;
}
return -1;
}
BOOL CDigitalvideo::IsPlaying ()
{
if (m_Open)
{
MCI_DGV_STATUS_PARMS MCIStatus;
MCIStatus.dwItem = MCI_STATUS_MODE;
if (mciSendCommand (m_DeviceID, MCI_STATUS, MCI_WAIT |
MCI_STATUS_ITEM, (DWORD)(LPVOID) &MCIStatus))
return FALSE;
if (MCIStatus.dwReturn == MCI_MODE_PLAY)
{
m_Playing = TRUE;
m_Pause = FALSE;
return TRUE;
}
else if (MCIStatus.dwReturn == MCI_MODE_PAUSE)
{
m_Playing = TRUE;
m_Pause = FALSE;
return TRUE;
}
else
{
m_Playing = FALSE;
m_Pause = FALSE;
return FALSE;
}
}
return FALSE;
}
BOOL CDigitalvideo::SeekTo (int nFrame)
{
if (m_Open){
MCI_SEEK_PARMS MCISeek;
MCISeek.dwTo = nFrame;
if (m_Playing && !m_Pause)
mciSendCommand (m_DeviceID, MCI_PAUSE, 0, NULL);
if (mciSendCommand (m_DeviceID, MCI_SEEK, MCI_TO |
MCI_WAIT, (DWORD)(LPVOID) &MCISeek))
return FALSE;
if (m_Playing && !m_Pause)
Play ();
return TRUE;
}
return FALSE;
}
void CDigitalvideo::Forward (int nFrames)
{
if (m_Open){
if (m_Playing && !m_Pause)
Pause ();
MCI_DGV_STEP_PARMS MCIStep;
MCIStep.dwFrames = nFrames;
mciSendCommand (m_DeviceID, MCI_STEP, MCI_DGV_STEP_FRAMES,
(DWORD)(LPVOID) &MCIStep);
}
}
void CDigitalvideo::Backward (int nFrames)
{
if (m_Open){
if (m_Playing && !m_Pause)
Pause ();
MCI_DGV_STEP_PARMS MCIStep;
MCIStep.dwFrames = nFrames;
mciSendCommand (m_DeviceID, MCI_STEP, MCI_DGV_STEP_REVERSE |
MCI_DGV_STEP_FRAMES, (DWORD)(LPVOID) &MCIStep);
}
}
int CDigitalvideo::GetSpeed (void)
{
if (m_Open){
MCI_DGV_STATUS_PARMS MCIStatus;
MCIStatus.dwItem = MCI_DGV_STATUS_SPEED;
if (mciSendCommand (m_DeviceID, MCI_STATUS, MCI_WAIT |
MCI_STATUS_ITEM, (DWORD)(LPVOID) &MCIStatus))
return -1;
return (int) MCIStatus.dwReturn;
}
return -1;
}
void CDigitalvideo::SetSpeed (int nSpeed)
{
if (m_Open){
MCI_DGV_SET_PARMS MCISet;
MCISet.dwSpeed = nSpeed;
mciSendCommand (m_DeviceID, MCI_SET, MCI_WAIT |
MCI_DGV_SET_SPEED, (DWORD)(LPVOID) &MCISet);
}
}Top
13 楼summerw()回复于 2002-06-10 09:52:17 得分 0
#if !defined(AFX_VIDEO_H__B35A40D1_7DB7_11D3_860F_F6E44D6C9F3C__INCLUDED_)
#define AFX_VIDEO_H__B35A40D1_7DB7_11D3_860F_F6E44D6C9F3C__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <afxwin.h>
#include <mmsystem.h>
#include <mciavi.h>
#include <digitalv.h>
class CDigitalvideo //处理视频类
{
public:
CDigitalvideo();//构造函数
virtual ~CDigitalvideo();//构析函
//视频操作函数
//函数功能-打开视频文件,pWnd--将要包含视频播放窗口的主窗口,
//left、top-视频播放窗口在主窗口中的左上角坐标
BOOL Open (CString, CWnd *pWnd, int left = 0, //函数功能-打开视频文件
int top = 0,int width = 20,int height = 20);
void Close (void);//关闭视频文件
BOOL Play (BOOL bLoop = FALSE, BOOL bFullScreen = FALSE);//函数功能-播放视频文件
void Stop (void); //停止播放
void Pause (void); //暂停播放
void Forward (int);//快进
void Backward (int);//后退
BOOL SeekTo (int);//跳到某一位置,处于暂停状态
//视频状态还回函数
int GetWidth (void);//得到视频宽度
int GetHeight (void);//获得视频高度
int GetFrames (void);//获得视频总帧数
int GetFrame (void);//获得当前帧
BOOL IsPlaying ();//是否正在播放
int GetSpeed (void);//获得播放速度
void SetSpeed (int);//设置播放速度
BOOL GetPause (void);//是否暂停
private://数据成员
BOOL m_Open;//是否有媒体文件打开
BOOL m_Pause;//是否暂停
BOOL m_Playing;//是否正在播放
WORD m_DeviceID;//播放设备ID
};
#endif // !defined(AFX_VIDEO_H__B35A40D1_7DB7_11D3_860F_F6E44D6C9F3C__INCLUDED_)
Top
14 楼summerw()回复于 2002-06-10 09:54:36 得分 0
用这个类的时候别忘了连接winmm.libTop




