求教使用directshow得到视频数据压缩
我使用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




