具体调用如下:
CFileDialog l_FileOpen(TRUE, NULL,
NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"AVI File(*.avi)|*.avi",
this);
UINT l_bFDRes=l_FileOpen.DoModal();
if(l_bFDRes==IDOK)
{
m_strFilePath = l_FileOpen.GetPathName();
}
else
{
m_strFilePath = _T("");
AfxMessageBox("请选择一个播放文件!");
}
AVIFileInit();
HRESULT hr;
PAVIFILE pAVIFile = NULL;
hr=AVIFileOpen(&pAVIFile,m_strFilePath,OF_READ,NULL);
if(hr != AVIERR_OK)
{
if(pAVIFile != NULL)
AVIFileRelease(pAVIFile);
return;
}
AVIFILEINFO avi_info;
AVIFileInfo(pAVIFile,&avi_info,sizeof(AVIFILEINFO));
CString szFileInfo;
szFileInfo.Format("Dimention: %d*%d/n"
"Length: %d frames/n"
"Max bytes per second: %d/n"
"Samples per second: %d/n"
"Streams: %d/n"
"File Type: %d",
avi_info.dwWidth,
avi_info.dwHeight,
avi_info.dwLength,
avi_info.dwMaxBytesPerSec,
(DWORD)(avi_info.dwRate / avi_info.dwScale),
avi_info.dwStreams,
avi_info.szFileType);
// AfxMessageBox(szFileInfo);
DWORD dwVideoWidth = avi_info.dwWidth;
DWORD dwVideoHeight = avi_info.dwHeight;
DWORD dwFrameRate = (DWORD)(avi_info.dwRate / avi_info.dwScale);
// Extract stream
PAVISTREAM pVideoStream;
hr=AVIFileGetStream(pAVIFile,&pVideoStream,streamtypeVIDEO,0);
if(hr != AVIERR_OK)
{
if(pVideoStream != NULL)
AVIStreamRelease(pVideoStream);
AVIFileExit();
return;
}
BYTE* pVideoStreamBuf = new BYTE[dwVideoWidth*dwVideoHeight*3];
if(pVideoStreamBuf == NULL)
return;
ZeroMemory(pVideoStreamBuf,dwVideoWidth*dwVideoHeight*3);
long lReadBytes = 0;
long lReadFrames = 0;
int i = 0;
for(i= AVIStreamStart(pVideoStream);i<AVIStreamEnd(pVideoStream);i++)
{
int nRet = AVIStreamRead(pVideoStream,i,1,pVideoStreamBuf,dwVideoWidth*dwVideoHeight*3,&lReadBytes,&lReadFrames);
Sleep(1000/dwFrameRate);
if(nRet == 0)
{
// 视频数据送去解码显示
}
}
//////////////////////////////////////////////////////////////////////////
//用于做测试,功能未完善,需要做音视频同步,而不是读完视频后再读音频
// Extract Audio stream
PAVISTREAM pAudioStream;
hr=AVIFileGetStream(pAVIFile,&pAudioStream,streamtypeAUDIO,0);
if(hr != AVIERR_OK)
{
if(pAudioStream != NULL)
AVIStreamRelease(pAudioStream);
AVIFileExit();
return;
}
AVISTREAMINFO AudioInfo;
AVIStreamInfo(pAudioStream,&AudioInfo,sizeof(AVISTREAMINFO));
CString strAudioInfo = _T("");
strAudioInfo.Format("Type:%d,dwRate:%d,dwSampleSize:%d,dwSuggestedBufferSize:%d",
AudioInfo.fccHandler,
AudioInfo.dwRate,
AudioInfo.dwSampleSize,
AudioInfo.dwSuggestedBufferSize);
// AfxMessageBox(strAudioInfo);
BYTE* pAudioStreamBuf = new BYTE[1024];
if(pAudioStreamBuf == NULL)
return;
ZeroMemory(pAudioStreamBuf,1024);
for(i= AVIStreamStart(pAudioStream);i<AVIStreamEnd(pAudioStream);i++)
{
int nRet = AVIStreamRead(pAudioStream,i,1,pAudioStreamBuf,8000,&lReadBytes,&lReadFrames);
if(nRet == 0)
{
DT("lReadBytes:%d",lReadBytes);
//m_MngPlay.DealAudioStream(pAudioStreamBuf,lReadBytes);
// 音频数据送去解码播放
}
}
if(NULL != pVideoStreamBuf)
{
delete[] pVideoStreamBuf;
pVideoStreamBuf = NULL;
}
AVIFileRelease(pAVIFile);
pAVIFile=NULL;