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

本文介绍如何使用AVIFile API从AVI文件中读取视频和音频流,并展示了如何获取AVI文件的基本信息,如分辨率、帧数等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

具体调用如下:

 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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值