vc++ 2008 如何使用quartz.dll 获取影片的帧
时间:2010-10-08 来源:magic_evan
先在VC++2008 中引用quartz.dll,路径:C:\Windows\System32\quartz.dll
编码如下:
private:System::Void MediaPic()
{
//初始化 FilgraphManagerClass 类的新实例
QuartzTypeLib::FilgraphManagerClass^ FMC=gcnew QuartzTypeLib::FilgraphManagerClass();
//载入视频文件
FMC->RenderFile("C:\\F.rmvb");
//定位当前流
FMC->CurrentPosition=FMC->Duration/4;
//获取源影片的宽度
int width=FMC->SourceWidth;
//获取源影片的高度
int height=FMC->SourceHeight;
//定义所需的内存中的字节数
//BITMAPINFOHEADER.biSize + 4 * BITMAPINFOHEADER.biWidth * BITMAPINFOHEADER.biHeight
int% pBufferSize=40+4*width*height;
//将 FilgraphManager 转换成 IBasicVideo2.cs 文件中定义的 IBasicVideo2 接口
QuartzTypeLib::IBasicVideo2^ video=(QuartzTypeLib::IBasicVideo2^)FMC;
//从进程的非托管内存中分配内存
IntPtr pDIBImage=System::Runtime::InteropServices::Marshal::AllocHGlobal(pBufferSize);
//获取新分配的内存的 IntPtr
//video->GetCurrentImage(pBufferSize,(int%)((int)pDIBImage));//无法执行....不清楚为什么,知道的可以给我回复一下。谢谢!
//相邻扫描行开始处之间字节偏移量
int stride=-4*width;
//颜色数据的格式
Imaging::PixelFormat format=Imaging::PixelFormat::Format32bppRgb;
//包含像素数据的字节数组的指针
IntPtr scan0=(IntPtr)(((int)pDIBImage)+(pBufferSize-(4*width)));
//用指定的大小、像素格式和像素数据初始化 Bitmap 类的新实例
Bitmap bmp=gcnew Bitmap(width,height,stride,format,scan0);
//将图像保存到指定的文件。
bmp.Save("c:\\a.jpg",System::Drawing::Imaging::ImageFormat::Jpeg);
//释放以前使用 AllocHGlobal 从进程的非托管内存中分配的内存
System::Runtime::InteropServices::Marshal::FreeHGlobal(pDIBImage);
//释放运行时可调用包装及原始 COM 对象
while(System::Runtime::InteropServices::Marshal::ReleaseComObject(FMC)>0);
}