下面的代码提取AVI中的视频,并另存一个AVI,可代码有问题(解决后,立即结贴)
如果源AVI文件只有视频,则提取没问题,但源文件要是有视频和音频,那提取出来的视频播放不了,并且视频的码率参数和源文件不同。
long lStreamSize;
PAVIFILE pSrcFile = NULL;
PAVISTREAM pSrcStream = NULL;
AVISTREAMINFO SrcStreamInfo;
BITMAPINFOHEADER* pSrcBmpInfo = NULL;
PAVIFILE pDstFile = NULL;
PAVISTREAM pDstStream = NULL;
HRESULT hr = AVIFileOpen( &pSrcFile, "C:\\Downloads\\mg11.avi", OF_SHARE_DENY_WRITE|OF_READ, 0L );
hr = AVIFileGetStream( pSrcFile, &pSrcStream, streamtypeVIDEO, 0 );
if( hr != 0 )
return;
hr = AVIStreamInfo( pSrcStream, &SrcStreamInfo, sizeof(AVISTREAMINFO) );
if( SrcStreamInfo.fccType == streamtypeVIDEO )
{
hr = AVIStreamFormatSize( pSrcStream, 0, &lStreamSize );
pSrcBmpInfo = (BITMAPINFOHEADER*)new char[lStreamSize];
hr = AVIStreamReadFormat( pSrcStream, 0, pSrcBmpInfo, &lStreamSize );
}
//创建新的AVI文件
hr = AVIFileOpen( &pDstFile, "C:\\Downloads\\hld_1.avi", OF_WRITE|OF_CREATE, NULL );
hr = AVIFileCreateStream( pDstFile, &pDstStream, &SrcStreamInfo );
hr = AVIStreamSetFormat( pDstStream, 0, pSrcBmpInfo, lStreamSize );
long lReadBytes, lReadFrames, i;
char* pStreamBuf = new char[pSrcBmpInfo->biSizeImage];
for( i = AVIStreamStart(pSrcStream); i < AVIStreamEnd(pSrcStream); i++ )
{
DWORD dwKey = 0;
if( AVIStreamIsKeyFrame( pSrcStream, i ) )
dwKey = AVIIF_KEYFRAME;
hr = AVIStreamRead( pSrcStream, i, 1, pStreamBuf, pSrcBmpInfo->biSizeImage,
&lReadBytes, &lReadFrames );
hr = AVIStreamWrite( pDstStream, i, lReadFrames, pStreamBuf,
lReadBytes, dwKey, &lReadFrames, &lReadBytes );
}
AVIStreamRelease( pDstStream );
AVIFileRelease( pDstFile );
AVIStreamRelease( pSrcStream );
AVIFileRelease( pSrcFile );
delete [] pStreamBuf;