流搜索顺序对 ffmpeg av_seek_frame() 是否重要?
Does stream seek order matter for ffmpeg av_seek_frame()?
我正在尝试使用 ffmpeg av_seek_frame
方法寻找 mp4 的音频和视频流。
我在搜索时遇到了一个问题,我已经通过更改我的搜索顺序进行了补救,但我想确保我的修复确实是一个修复,而不是一些巧合的 hack。
我正在尝试寻找第一个数据包的音频和视频流。对于视频,第一个数据包的 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 调用的顺序是否真的重要,或者我的代码中是否存在其他地方的错误恰好被这个错误掩盖了?
搜索影响所有流。搜索请求由多路分解器处理。它将移动到文件或多路复用流中的某个点。随后的多路分解将为您提供从那时起的数据包。不支持在 dexmed 流中单独查找。
对于您的用例,您可以寻求多路分解将为您提供所需的所有数据包,然后跳过那些太早的数据包。
所以是的,上面示例代码中的顺序很重要。但这只是因为音频和视频数据包恰好存储在您的 mp4 文件中的方式。
我正在尝试使用 ffmpeg av_seek_frame
方法寻找 mp4 的音频和视频流。
我在搜索时遇到了一个问题,我已经通过更改我的搜索顺序进行了补救,但我想确保我的修复确实是一个修复,而不是一些巧合的 hack。
我正在尝试寻找第一个数据包的音频和视频流。对于视频,第一个数据包的 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 调用的顺序是否真的重要,或者我的代码中是否存在其他地方的错误恰好被这个错误掩盖了?
搜索影响所有流。搜索请求由多路分解器处理。它将移动到文件或多路复用流中的某个点。随后的多路分解将为您提供从那时起的数据包。不支持在 dexmed 流中单独查找。
对于您的用例,您可以寻求多路分解将为您提供所需的所有数据包,然后跳过那些太早的数据包。
所以是的,上面示例代码中的顺序很重要。但这只是因为音频和视频数据包恰好存储在您的 mp4 文件中的方式。