CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  多媒体/流媒体开发

求教使用directshow得到视频数据压缩

楼主zhang830109()2006-03-01 15:51:33 在 专题开发/技术/项目 / 多媒体/流媒体开发 提问

我使用directshow进行视频的捕捉和传输,但是在传输过程中数据太大,所以使用vcm进行视频压缩,用acm进行音频的压缩.在视频压缩的时候遇到了这个问题:使用vcm进行压缩的时候传入的COMPVARS结构中  
  typedef   struct   {    
          LONG                   cbSize;    
          DWORD                 dwFlags;    
          HIC                     hic;    
          DWORD                 fccType;    
          DWORD                 fccHandler;    
          LPBITMAPINFO   lpbiIn;    
          LPBITMAPINFO   lpbiOut;    
          LPVOID               lpBitsOut;    
          LPVOID               lpBitsPrev;    
          LONG                   lFrame;    
          LONG                   lKey;    
          LONG                   lDataRate;    
          LONG                   lQ;    
          LONG                   lKeyCount;    
          LPVOID               lpState;    
          LONG                   cbState;    
  }   COMPVARS;    
      LPBITMAPINFO   lpbiIn;   只能给BITMAPINFOHEADER赋值,但是调色板的值不知道RGBQUAD     bmiColors[1];    
  请问怎么在directshow中获取呢?是在CMediaType m_mt吗?如果不赋值能使用吗?  
  大家帮帮我 问题点数:100、回复次数:3Top

1 楼zhang830109()回复于 2006-03-02 14:17:19 得分 0

大家帮我看看呀  
  vcm压缩的代码如下:  
  #if   !defined(AFX_CODEC_H__B8707DA7_4D62_49B5_8DB9_D41C8E446F12__INCLUDED_)  
  #define   AFX_CODEC_H__B8707DA7_4D62_49B5_8DB9_D41C8E446F12__INCLUDED_  
  #include   "vfw.h"  
  #if   _MSC_VER   >   1000  
  #pragma   once  
  #endif   //   _MSC_VER   >   1000  
  //   CodeC.h   :   header   file  
  //  
   
  /////////////////////////////////////////////////////////////////////////////  
  //   CCodeC   dialog  
   
  class   CCodeC  
  {  
  public:  
  CCodec();  
  public:  
  //for   single   compress  
  BOOL InitCompress(BITMAPINFO   bi);  
  LONG CompressData(LPBYTE   lpInData,LPBYTE   lpOutData,LPDWORD   lpdwFlags);  
  void CloseCompress();  
  //for   decompress  
  BOOL InitDecompress(BITMAPINFOHEADER   biIn,BITMAPINFOHEADER   biOut);  
  void CloseDecompress();  
  BOOL DecompressData(LPBYTE   pData,LPBYTE   pOutData,DWORD   dwKeyFrame);  
   
   
   
  BITMAPINFO   bihIn,bihOut;  
  private:  
  HIC   hic;  
  BITMAPINFO   decbihIn,decbihOut;  
  HIC   dehic;  
   
   
   
  };  
   
  //{{AFX_INSERT_LOCATION}}  
  //   Microsoft   Visual   C++   will   insert   additional   declarations   immediately   before   the   previous   line.  
   
  #endif   //   !defined(AFX_CODEC_H__B8707DA7_4D62_49B5_8DB9_D41C8E446F12__INCLUDED_)  
  Top

2 楼zhang830109()回复于 2006-03-02 14:17:31 得分 0

