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

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

注意:这已经过时了,它应该仍然可以工作,但现在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; }