// 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); }
test.mp3->mpeg1 stream splitter->mpeg laser-3 decode->acm wrapper->avi mux -->File writer (new avi)
+
test.avi->avi splitter-----------------------------------------------+你可先用graph edit 试试,然后对它编程
你说avi中可包含mp3,要参见avi开头的系列函数指的是什么,能说的详细一点么??多谢了!!
{ 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;
}
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);
}
先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;
}
};
当打开.avi的时候 就可以跳出视屏 不知道你是不是用的MCI写的
如果是的话
就可以
不过感觉 也不是太妥
MCI可以的
设置MCI_OPEN_PARMS 的lpstrDeviceType就可以了