//   CodeC.cpp   :   implementation   file  
  //  
   
  #include   "stdafx.h"  
   
  #include   "CodeC.h"  
   
  #ifdef   _DEBUG  
  #define   new   DEBUG_NEW  
  #undef   THIS_FILE  
  static   char   THIS_FILE[]   =   __FILE__;  
  #include   "CodeC.h"  
  #include   "vfw.h"  
  #endif  
   
  /////////////////////////////////////////////////////////////////////////////  
  //   CCodeC   dialog  
   
  CCodeC::CCodec()  
  {  
  }  
   
  BOOL   CCodeC::InitCompress(BITMAPINFO   bi)  
  {  
  //::CoInitialize(NULL);  
  memcpy(&bihIn,&bi,sizeof(bi));  
  memcpy(&bihOut,&bi,sizeof(bi));  
  /* hic   =   ICLocate   (ICTYPE_VIDEO,   fccHandler,   (LPBITMAPINFOHEADER)   &biIn,   &biOut,   ICMODE_COMPRESS);    
  //     hic   =   ICLocate   (ICTYPE_VIDEO,   0L,   (LPBITMAPINFOHEADER)   &biIn,   NULL,   ICMODE_COMPRESS);    
      if(!hic)  
  {  
  AfxMessageBox("ICLocate   error!");  
  return FALSE;  
  }  
  */  
  COMPVARS   pc;  
  pc.cbSize=sizeof(COMPVARS);  
  pc.fccType=ICTYPE_VIDEO;  
  pc.lpbiIn=(LPBITMAPINFO)&bihIn;  
  if(!(ICCompressorChoose(NULL,  
  0|ICMF_CHOOSE_DATARATE|ICMF_CHOOSE_KEYFRAME|ICMF_CHOOSE_PREVIEW,//ICMF_CHOOSE_ALLCOMPRESSORS  
  &bihIn,NULL,&pc,"视频压缩算法选择")))  
  {  
  AfxMessageBox("ICCompressorChoose   error!");  
  return   false;  
  }    
  hic=pc.hic;  
  bihOut.bmiHeader.biCompression=pc.fccHandler;  
  /* hic=ICOpen(mmioFOURCC('V','I','D','C'),fccHandler,ICMODE_COMPRESS);  
  if(!hic)  
  {  
  AfxMessageBox("ICOpen   error!");  
  return   0;  
  }  
  ICConfigure(hic,NULL);  
  */  
   
      if   (ICCompressBegin(hic,(LPBITMAPINFO)&bihIn,(LPBITMAPINFO)&bihOut)!=ICERR_OK)  
  {  
  return FALSE;  
  }    
  return   TRUE;  
  }  
   
   
  LONG   CCodeC::CompressData(LPBYTE   lpInData,   LPBYTE   lpOutData,   LPDWORD     lpdwFlags)  
  {  
  BITMAPINFOHEADER   in,out;  
  in=bihIn.bmiHeader;  
  out=bihOut.bmiHeader;  
   
  if(ICCompress(hic,0,&out,lpOutData,&in,lpInData,0,   lpdwFlags,0,0,0,NULL,NULL)!=ICERR_OK)  
  {  
  MessageBox(NULL,"Compress   Error!","错误",MB_OK);  
  return 0;  
  }    
  return   out.biSizeImage;  
  }  
   
  void   CCodeC::CloseCompress()  
  {  
  ICCompressEnd(hic);         //   terminate   compression    
  }  
   
  BOOL   CCodeC::InitDecompress(BITMAPINFOHEADER   biIn,BITMAPINFOHEADER   biOut)  
  {  
  memcpy(&decbihIn,&biIn,40);  
  memcpy(&decbihOut,&biOut,40);  
  dehic=ICOpen(mmioFOURCC('V','I','D','C'),biIn.biCompression,ICMODE_DECOMPRESS);  
  if(!dehic)  
  {  
  AfxMessageBox("decompress   ICOpen   error!");  
  return   FALSE;  
  }  
  if(ICDecompressBegin(dehic,&decbihIn,&decbihOut)   !=   ICERR_OK)  
  {  
        AfxMessageBox("ICDecompressBegin   error");  
        return FALSE;  
  }  
  return   TRUE;  
  }  
   
  BOOL   CCodeC::DecompressData(LPBYTE   pData,LPBYTE   pOutData,DWORD   dwKeyFrame)  
  {  
  // if(ICDecompress(dehic,0,&decbihIn,pData,&decbihOut,pOutData)!=ICERR_OK)  
  // return   FALSE;  
  return   TRUE;  
  }  
   
  void   CCodeC::CloseDecompress()  
  {  
  ICDecompressEnd(dehic);  
  }  
   
   
  Top

3 楼zhang830109()回复于 2006-03-02 14:22:02 得分 0

使用时  
  if   (m_mt.formattype   ==   FORMAT_VideoInfo)     //为视频数据  
  {  
  VIDEOINFOHEADER   *   pvi   =   (VIDEOINFOHEADER   *)   m_mt.pbFormat;  
  LPBITMAPINFOHEADER   lpBih=&(pvi->bmiHeader);  
  LPBITMAPINFO   lpBi=(BITMAPINFO   *)lpBih;  
  if(!mEnCode.InitCompress(*lpBi))  
  {  
  ::AfxMessageBox("Sorry   to   start   encode!");  
  return   FALSE;  
  }  
   
  int   outLen=mEnCode.CompressData(pData,pOut,0);  
  }  
  出现错误:Unhandledv...  
  我跟踪了下发现编码器COMPVARS中的hic为Unused;  
  请问是不是因为没有设置BITMAPINFO中的成员RGBQUAD                     bmiColors[1];    
  的缘故呀Top

相关问题

  • 关于DirectShow采集并压缩视频数据(分不够可以再加)
  • 压缩数据库
  • 如何写一个支持将未压缩的视频数据(如RGB24类型的sample)广播出去的Filter?
  • 视频压缩求助
  • video capture,用DirectShow捕获视频,如何取得每帧数据??
  • (dx)如何将视频采集数据压缩成mpeg(或者DivX压缩也行),痛苦好几天了,大家帮忙
  • 有用过视频压缩卡的朋友吗?directshow音视频采集程序,想将处理后的音视频合成到vcd格式文件,请指教!
  • 怎样压缩数据库?
  • VERY EASY!!!!压缩数据库
  • 数据压缩问题

关键词

  • 压缩
  • hic
  • vcm
  • ccodec
  • 视频
  • lpbitmapinfo
  • lpbyte
  • bitmapinfo
  • 使用
  • bitmapinfoheader

得分解答快速导航

  • 帖主:zhang830109

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo