ffmpeg - av_read_frame 之后 ffmpeg 中的数据包大小

标签 ffmpeg

我对 ffmpeg 有以下疑问。请澄清。

1.我正在使用 ffmpeg 读取 mp4 文件,并在执行 av_read_frame 之后 我收到视频(stream_index = 0),音频(stream_index = 1)数据包 首先,视频/音频数据包的到来没有顺序。这是标准情况吗?

2.视频数据包的大小不同,从最小 14 到最大 21824。请指出视频数据包大小变化的原因,在哪里 写道,对于视频来说,一个数据包意味着一帧,因此如果对于视频 pkt->size = 14 也等于视频的一帧。(pkt 是 AVPacket 类型)。

3.如果我们在 Probe 函数中对传入的 mp4 流进行解复用,同时解析它并将信息存储在某个缓冲区中或调用 av_read_frame 将其解复用。

4. ffmpeg 是否可以对 mp4 文件进行解复用,然后在一个数据包流中分配 a/v,其中视频数据包的stream_index = 1,音频数据包 = 0。 或者它必须位于单独的流中。

5.ffmpeg处理传输流和mp4文件的区别。 如果两者都被解复用,则以相同的方式解码还是不同。

问候 玛雅克

最佳答案

媒体文件是从多个流创建的。流可以有多种类型。音频、视频、字幕、元数据等。但一个流不能有多种类型。

1) av_read_frame 将(通常)按照帧写入文件的顺序返回帧。如果创建文件的软件没有单调地混合它们,则您无法单调地读取它。

2) 这正是视频压缩的工作原理。编解码器仅存储帧之间的变化。如果运动非常少,则一帧可能与前一帧非常相似,因此增量非常小。

3) 这不是一个问题。

4) 没有。

5)很大程度上,不。但文件类型存在一些差异。 mp4 需要随机访问,而 TS 则不需要。

关于ffmpeg - av_read_frame 之后 ffmpeg 中的数据包大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21089814/

相关文章:

c++ - 如何在 C++ 中使用 ffmpeg 获取视频的 fps?

FFmpeg - 非单调递增的 dts 是什么意思?

ffmpeg - 加快Android中的FFmpeg处理时间

gcc - 在 Minibian 上使用 x265 和 fdk-aac 编译 ffmpeg - 未找到依赖项

android - 使用 android studio 构建共享库(关于 FFMPEG/Libav 快速傅里叶变换)

android - 使用 ffmpeg 混合音频和视频

c++ - 视频太快 FFmpeg

ffmpeg 结合了 2 个过滤器(带有 lavfi、-vf 和 -complex_filter)

compiler-errors - ffmpeg H264 avi 文件获取帧时间戳?? UINT64_C 错误

android - 如何使用 ffmpeg 到 android 在 android 中获取视频文件的帧