gpt4 book ai didi

无法使用 avformat_seek_file 获取第一帧

转载 作者:太空宇宙 更新时间:2023-11-04 03:50:00 26 4
gpt4 key购买 nike

我想使用 libav 在视频中寻找任意帧.更准确地说,使用函数 avformat_seek_file ,显然使用 av_seek_frame内部。

我想进行反向搜索(即在我寻找的帧之前获取最接近的可能帧),这样我就可以继续前进,直到找到精确我想要的那个。为此,我使用如下函数:

avformat_seek_file(..., ...,
std::numeric_limits<boost::int64_t>::min(),
target_pts,
target_pts,
...);

这意味着我不能容忍找到在我的 target_pts 之后的帧,但我很高兴找到之前的任何帧。

我正在使用 Big Buck Bunny videos供测试用。使用 480p H.264 视频,我可以搜索任何 pts没有什么问题。但是使用 480p OGG 视频,我不能。实际上,我可以在 pts = 73 之后寻找任何帧,但不是以前。求pts = 0将视频设置为 pts = 73 .

有人可能会认为流实际上是从 pts = 73 开始的。 ,但这不是<stream>.start_time返回。此外,如果我只加载视频并按顺序读取帧,我可以毫无问题地获取前 73 帧。问题是我永远无法通过使用 avformat_seek_file 回到这些框架之一。 .

最后一点:如果我使用标志 AVSEEK_FLAG_ANY ,然后就可以了。但这可能会导致我只解码我想要的帧的一部分,这对我来说不是解决方案。

谁能解释一下这种奇怪的行为?

最佳答案

这可能是一个老问题,但这个答案是为遇到同样问题的人准备的。

旧的 av_seek_frame 函数使用 AVSEEK_FLAG_BACKWARD 标志来寻找时间戳小于或等于目标时间戳的帧。默认情况下,此函数将寻找时间戳等于或大于目标时间戳的帧。新的 avformat_seek_file 函数的文档表明这个标志被忽略了。

If flags contain AVSEEK_FLAG_ANY, then non-keyframes are treated as keyframes (this may not be supported by all demuxers). If flags contain AVSEEK_FLAG_BACKWARD, it is ignored.

正如我们在下面的源代码中看到的那样。

2156     if (s->seek2any>0)
2157 flags |= AVSEEK_FLAG_ANY;
2158 flags &= ~AVSEEK_FLAG_BACKWARD;

avformat_seek_file 函数退回到 av_seek_frame 时会出现问题,正如您提到的,需要再次设置 AVSEEK_FLAG_BACKWARD 标志。仅当目标时间戳和最小时间戳之间的差异大于最大时间戳和目标时间戳之间的差异时才会发生这种情况。

 2187     // Fall back on old API if new is not implemented but old is.
2188 // Note the old API has somewhat different semantics.
2189 if (s->iformat->read_seek || 1) {
2190 int dir = (ts - (uint64_t)min_ts > (uint64_t)max_ts - ts ? AVSEEK_FLAG_BACKWARD : 0);
2191 int ret = av_seek_frame(s, stream_index, ts, flags | dir);
2192 if (ret<0 && ts != min_ts && max_ts != ts) {
2193 ret = av_seek_frame(s, stream_index, dir ? max_ts : min_ts, flags | dir);
2194 if (ret >= 0)
2195 ret = av_seek_frame(s, stream_index, ts, flags | (dir^AVSEEK_FLAG_BACKWARD));
2196 }
2197 return ret;
2198 }

换句话说,ts - min_ts 溢出是因为您使用的是最小的 int64 值,它确保永远不会设置 AVSEEK_FLAG_BACKWARD 标志。为什么不使用零呢?

关于无法使用 avformat_seek_file 获取第一帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21475397/

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