请教关于AVI视频的显示播放

yiming07 2010-03-21 09:41:28
CWnd *pWnd=AfxGetMainWnd()->GetDlgItem(IDC_BMPSHOW); // 得到预示窗口指针

CRect rect;
pWnd ->GetWindowRect(&rect); // 得到窗口大小

m_hPlayWnd = MCIWndCreate(pWnd->GetSafeHwnd(), AfxGetInstanceHandle(),WS_CHILD|WS_VISIBLE|MCIWNDF_NOOPEN,strFile);

// MCIWndOpen(m_hPlayWnd, strFile, NULL);
MCIWndPlay(m_hPlayWnd);
我想打开一个AVI文件显示到对话框中,使用了如上代码,但是运行过程中视频没有流利的播放(这个视频是我自己用摄像头录得无压缩的AVI文件),可是我再运行另外一个从网上下的经过XVID编码的电影时可以流畅播放,我想请问一下这是怎么回事?应该怎样改进代码?顺便问一下,如何设置代码能将视频文件的显示铺满整个显示区域?谢谢各位
...全文
169 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
leechrockgames 2010-03-23
  • 打赏
  • 举报
回复

#include"ENmultimedia.h"
bool ENmultimedia::LHxxLOAD_MULTIMEDIA(char *name,char *Tname)
{
iter=LHxxITERATOR_LIST(Tname,"NO");
if(iter!=NULL)
{
return S_FALSE;
}
char ss[100]="";
ENmultimediaData temp;
strcpy(temp.Name,Tname);
temp.WavOb=NULL;
temp.MultOb=new MultimediaData();
// DirectShow interfaces
temp.MultOb->pGB = NULL;
temp.MultOb->pMC = NULL;
temp.MultOb->pME = NULL;
temp.MultOb->pVW = NULL;
temp.MultOb->pBA = NULL;
temp.MultOb->pBV = NULL;
temp.MultOb->pMS = NULL;
temp.MultOb->pMP = NULL;
temp.MultOb->pFS = NULL;
temp.MultOb->g_bAudioOnly=FALSE;
temp.MultOb->g_bFullscreen=FALSE;
temp.MultOb->g_dwGraphRegister=0;
temp.MultOb->g_psCurrent=Stopped;
temp.MultOb->g_lVolume=VOLUME_FULL;
temp.WavOb=NULL;
HRESULT hr;
// If no filename specified by command line, show file open dialog
if(temp.MultOb->FileName[0]== L'\0')
{
TCHAR szFilename[MAX_PATH];
// If no filename was specified on the command line, then our video
// window has not been created or made visible. Make our main window
// visible and bring to the front to allow file selection.
//ShowWindow(hWnd, SW_SHOWNORMAL);
SetForegroundWindow(hWnd);
strcpy(szFilename,name);
// This sample does not support playback of ASX playlists.
// Since this could be confusing to a user, display a warning
// message if an ASX file was opened.
if (_tcsstr((_tcslwr(szFilename)), TEXT(".asx")))
{
return false;
}
// This sample does not offer support for Windows Media playback.
// The PlayWndASF and Jukebox samples demonstrate how to add a
// Windows Media certificate handler to your app, along with giving
// example code to load and connect the ASF Reader source filter.
// To prevent problems with using the older (default) ASF reader here,
// simply disable loading of ASF,WMA,WMV files.
if (IsWindowsMediaFile(szFilename))
{
_stprintf(ss,"(加载出错<不是所支持的文件类型>)LHxxLOAD_MULTIMEDIA:%s",name);
MessageBox(hWnd, ss, "error sound", MB_OK);
return false;
}
lstrcpy(temp.MultOb->FileName, szFilename);
}
// Reset status variables
temp.MultOb->g_psCurrent = Stopped;
temp.MultOb->g_lVolume = VOLUME_FULL;
SoundOb.push_back(temp);
// Start playing the media file
hr = PlayMovieInWindow(temp.MultOb->FileName,Tname);
// If we couldn't play the clip, clean up
if (FAILED(hr))
{
LHxxFREE_MULTIMEDIA(Tname);
}
LHxxSTOP_MULTIMEDIA(Tname);
return true;
}
void ENmultimedia::LHxxPLAY_MULTIMEDIA(char *Tname,int playmode)
{
iter=LHxxITERATOR_LIST(Tname,"LHxxPLAY_MULTIMEDIA()");
if(iter==NULL)
{
return;
}
iter->MultOb->PlayMode=playmode;
//重新开始播放
if(iter->MultOb->g_psCurrent == Stopped || iter->MultOb->g_psCurrent==End)
{
LHxxRESET_MULTIMEDIA(Tname);
}
iter->MultOb->g_psCurrent=Running;
iter->MultOb->pMC->Run();
}
void ENmultimedia::LHxxSTOP_MULTIMEDIA(char *Tname)
{
iter=LHxxITERATOR_LIST(Tname,"LHxxSTOP_MULTIMEDIA()");
if(iter==NULL)
{
return;
}
if(iter->MultOb->g_psCurrent==End)
{
return;
}
iter->MultOb->g_psCurrent=Stopped;
iter->MultOb->pMC->Stop();
}
void ENmultimedia::LHxxPAUSE_MULTIMEDIA(char *Tname)
{
iter=LHxxITERATOR_LIST(Tname,"LHxxPAUSE_MULTIMEDIA()");
if(iter==NULL)
{
return;
}
if (!iter->MultOb->pMC)
{
return;
}
//是stop状态时,不处理
if(iter->MultOb->g_psCurrent==Stopped || iter->MultOb->g_psCurrent==End)
{
return;
}
// Toggle play/pause behavior
if((iter->MultOb->g_psCurrent == Paused))//重按暂停时,播放
{
if (SUCCEEDED(iter->MultOb->pMC->Run()))
{
iter->MultOb->g_psCurrent = Running;
}
}
else
{
if (SUCCEEDED(iter->MultOb->pMC->Pause()))
{
iter->MultOb->g_psCurrent = Paused;
}
}
}
static int percent=0;
void LoadingThread(void *p)
{
percent=0;
list<ENmultimediaData>::iterator *iter=(list<ENmultimediaData>::iterator*)(p);
// (*iter)->MultOb->g_psCurrent=Running;
(*iter)->MultOb->g_psCurrent=Paused;
(*iter)->MultOb->pMC->Run();
(*iter)->MultOb->g_psCurrent=Running;
percent=100;
if(percent==100)
{
_endthreadex(NULL);
}
cout<<"退出线程1:"<<endl;
return;
}

