首页 > 解决方案 > ffmpeg av_seek_frame() 的流搜索顺序是否重要?

问题描述

我正在尝试使用 ffmpegav_seek_frame方法为 mp4 寻找音频和视频流。

我在寻找时遇到了一个问题,我已经通过更改我的寻找顺序进行了补救,但我想确保我的修复实际上是一个修复,而不是一些巧合的破解。

我正在尝试寻找第一个数据包的音频和视频流。对于视频,第一个数据包的 pts 为 0。对于音频,第一个数据包的 pts 为 -1024。视频流的索引为 0,音频流的索引为 1。这一切都已在媒体文件上使用 ffprobe 进行验证,以查看数据包和流。

以下代码不起作用,它将音频和视频流都搜索到 pts 为 0 的数据包:

for (int i = format_context->nb_streams - 1; i >= 0; --i) {
    AVStream* stream = format_context->streams[i];
    av_seek_frame(format_context, i, stream->first_dts, flags);
}

但这会正确地将视频流搜索到 pts 0 并将音频流搜索到 pts -1024:

for (int i = 0; i < format_context->nb_streams; ++i) {
    AVStream* stream = format_context->streams[i];
    av_seek_frame(format_context, i, stream->first_dts, flags);
}

请注意,在第一个示例中,在视频之前搜索音频,在第二个示例中,在音频之前搜索视频。

av_seek_frame 调用的顺序是否真的很重要,或者我的代码中的其他地方是否存在恰好被掩盖的错误?

标签: caudiovideoffmpegdecoding

解决方案


搜索影响所有流。寻道请求由解复用器处理。它将移动到文件或多路复用流中的某个点。随后的解复用将从那时起为您提供数据包。不支持在 dexmed 流中单独查找。

对于您的用例,您可以寻求解复用将为您提供所需的所有数据包,但随后跳过那些为时过早的数据包。

所以是的,上面示例代码中的顺序确实很重要。但这只是因为音频和视频数据包碰巧存储在您的 mp4 文件中的方式。


推荐阅读