CAnimation 控件你可以上网查一下 关键字: CAnimation Flash里面有篇文章有详细介绍

解决方案 »

  1.   

    已经看了,可是还是没有解决问题,可能我说得有点问题了,我是想要知道为什么我已开始用AviFileInit(),程序就报错说是无法识别,等等一系列的函数都是无法识别。我是第一次用,不知道问题出在什么地方了。有知道得能帮帮忙告诉我一声么?最好能告诉我上哪能找到有关avi文件的操作的教程。
      

  2.   

    如果用API,看看是否包含相应头文件,查找MSDN。
      

  3.   

    你哪是什么AVI文件,AVI文件有很多种,CAnimation 能播放的是很原始的只有图像没有声音的简单文件,可不能用来播放电影文件.
      

  4.   

    那如果我已经知道是第几桢,也就是已经知道该桢的数值,怎么讲这一针的图像信息保存到剪贴版上或是直接以bmp格式保存在硬盘上呢?
    不很清楚avi的格式,应该怎样定位?怎样获得当前桢图像的大小阿?
      

  5.   

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

  6.   

    楼主可以参考使用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;
    }
      

  7.   

    太谢谢各位了,尤其是jerry4711 。
    我已经获得该图像信息了,但是只是在缓存区中,应该怎样将其保存为位图文件?
      

  8.   

    AviFileInit() 报错可能是没加头文件vfw.h和vfw32.lib吧。得到图像数据后,想保存为位图文件的话,新建个文件,按照约定格式写文件即可以