我正在尝试使用ffmpeg av_seek_frame
方法同时搜索mp4的音频和视频流。
我在寻求时遇到了一个问题,即我已通过更改搜索顺序来进行补救,但是我想确保我的修复程序实际上是一种修复程序,而不是某些偶然的黑客手段。
我正在尝试将音频和视频流同时查找到第一个数据包。对于视频,第一个数据包的点为0。对于音频,第一个数据包的点为-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调用的顺序实际上是否重要,或者在我的代码中是否有其他错误可以掩盖?
答案 0 :(得分:1)
寻找会影响所有流。查找请求由解复用器处理。它将移动到文件或多路复用流中的某个点。随后的解复用将从该点开始为您提供数据包。不支持在右播流中单独搜索。
对于您的用例,您可以寻求一种解复用的功能,它将为您提供所需的所有数据包,但是跳过那些太早的数据包。
是的,上面示例代码中的顺序很重要。但这仅是因为音频和视频数据包恰好存储在mp4文件中的方式。