是否保证整个流的数据包持续时间是一致的



我使用数据包持续时间从帧索引转换为pts并返回,我希望确保这是一种可靠的方法

或者,有没有更好的方法将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;
}

否,不保证。它可以与某些编解码器/容器组合一起工作,其中帧速率是静态的。想到的是avi、h264 raw(附件b)和yuv4mpeg。但其他容器,如flv、mp4、ts,对每个帧都有一个PTS/DTS(或CTS)。源可以是可变的帧速率,或者由于带宽的原因,帧可能在处理过程中的某个时刻被丢弃。此外,一些编解码器会删除重复的帧。

所以除非你自己创建文件。不要相信它。除了从头开始和计数之外,没有任何方法可以保证查看帧并了解其"索引"。

然而,您的方法可能对大多数文件都足够好。

最新更新