c - 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 调用的顺序是否真的很重要,或者我的代码中的其他地方是否存在恰好被掩盖的错误?
解决方案
搜索影响所有流。寻道请求由解复用器处理。它将移动到文件或多路复用流中的某个点。随后的解复用将从那时起为您提供数据包。不支持在 dexmed 流中单独查找。
对于您的用例,您可以寻求解复用将为您提供所需的所有数据包,但随后跳过那些为时过早的数据包。
所以是的,上面示例代码中的顺序确实很重要。但这只是因为音频和视频数据包碰巧存储在您的 mp4 文件中的方式。
推荐阅读
- ios - iPhone 本身可以充当 NFC 标签吗?
- r - 使用 knitr::include_graphics 将图像插入 RMarkdown 时替换文本?
- php - 如何使用 MySql 查询返回数组值(来自 PHP)
- c# - 在异步循环中等待上一项
- intellij-idea - 如何关闭 SQL 文件中的数据库导航器建议
- installation - 后期 kubernetes 安装支持
- javascript - 量角器将javascript导入打字稿测试
- javascript - 在 React v15.5.4 中将自定义属性设置为 DOM 元素
- amazon-web-services - 无法删除 Amazon S3 存储桶
- neural-network - PyTorch Net.train() 无法建立连接 - 为什么?