如何在FFmpeg C/C++中寻找

DRi*_*FTy 15 c c++ ffmpeg video-processing

有没有人知道如何在FFmpeg中实现秒(或毫秒)的搜索.我目前有一个使用av_read_frame()运行视频帧的循环,我想确定此帧应该以秒为单位的时间.如果它到达某个点,那么我想寻找视频中的稍后点.顺便说一下,它不是一个视频播放器,只是处理帧.我听说我应该可以从数据包中获取dts或pts,但它总是返回0.

Mar*_*ett 13

注意:这已经过时了,它应该仍然有效,但现在av_seek_frame()可以正式进行.

我没有写这个,但这里有一些来自我的样本的代码

bool seekMs(int tsms)
{
   //printf("**** SEEK TO ms %d. LLT: %d. LT: %d. LLF: %d. LF: %d. LastFrameOk: %d\n",tsms,LastLastFrameTime,LastFrameTime,LastLastFrameNumber,LastFrameNumber,(int)LastFrameOk);

   // Convert time into frame number
   DesiredFrameNumber = ffmpeg::av_rescale(tsms,pFormatCtx->streams[videoStream]->time_base.den,pFormatCtx->streams[videoStream]->time_base.num);
   DesiredFrameNumber/=1000;

   return seekFrame(DesiredFrameNumber);
}

bool seekFrame(ffmpeg::int64_t frame)
{

   //printf("**** seekFrame to %d. LLT: %d. LT: %d. LLF: %d. LF: %d. LastFrameOk: %d\n",(int)frame,LastLastFrameTime,LastFrameTime,LastLastFrameNumber,LastFrameNumber,(int)LastFrameOk);

   // Seek if:
   // - we don't know where we are (Ok=false)
   // - we know where we are but:
   //    - the desired frame is after the last decoded frame (this could be optimized: if the distance is small, calling decodeSeekFrame may be faster than seeking from the last key frame)
   //    - the desired frame is smaller or equal than the previous to the last decoded frame. Equal because if frame==LastLastFrameNumber we don't want the LastFrame, but the one before->we need to seek there
   if( (LastFrameOk==false) || ((LastFrameOk==true) && (frame<=LastLastFrameNumber || frame>LastFrameNumber) ) )
   {
      //printf("\t avformat_seek_file\n");
      if(ffmpeg::avformat_seek_file(pFormatCtx,videoStream,0,frame,frame,AVSEEK_FLAG_FRAME)<0)
         return false;

      avcodec_flush_buffers(pCodecCtx);

      DesiredFrameNumber = frame;
      LastFrameOk=false;
   }
   //printf("\t decodeSeekFrame\n");

   return decodeSeekFrame(frame);

   return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 我不相信这段代码适用于非AVI的格式.我没有测试过代码,但我观察到时间戳与MOV文件的帧号不相同,正如此代码所暗示的那样.此外,`avformat_seek_file()`目前在文档中有一条说明不要使用它. (2认同)