有没有人使用过DivX来写程序啊,我使用AVIStreamWrite就可以写出DivX的AVI文件,不过我使用ICCompressBegin就不能使用了!!

解决方案 »

  1.   

    我现在使用DirectShow来重压视频,你也可以试试,DirectX SDK非常好用
      

  2.   

    难道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')都不行
    是参数的问题吗?
      

  3.   

    用DirectShow如何现实啊?我没有用过DirectShow来压缩,写出例子我先给分
      

  4.   

    不可能不行的,我用了N次了。
    可能是中间一些参数你设错了,很有可能 是in_format, out_format这两个,你再仔细看看啦
      

  5.   

    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;

      

  6.   

    给分就要结帖了,先记上: duwenyong(啸海) 50分
    ^_^
      

  7.   

    剩下的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;
    }
      

  8.   

    为什么是用mmioFOURCC('X', 'V', 'I', 'D'),而不是mmioFOURCC('D', 'I', 'V', 'X')呢?我压缩的时候是用的2021026148,不是mmioFOURCC任何一个值。
      

  9.   

    压缩引擎有很多种,XVID是一种,如果是DIVX公司的,可以有DIV3,或DIV4,但不能用DIVX