我想在avi文件里面加一个mp3文件,不知道应该怎么加,也没有找到相应的例子,有谁能告诉我么??

解决方案 »

  1.   

    用DXSDK可以
     test.mp3->mpeg1 stream splitter->mpeg laser-3 decode->acm wrapper->avi mux -->File writer (new avi)
                                                                           + 
      test.avi->avi splitter-----------------------------------------------+你可先用graph edit 试试,然后对它编程
      

  2.   

    谢谢楼上的回复,按照你的做法,那AVI文件中的音频还是mp3么??
      

  3.   

    avi中可包含mp3,具体参见AVI开头的系列函数
      

  4.   

    那我就不知怎样加入了,我原来用DXSDK用得多,我的思路将mp3通过解码后成音频流,然后AVI MUX与原AVI的图像叠加,得到新的AVI,我用DXSDK的工具graphedit试过,是可行的
      

  5.   

    谢谢Keiy。to vcmute(横秋):
        你说avi中可包含mp3,要参见avi开头的系列函数指的是什么,能说的详细一点么??多谢了!!
      

  6.   

    我的问题还没有解决呢!!!!!!!我现在要把mp3放到avi中,而且放到avi以后还是mp3。现在我遇到的问题是,如何把mp3放到avi中,而且放进去以后,mp3本身的属性不变,比如Bitrate等。我在网上没有找到相应的例子,所以来这里问问大家,请多指教呀!!
      

  7.   

    http://www.wischik.com/lu/programmer/avi_utils.htmlHRESULT AddAviAudio(HAVI avi, void *dat, unsigned long numbytes)
    { if (avi==NULL) return AVIERR_BADHANDLE;
      if (dat==NULL || numbytes==0) return AVIERR_BADPARAM;
      TAviUtil *au = (TAviUtil*)avi;
      if (au->iserr) return AVIERR_ERROR;
      if (au->wfx.nChannels==0) return AVIERR_BADFORMAT;
      unsigned long numsamps = numbytes*8 / au->wfx.wBitsPerSample;
      if ((numsamps*au->wfx.wBitsPerSample/8)!=numbytes) return AVIERR_BADPARAM;
      //
      if (au->as==0) // create the stream if necessary
      { AVISTREAMINFO ahdr; ZeroMemory(&ahdr,sizeof(ahdr));
        ahdr.fccType=streamtypeAUDIO;
        ahdr.dwScale=au->wfx.nBlockAlign;
        ahdr.dwRate=au->wfx.nSamplesPerSec*au->wfx.nBlockAlign; 
        ahdr.dwSampleSize=au->wfx.nBlockAlign;
        ahdr.dwQuality=(DWORD)-1;
        HRESULT hr = AVIFileCreateStream(au->pfile, &au->as, &ahdr);
        if (hr!=AVIERR_OK) {au->iserr=true; return hr;}
        hr = AVIStreamSetFormat(au->as,0,&au->wfx,sizeof(WAVEFORMATEX));
        if (hr!=AVIERR_OK) {au->iserr=true; return hr;}
      }
      //
      // now we can write the data
      HRESULT hr = AVIStreamWrite(au->as,au->nsamp,numsamps,dat,numbytes,0,NULL,NULL);
      if (hr!=AVIERR_OK) {au->iserr=true; return hr;}
      au->nsamp+=numsamps; return S_OK;
    }
      

  8.   

    测试一下没问题,只是时间长度为0,但能播放正常{
    char lpFileAvi[] = "d:\\1.avi";
    char lpFileMP3[] = "d:\\1.mp3"; PAVIFILE         pf; 
    PAVISTREAM       ps; 
    HRESULT          hr; 
    CMp3File mf(lpFileMP3);
    int numbytes = mf.GetDataLen();
    if(0==numbytes)return;
    WAVEFORMATEX    wfx =mf.GetWFX(); 
    AVISTREAMINFO ahdr={0};
        ahdr.fccType=streamtypeAUDIO;
        ahdr.dwScale=wfx.nBlockAlign;
        ahdr.dwRate=wfx.nSamplesPerSec*wfx.nBlockAlign; 
        ahdr.dwSampleSize=wfx.nBlockAlign;
        ahdr.dwQuality=(DWORD)-1;  // Create new AVI file using AVIFileOpen. 
        hr = AVIFileOpen(&pf, lpFileAvi, OF_WRITE | OF_CREATE, NULL); 
        if (hr != S_OK) 
            return; 
       
    // Create a stream using AVIFileCreateStream. 
        hr = AVIFileCreateStream(pf, &ps, &ahdr);
        if (hr != S_OK) {            //Stream created OK? If not, close file. 
            AVIFileRelease(pf); 
            return; 
        }  hr = AVIStreamSetFormat(ps,0,&wfx,sizeof(WAVEFORMATEX));
    if (hr != S_OK) {            //Stream Set Format OK? If not, close file. 
    AVIStreamRelease(ps); 
            AVIFileRelease(pf); 
            return; 
        }  int nsamp = 0;
    do {
    LPBYTE data = new BYTE[numbytes + 1];
    mf.ReadData(data);
    hr = AVIStreamWrite(ps,nsamp++,1,data,numbytes,0,NULL,NULL);
    delete[] data;
    } while(numbytes = mf.GetDataLen());

         // Close the stream and file. 
        AVIStreamRelease(ps); 
        AVIFileRelease(pf); 
    }
      

  9.   

    CMp3File是自定义的类,大致如下;
    先MP3主要靠前3个字节来描述sample,所以先读出该帧的长度,再通过ReadData读出整帧
    FrameInit用来先读3个字节到m_byTemp,并初始化m_wfx(如果未初始化的话)和m_nDataLenclass CMp3File
    {
    enum{MP3_HEADER=3};
    FILE *m_fp;
    int m_nDataLen;
    BYTE m_byTemp[MP3_HEADER];
    WAVEFORMATEX m_wfx;
    void FrameInit();
    public:
    ~CMp3File()
    {
    if(m_fp)fclose(m_fp);
    }
    CMp3File(LPCSTR szName)
    {
    m_fp=fopen(szName,"rb");
    m_nDataLen = 0;
    if(m_fp)
    {
    memset(&m_wfx,0,sizeof(WAVEFORMATEX));
    FrameInit();
    }
    }
    void ReadData(LPBYTE pData)
    {
    memcpy(pData,m_byTemp,MP3_HEADER);
    fread(pData+MP3_HEADER,m_nDataLen-MP3_HEADER,1,m_fp);
    FrameInit();
    }
    WAVEFORMATEX GetWFX()
    {
    return m_wfx;
    } BOOL GetDataLen()
    {
    return m_nDataLen;
    }
    };
      

  10.   

    你的意思说两个都能播放
    当打开.avi的时候  就可以跳出视屏 不知道你是不是用的MCI写的
    如果是的话
    就可以
    不过感觉 也不是太妥
    MCI可以的
    设置MCI_OPEN_PARMS 的lpstrDeviceType就可以了