利用微软的avi文件操作函数读取avi文件

来源:互联网 发布:得利宝高收益网络理财 编辑:程序博客网 时间:2024/04/25 23:48

具体调用如下:

 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;