现在的位置: 首页 > 综合 > 正文

vc++ 2008 如何使用quartz.dll 获取影片的帧

2012年05月12日 ⁄ 综合 ⁄ 共 1513字 ⁄ 字号 评论关闭

先在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);
    }

【上篇】
【下篇】

抱歉!评论已关闭.