高手出招:有没有人用过DivX来加压数据啊?

堆堆 2003-02-18 11:13:10
有没有人使用过DivX来写程序啊,我使用AVIStreamWrite就可以写出DivX的AVI文件,不过我使用ICCompressBegin就不能使用了!!
...全文
125 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
杂家老周 2003-02-21
  • 打赏
  • 举报
回复
压缩引擎有很多种,XVID是一种,如果是DIVX公司的,可以有DIV3,或DIV4,但不能用DIVX
堆堆 2003-02-21
  • 打赏
  • 举报
回复
为什么是用mmioFOURCC('X', 'V', 'I', 'D'),而不是mmioFOURCC('D', 'I', 'V', 'X')呢?我压缩的时候是用的2021026148,不是mmioFOURCC任何一个值。
堆堆 2003-02-20
  • 打赏
  • 举报
回复
给分就要结帖了,先记上: duwenyong(啸海) 50分
^_^
堆堆 2003-02-20
  • 打赏
  • 举报
回复
代码是可以通过啦,不过好象没有压缩,解压也没有反应,请问是不是又有什么要注意的东西吗?
我先给分
杂家老周 2003-02-20
  • 打赏
  • 举报
回复
剩下的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;
}
duwenyong 2003-02-19
  • 打赏
  • 举报
回复
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 2003-02-19
  • 打赏
  • 举报
回复
不可能不行的,我用了N次了。
可能是中间一些参数你设错了,很有可能 是in_format, out_format这两个,你再仔细看看啦
堆堆 2003-02-19
  • 打赏
  • 举报
回复
用DirectShow如何现实啊?我没有用过DirectShow来压缩,写出例子我先给分
堆堆 2003-02-19
  • 打赏
  • 举报
回复
难道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')都不行
是参数的问题吗?
jian 2003-02-19
  • 打赏
  • 举报
回复
我现在使用DirectShow来重压视频,你也可以试试,DirectX SDK非常好用
c0der 2003-02-19
  • 打赏
  • 举报
回复
我则么可以?你说的清楚一点

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