有没有人知道如何在FFmpeg中按秒(或毫秒)实现查找功能。我目前正在使用av_read_frame()循环读取视频帧,并想确定这一帧应该在几秒钟内。如果它达到一定点,则希望跳转到视频的后面某个时间点。顺便说一下,这不是一个视频播放器,只是处理视频帧。我听说可以从packet中获取dts或pts,但它总是返回0。
有没有人知道如何在FFmpeg中按秒(或毫秒)实现查找功能。我目前正在使用av_read_frame()循环读取视频帧,并想确定这一帧应该在几秒钟内。如果它达到一定点,则希望跳转到视频的后面某个时间点。顺便说一下,这不是一个视频播放器,只是处理视频帧。我听说可以从packet中获取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;
}
LastLastFrameNumber
和 LastFrameNumber
是如何被设置或计算的吗? - Ryan