高手出招:有没有人用过DivX来加压数据啊? 有没有人使用过DivX来写程序啊,我使用AVIStreamWrite就可以写出DivX的AVI文件,不过我使用ICCompressBegin就不能使用了!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我现在使用DirectShow来重压视频,你也可以试试,DirectX SDK非常好用 难道DivX不能用ICCompressBegin来压缩,还是我的代码有问题:m_HIC=ICOpen(ICTYPE_VIDEO, codec, ICMODE_COMPRESS).........ICCompressBegin(m_HIC, &in_format, &out_format)我试了codec=2021026148、codec=MAKEFOURCC('D','I','V','X')都不行是参数的问题吗? 用DirectShow如何现实啊?我没有用过DirectShow来压缩,写出例子我先给分 不可能不行的,我用了N次了。可能是中间一些参数你设错了,很有可能 是in_format, out_format这两个,你再仔细看看啦 fccHandler=2021026148; BITMAPINFOHEADER biIn,biOut; biIn.biSize = sizeof(BITMAPINFOHEADER); biIn.biBitCount =24; biIn.biCompression=BI_RGB;// standard RGB bitmap biIn.biClrUsed = biIn.biClrImportant =0; biIn.biPlanes = 1; biIn.biXPelsPerMeter = biIn.biYPelsPerMeter = 0; biIn.biWidth = WIDTH; biIn.biHeight =HEIGHT; biIn.biSizeImage = WIDTH*HEIGHT*(COLORBIT/3); memcpy(&biOut,&biIn,40); biOut.biCompression=fccHandler; hic=ICOpen(mmioFOURCC('V','I','D','C'),fccHandler,ICMODE_COMPRESS); if(!hic) { AfxMessageBox("ICOpen error!"); return 0; } DWORD error; if ((error=ICCompressBegin(hic, (LPBITMAPINFO)&biIn,(LPBITMAPINFO)&biOut))!=ICERR_OK) { return FALSE; } 给分就要结帖了,先记上: duwenyong(啸海) 50分^_^ 剩下的50分就给我了,呵呵Codec::Codec(BITMAPINFOHEADER *bih){ HRESULT h; this->hic = 0; this->videoMode = VIDEO_MODE_ERROR; if(bih) { if(userset) { bih->biCompression = mmioFOURCC('X', 'V', 'I', 'D');//你自己也可以在这里设置,但那四个字母要注意不能错,DIVX的标计有DIV3或DIV4. } this->hic = ICOpen(mmioFOURCC('V', 'I', 'D', 'C'), bih->biCompression, ICMODE_FASTDECOMPRESS); if(this->hic != 0) { ZeroMemory(&this->in_bih, sizeof(BITMAPINFO)); ZeroMemory(&this->out_bih, sizeof(BITMAPINFO)); memcpy(&this->in_bih.bmiHeader, bih, sizeof(BITMAPINFOHEADER)); memcpy(&this->out_bih.bmiHeader, bih, sizeof(BITMAPINFOHEADER)); out_bih.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); out_bih.bmiHeader.biBitCount = 24; out_bih.bmiHeader.biCompression=0; h = ICERR_OK; if(h == ICERR_OK) { h = ICDecompressQuery(this->hic, &this->in_bih, &this->out_bih); this->out_bih.bmiHeader.biSizeImage = out_bih.bmiHeader.biWidth*out_bih.bmiHeader.biHeight*out_bih.bmiHeader.biBitCount/8; h = ICDecompressBegin(this->hic, &this->in_bih, &this->out_bih); this->videoMode = VIDEO_MODE_RGB24; if(h != ICERR_OK) { MessageBox(NULL, "Can't Begin Decompression", "", MB_OK); this->hic = 0; } } else { MessageBox(NULL, "Codec not working!", "", MB_OK); this->hic = 0; } } else { MessageBox(NULL, "Can't find any appropriate Codec!", "", MB_OK); this->hic = 0; } } else { MessageBox(NULL, "Codec : wrong input parameters!", "Error", MB_OK); }}int Codec::Decompress(char *in, long in_size, char *out){ HRESULT h; if(this->hic) { this->in_bih.bmiHeader.biSizeImage = in_size; if(in_size == 0) { h = ICDecompress(this->hic, ICDECOMPRESS_NULLFRAME, &this->in_bih.bmiHeader, (void *) in, &this->out_bih.bmiHeader, (void *) out); } else { h = ICDecompress(this->hic, ICDECOMPRESS_NOTKEYFRAME, &this->in_bih.bmiHeader, (void *) in, &this->out_bih.bmiHeader, (void *) out); } } return 1;} 为什么是用mmioFOURCC('X', 'V', 'I', 'D'),而不是mmioFOURCC('D', 'I', 'V', 'X')呢?我压缩的时候是用的2021026148,不是mmioFOURCC任何一个值。 压缩引擎有很多种,XVID是一种,如果是DIVX公司的,可以有DIV3,或DIV4,但不能用DIVX ListCtrl 如何更改选中行的背景颜色。 fopen的问题 输入两个点能画一条线 紧急求救::如何跳出浏览框选择需要的文件 richeditctrl 加了回车后颜色向右移了一个字符??????急 问一个我认为难的 高手进来看看 请教:VC如何把ACCESS里的数据输入到WORD里面 vc做串口的上位机程序 推荐几本学习VC的好书? 弱智加傻瓜问题,怎样MDI程序中建立一个新的子窗口,我手里没有资料 如何弹出一个小窗口,像vc的undo一样显示一些undo的选择项 ★有什么办法知道磁盘上的一个文件比如c:\1.txt是否被打开了?
m_HIC=ICOpen(ICTYPE_VIDEO, codec, ICMODE_COMPRESS)
...
...
...
ICCompressBegin(m_HIC, &in_format, &out_format)
我试了codec=2021026148、codec=MAKEFOURCC('D','I','V','X')都不行
是参数的问题吗?
可能是中间一些参数你设错了,很有可能 是in_format, out_format这两个,你再仔细看看啦
BITMAPINFOHEADER biIn,biOut;
biIn.biSize = sizeof(BITMAPINFOHEADER);
biIn.biBitCount =24;
biIn.biCompression=BI_RGB;// standard RGB bitmap
biIn.biClrUsed = biIn.biClrImportant =0;
biIn.biPlanes = 1;
biIn.biXPelsPerMeter = biIn.biYPelsPerMeter = 0;
biIn.biWidth = WIDTH;
biIn.biHeight =HEIGHT;
biIn.biSizeImage = WIDTH*HEIGHT*(COLORBIT/3);
memcpy(&biOut,&biIn,40);
biOut.biCompression=fccHandler;
hic=ICOpen(mmioFOURCC('V','I','D','C'),fccHandler,ICMODE_COMPRESS);
if(!hic)
{
AfxMessageBox("ICOpen error!");
return 0;
} DWORD error;
if ((error=ICCompressBegin(hic, (LPBITMAPINFO)&biIn,(LPBITMAPINFO)&biOut))!=ICERR_OK)
{
return FALSE;
}
^_^
Codec::Codec(BITMAPINFOHEADER *bih)
{
HRESULT h;
this->hic = 0;
this->videoMode = VIDEO_MODE_ERROR;
if(bih)
{
if(userset)
{
bih->biCompression = mmioFOURCC('X', 'V', 'I', 'D');//你自己也可以在这里设置,但那四个字母要注意不能错,DIVX的标计有DIV3或DIV4.
}
this->hic = ICOpen(mmioFOURCC('V', 'I', 'D', 'C'),
bih->biCompression,
ICMODE_FASTDECOMPRESS);
if(this->hic != 0) {
ZeroMemory(&this->in_bih, sizeof(BITMAPINFO));
ZeroMemory(&this->out_bih, sizeof(BITMAPINFO));
memcpy(&this->in_bih.bmiHeader, bih, sizeof(BITMAPINFOHEADER));
memcpy(&this->out_bih.bmiHeader, bih, sizeof(BITMAPINFOHEADER));
out_bih.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
out_bih.bmiHeader.biBitCount = 24;
out_bih.bmiHeader.biCompression=0;
h = ICERR_OK;
if(h == ICERR_OK) {
h = ICDecompressQuery(this->hic, &this->in_bih, &this->out_bih);
this->out_bih.bmiHeader.biSizeImage = out_bih.bmiHeader.biWidth*out_bih.bmiHeader.biHeight*out_bih.bmiHeader.biBitCount/8;
h = ICDecompressBegin(this->hic, &this->in_bih, &this->out_bih);
this->videoMode = VIDEO_MODE_RGB24;
if(h != ICERR_OK) {
MessageBox(NULL, "Can't Begin Decompression", "", MB_OK);
this->hic = 0;
}
}
else {
MessageBox(NULL, "Codec not working!", "", MB_OK);
this->hic = 0;
}
}
else {
MessageBox(NULL, "Can't find any appropriate Codec!", "", MB_OK);
this->hic = 0;
}
}
else {
MessageBox(NULL, "Codec : wrong input parameters!", "Error", MB_OK);
}
}
int Codec::Decompress(char *in, long in_size, char *out)
{
HRESULT h;
if(this->hic) {
this->in_bih.bmiHeader.biSizeImage = in_size;
if(in_size == 0) {
h = ICDecompress(this->hic, ICDECOMPRESS_NULLFRAME,
&this->in_bih.bmiHeader, (void *) in,
&this->out_bih.bmiHeader, (void *) out);
}
else {
h = ICDecompress(this->hic, ICDECOMPRESS_NOTKEYFRAME,
&this->in_bih.bmiHeader, (void *) in,
&this->out_bih.bmiHeader, (void *) out);
}
}
return 1;
}