用VC播放AVI文件的问题

haishi1234 2008-04-03 07:37:10
我想用VC制作一个AVI文件的播放器,在网上找到了一些相关的例子,但是在我的电脑上都没办法看到运行后的效果。
同时,我按照书本所编辑的程序也会报错,有关AVI的操作函数根本无法识别,我想要请教各位,是不是应该先加载一
个有关AVI的库文件什么的?
PS:为什么提问街面上有关的相关问题都没有办法打开,和访问权限有关么?
...全文
537 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sindywb 2009-03-10
  • 打赏
  • 举报
回复
AviFileInit() 报错可能是没加头文件vfw.h和vfw32.lib吧。得到图像数据后,想保存为位图文件的话,新建个文件,按照约定格式写文件即可以
haishi1234 2008-04-11
  • 打赏
  • 举报
回复
太谢谢各位了,尤其是jerry4711 。
我已经获得该图像信息了,但是只是在缓存区中,应该怎样将其保存为位图文件?
菜牛 2008-04-10
  • 打赏
  • 举报
回复
如果用API,看看是否包含相应头文件,查找MSDN。
haishi1234 2008-04-10
  • 打赏
  • 举报
回复
已经看了,可是还是没有解决问题,可能我说得有点问题了,我是想要知道为什么我已开始用AviFileInit(),程序就报错说是无法识别,等等一系列的函数都是无法识别。我是第一次用,不知道问题出在什么地方了。有知道得能帮帮忙告诉我一声么?最好能告诉我上哪能找到有关avi文件的操作的教程。
jerry4711 2008-04-10
  • 打赏
  • 举报
回复
楼主可以参考使用VFW编写的播放AVI文件的源代码

或者是Direct show的代码:例子如下:


void CFrameGrabberDlg::OnGrab()
{
HRESULT hr;
/*
// 定义IMediaDet接口实例
CComPtr< IMediaDet > pDet;
hr = CoCreateInstance( CLSID_MediaDet, NULL, CLSCTX_INPROC_SERVER,
IID_IMediaDet, (void**) &pDet );

// 将影片文件名转换成BSTR类型
CComBSTR openBSTR(m_editOpenDir);
// 设置IMediaDet接口的文件关联
hr = pDet->put_Filename(openBSTR);

pDet->get_FrameRate(&dRate);
pDet->get_StreamLength(&totaltime); // 获取整个视频的时间长度
pDet ->Release;
*/
hr = GrabFrameFromMovie();

if (hr != S_OK)
AfxMessageBox("无法抓取帧!");
else
AfxMessageBox("抓取成功!");

}

HRESULT CFrameGrabberDlg::GrabFrameFromMovie()
{
double dtime = 0.00;
double totaltime=1;

for (dtime =0;dtime<totaltime;dtime+=0.04)
{
HRESULT hr;
// 定义IMediaDet接口实例
CComPtr< IMediaDet > pDet;
hr = CoCreateInstance( CLSID_MediaDet, NULL, CLSCTX_INPROC_SERVER,
IID_IMediaDet, (void**) &pDet );
if (FAILED(hr))
return hr;

// 将影片文件名转换成BSTR类型
CComBSTR openBSTR(m_editOpenDir);
// 设置IMediaDet接口的文件关联
hr = pDet->put_Filename(openBSTR);
if (FAILED(hr))
return hr;

// 从影片中检索视频流和音频流
long lStreams;
hr = pDet->get_OutputStreams(&lStreams);
if (FAILED(hr))
return hr;

// 取出影片的视频流,因为帧的信息是保存在视频流中的
bool bFound = false;
//------ 1 ----------------------
for (int i=0; i<lStreams; i++)
{
GUID major_type;
hr = pDet->put_CurrentStream(i);
if (SUCCEEDED(hr))
hr = pDet->get_StreamType(&major_type);
if (FAILED(hr))
break;
//---------- 2 ---------------
if (major_type == MEDIATYPE_Video)
{
bFound =true;
long width = 0, height = 0; // 存储位图的宽和高(单位:象素)
AM_MEDIA_TYPE mt;
hr = pDet->get_StreamMediaType(&mt);
//----------- 3 -----------------------
if (SUCCEEDED(hr))
{
if ((mt.formattype == FORMAT_VideoInfo) &&
(mt.cbFormat >= sizeof(VIDEOINFOHEADER)))
{
// 得到VIDEOINFOHEADER结构指针,VIDEOINFOHEADER结构包含一些与视频
// 有关的信息,其中含有BITMAPINFORHEADER结构
VIDEOINFOHEADER *pVih = (VIDEOINFOHEADER*)(mt.pbFormat);
width = pVih->bmiHeader.biWidth;
height = pVih->bmiHeader.biHeight;
}
else
hr = VFW_E_INVALIDMEDIATYPE;
MyFreeMediaType(mt); // 释放AM_MEDIA_TYPE结构
}
long size;
//double dtime = 0.00;
//double totaltime,dRate;

pDet->get_StreamLength(&totaltime); // 获取整个视频的时间长度
//pDet->get_FrameRate(&dRate);
CStatic * ps = (CStatic *)GetDlgItem(AFX_IDS_PICTYPE_BITMAP); //picture是CStatic类型
// 每1秒,截取视频截图
//for(dtime=0.0; dtime <totaltime; dtime+=0.4)
//{
// 获取bitmap的buffer大小

hr = pDet->GetBitmapBits(dtime, &size, 0, width, height);

if (SUCCEEDED(hr))
{
//分配缓冲区
char *pBuffer = new char[size];
if (!pBuffer)
return NULL;

//------------------ 4 ------------------------
hr = pDet->GetBitmapBits(dtime, 0, pBuffer, width, height);
if (SUCCEEDED(hr))
{
// Find the address of the start of the image data.
void *pData = pBuffer + sizeof(BITMAPINFOHEADER);
BITMAPINFOHEADER *bmih = (BITMAPINFOHEADER*)pBuffer;

BITMAPINFO bmi;
ZeroMemory(&bmi, sizeof(BITMAPINFO));
CopyMemory(&(bmi.bmiHeader), bmih, sizeof(BITMAPINFOHEADER));
HBITMAP hBitmap = CreateDIBitmap(::GetDC(NULL), bmih, CBM_INIT,
pData, &bmi, DIB_RGB_COLORS);

ps->SetBitmap(hBitmap);
DeleteObject(hBitmap);
//ps->ReleaseDC;

}
delete[] pBuffer;
}
//::Sleep(400);
//}
}
}
pDet ->Release;

::Sleep(40);

if (!bFound)
return VFW_E_INVALIDMEDIATYPE;

if (FAILED(hr))
return hr;
}

return S_OK;
}
ouyh12345 2008-04-10
  • 打赏
  • 举报
回复
用directshow

avi有很多种格式的,如mpeg2、mpeg4等,需要比较强大的解码器,如xvid、divx、ffdshow等

haishi1234 2008-04-10
  • 打赏
  • 举报
回复
那如果我已经知道是第几桢,也就是已经知道该桢的数值,怎么讲这一针的图像信息保存到剪贴版上或是直接以bmp格式保存在硬盘上呢?
不很清楚avi的格式,应该怎样定位?怎样获得当前桢图像的大小阿?
wltg2001 2008-04-10
  • 打赏
  • 举报
回复
你哪是什么AVI文件,AVI文件有很多种,CAnimation 能播放的是很原始的只有图像没有声音的简单文件,可不能用来播放电影文件.
nyhenry1 2008-04-03
  • 打赏
  • 举报
回复
CAnimation 控件你可以上网查一下 关键字: CAnimation Flash里面有篇文章有详细介绍

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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