//加载资源
unsigned int __stdcall LoadingThread1(void *p)//加载游戏资源
{
percent=0;
list<ENmultimediaData>::iterator *iter=(list<ENmultimediaData>::iterator*)(p);
// (*iter)->MultOb->g_psCurrent=Running;
(*iter)->MultOb->g_psCurrent=Paused;
(*iter)->MultOb->pMC->Run();
(*iter)->MultOb->g_psCurrent=Running;
percent=100;
if(percent==100)
{
_endthreadex(NULL);
}
cout<<"退出线程2:"<<endl;
return 0;
}

int ENmultimedia::LHxxSTATE_MULTIMEDIA(char *Tname)//检测是否在播放中
{
iter=LHxxITERATOR_LIST(Tname,"NO");
if(iter==NULL)
{
return false;
}
LHxxHANDLE_GRAPHEVENT(Tname);
if(iter->MultOb->PlayMode==1)//循环播放
{
if(iter->MultOb->g_psCurrent==End)
{
LHxxRESET_MULTIMEDIA(Tname);
iter->MultOb->g_psCurrent=Running;
iter->MultOb->pMC->Run();
/*
iter->MultOb->g_psCurrent=Paused;
static unsigned long t=0;
LHxxRESET_MULTIMEDIA(Tname);
iter->MultOb->g_psCurrent=Paused;
_beginthreadex((void*)t,t,&LoadingThread1,(unsigned int *)&iter,(unsigned)t,(unsigned*)t);
if(percent==100)
{
percent=0;
}
*/
/*
iter->MultOb->g_psCurrent=Paused;
static unsigned long t=0;
LHxxRESET_MULTIMEDIA(Tname);
iter->MultOb->g_psCurrent=Paused;
_beginthread(&LoadingThread,t,(unsigned int *)&iter);
if(percent==100)
{
percent=0;
}
*/
}
}
//0:stop; 1:pause; 2:playing; 3:ini
// cout<<"iter->MultOb->g_psCurrent:"<<iter->MultOb->g_psCurrent<<endl;
return iter->MultOb->g_psCurrent;
}
bool ENmultimedia::LHxxFREE_MULTIMEDIA(char *Tname)
{
iter=LHxxITERATOR_LIST(Tname,"LHxxFREE_MULTIMEDIA()");
if(iter==NULL)
{
return false;
}
LHxxFREE_CLIP(Tname);
delete iter->MultOb;
iter->MultOb=NULL;
SoundOb.erase(iter);
return true;
}
void ENmultimedia::LHxxRESET_MULTIMEDIA(char *Tname)
{
iter=LHxxITERATOR_LIST(Tname,"LHxxRESET_MULTIMEDIA()");
if(iter==NULL)
{
return;
}
LONGLONG pos=0;
// Run the graph to play the media file
iter->MultOb->pMS->SetPositions(&pos, AM_SEEKING_AbsolutePositioning ,NULL, AM_SEEKING_NoPositioning);
}


WizardK 2010-03-22
  • 打赏
  • 举报
回复
遇到过类似问题,是因为AVI的压缩格式

m_Video = MCIWndCreate(this->GetSafeHwnd(), AfxGetInstanceHandle(), WS_CHILD | WS_VISIBLE | MCIWNDF_NOMENU | MCIWNDF_NOPLAYBAR, "C:\\AVDemo.avi");
MCIWndPlay(m_Video);
yiming07 2010-03-22
  • 打赏
  • 举报
回复
请大家帮忙讨论解答。谢谢
yiming07 2010-03-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dick_china 的回复:]
没有流利的播放s 是什么意思?有播放了?
有没声音?如果有声音没图像的话可能是视频解码不对
[/Quote]
是这样的,我点了打开文件按钮后,显示视频区域变黑,但没有正常播放,然后我点在视频下方出现的那个播放按钮,视频闪了一下,就没了,再点,再闪,如此这般.......我以前遇到视频解码的是,那时是显示没有***解压缩程序啊。挺着急的,请您指点,多谢
dick_china 2010-03-21
  • 打赏
  • 举报
回复
没有流利的播放s 是什么意思?有播放了?
有没声音?如果有声音没图像的话可能是视频解码不对

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