我使用数据包持续时间从帧索引转换为pts和back,我想确保这是一个可靠的方法。
或者,是否有更好的方法将pts转换为帧索引,反之亦然?
显示我用法的摘录:
bool seekFrame(int64_t frame)
{
if(frame > container.frameCount)
frame = container.frameCount;
// Seek to a frame behind the desired frame because nextFrame() will also increment the frame index
int64_t seek = pts_cache[frame-1]; // pts_cache is an array of all frame pts values
// get the nearest prior keyframe
int preceedingKeyframe = av_index_search_timestamp(container.video_st, seek, AVSEEK_FLAG_BACKWARD);
// here's where I'm worried that packetDuration isn't a reliable method of translating frame index to
// pts value
int64_t nearestKeyframePts = preceedingKeyframe * container.packetDuration;
avcodec_flush_buffers(container.pCodecCtx);
int ret = av_seek_frame(container.pFormatCtx, container.videoStreamIndex, nearestKeyframePts, AVSEEK_FLAG_ANY);
if(ret < 0) return false;
container.lastPts = nearestKeyframePts;
AVFrame *pFrame = NULL;
while(nextFrame(pFrame, NULL) && container.lastPts < seek)
{
;
}
container.currentFrame = frame-1;
av_free(pFrame);
return true;
}
答案 0 :(得分:0)
不,不保证。它可以与某些编解码器/容器组合一起使用,其中帧速率是静态的。想到了avi,h264 raw(annex-b)和yuv4mpeg。但是其他容器如flv,mp4,ts,每个帧都有一个PTS / DTS(或CTS)。源可以是可变帧速率,或者由于带宽而在处理期间的某些点处可能丢弃帧。此外,一些编解码器将删除重复的帧。
所以除非你自己创建文件。不要相信它。除了从头开始和计数之外,没有保证看待帧并知道它的'索引'的方法。
您的方法可能对大多数文件都足够好。