这段时间在做一个视频网络传送的程序,刚开始使用的是VFW,capVideoStreamCallback对视频数据捕获,然后用DrawDIBDraw解压,再转换为JPG格式的图片发到对方机器上,对方接受后逐个显示。虽然可行,但速度太慢,每秒撑死15帧,还只能是320×240的,再大一点就如640×480就只能放幻灯片了。
现在想用xvid进行压缩,但对这方面存在疑问:
一、使用XVID进行压缩的数据源是什么?是从设备中捕获的DIB图片吗?还是XVID直接连到视频设备上获得数据?
二、如何调用XVID的功能?我只知道XVID编译后有一个.LIB 或者 .DLL,是直接调用其中的函数xvid_encore?但xvid_encore中的数据格式又是什么?在XVID的网站上只提供了一个结构体的说明,其中XVID_ENC_FRAME中的 *bitstream是不是就是包含数据的流?在DELPHI中是不是就是指向一个buffer的指针,如PChar或VIDEOHDR中的pData?在网上逛了一天了,无解?
特奉上100分求解!分不够再加!谢谢!!

解决方案 »

  1.   

    具体的讲起来太麻烦了吧,大概讲一下吧,你应该可以在网上找到相关的代码的。
    xvid直接用DLL当然是可行的,数据源也就是你捕获的数据,不过从方便性方面来说肯定不如用dspack来的简单,目前大部分视频压缩都支持DS的吧。你看一下dspack的例子吧,其中有一个就是关于视频捕获的例子,你只要加入一个中间的filter(xvid)进行数据压缩就可以了吧,当然具体的实施还有一些问题要解决,你最好查一下DS方面的资料,两者是一样的。
      

  2.   

    谢谢 lvjun(lvjun)  的回复。
    dspack我以前也稍微用过,只是觉得它封装了太多的东西,我想比较详细的了解底层的实现方法,所以用了比较原始的方法。
      

  3.   

    呵呵,那你可以多看一下directshow方面的东西,dspack就是封装的这个,资料也很多。
      

  4.   

    呵呵,实际上dspack或者说directshow并没有封闭太多的东西,你如果看编码源码实现filter的方法就发现,它也只是简单调用了具体编码库的函数而已。
      

  5.   

    关注!有没有哪位高手讲一下怎么调用XVID里面的函数啊?函数都怎么用?
      

  6.   

    procedure TServerMain.InitCompressor;
    begin
      zeromemory(@m_CV, sizeOf(TCOMPVARS));
      m_CV.dwFlags := VFW.ICMF_COMPVARS_VALID;
      m_CV.cbSize := sizeof(m_CV);
      m_CV.cbState := 0;
      m_CV.fccHandler := 859189837; // .H263 压缩 ,换别的请写VFW.mmioFOURCC('d', 'i', 'v', 'x');
      m_CV.fccType := VFW.ICTYPE_VIDEO;
      m_CV.hic:=ICOpen(ICTYPE_VIDEO,m_cv.fccHandler,ICMODE_COMPRESS or ICMODE_DECOMPRESS);
      m_CV.lDataRate := 4;
      m_CV.lFrame := 0;
      m_CV.lKey := 10;
      m_CV.lKeyCount := 0;
      m_CV.lpbiIn := nil;
      m_CV.lpBitsOut := nil;
      m_CV.lpBitsPrev := nil;
      m_CV.lpState := nil;
      m_CV.lQ := VFW.ICQUALITY_LOW;  //画质  if (m_CV.hic <> 0) then
      begin
        m_OutFormatSize := VFW.ICCompressGetFormatSize(m_CV.hic, @m_InInfo);
        getmem(m_pOutInfo, m_OutFormatSize);    VFW.ICCompressGetFormat(m_CV.hic, @m_InInfo, @m_pOutInfo^.bmiHeader);    ICSendMessage(m_CV.hic,$60c9,$f7329ace,$acdeaea2); //非此不可
        m_cv.dwFlags:=ICMF_COMPVARS_VALID;    m_OutBufferSize := VFW.ICCompressGetSize(m_CV.hic, @m_InInfo,
          @m_pOutInfo^.bmiHeader);    VFW.ICSeqCompressFrameStart(@m_CV, @m_InInfo);    VFW.ICDecompressBegin(m_cv.hic,@m_pOutInfo^.bmiHeader,@m_InInfo.bmiHeader);
      end
      else
        ShowMessage('未找到压缩插件!');
    end;