gpt4 book ai didi

ffmpeg - 是否保证整个流的数据包持续时间是统一的?

转载 作者:行者123 更新时间:2023-12-04 22:51:07 26 4
gpt4 key购买 nike

我使用数据包持续时间从帧索引转换为 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 (annex-b) 和 yuv4mpeg 浮现在脑海。但是其他容器,如 flv、mp4、ts,每个帧都有一个 PTS/DTS(或 CTS)。源可能是可变帧速率,或者由于带宽原因,在处理过程中的某个时刻可能会丢弃帧。还有一些编解码器会删除重复的帧。

因此,除非您自己创建文件。不要相信它。除了从头开始计数之外,没有保证可以查看帧并知道其“索引”的方法。

但是,您的方法对于大多数文件可能已经足够了。

关于ffmpeg - 是否保证整个流的数据包持续时间是统一的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20554061/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com