用VC播放AVI文件的问题 CAnimation 控件你可以上网查一下 关键字: CAnimation Flash里面有篇文章有详细介绍 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 已经看了,可是还是没有解决问题,可能我说得有点问题了,我是想要知道为什么我已开始用AviFileInit(),程序就报错说是无法识别,等等一系列的函数都是无法识别。我是第一次用,不知道问题出在什么地方了。有知道得能帮帮忙告诉我一声么?最好能告诉我上哪能找到有关avi文件的操作的教程。 如果用API,看看是否包含相应头文件,查找MSDN。 你哪是什么AVI文件,AVI文件有很多种,CAnimation 能播放的是很原始的只有图像没有声音的简单文件,可不能用来播放电影文件. 那如果我已经知道是第几桢,也就是已经知道该桢的数值,怎么讲这一针的图像信息保存到剪贴版上或是直接以bmp格式保存在硬盘上呢?不很清楚avi的格式,应该怎样定位?怎样获得当前桢图像的大小阿? 用directshowavi有很多种格式的,如mpeg2、mpeg4等,需要比较强大的解码器,如xvid、divx、ffdshow等 楼主可以参考使用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;} 太谢谢各位了,尤其是jerry4711 。我已经获得该图像信息了,但是只是在缓存区中,应该怎样将其保存为位图文件? AviFileInit() 报错可能是没加头文件vfw.h和vfw32.lib吧。得到图像数据后,想保存为位图文件的话,新建个文件,按照约定格式写文件即可以 关于类之间通信 工具栏创建的问题? 怎样把一个int变量转换成一个CString变量(谢谢) 我编译的时候出现这个样的错误,我想问问,是啥原因,我咋解决! 怎样在exe中向dll的函数传递参数? 刚刚有一个小东东完成(OpenGL的),大伙有兴趣的来测试一下 ^_^ 大家看我这个目录递归操作有什么问题啊,,, 各位兄台给点建议 Visual c++ Runtime Libraly Error 线程在哪些情况下会退出? opengl问题????? 如何动态设置CEdit使它自动换行?
不很清楚avi的格式,应该怎样定位?怎样获得当前桢图像的大小阿?
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;
}
我已经获得该图像信息了,但是只是在缓存区中,应该怎样将其保存为位图文件?