音视频教程-第三节
💡
原文中文,约10600字,阅读约需26分钟。
📝
内容提要
本文介绍了如何解析媒体文件中的流,获取编码信息,识别视频和音频流,并统计其参数。重点讨论了AVStream和AVCodecParameters结构体的使用,包括流类型判断、帧率获取和流时长计算等。实践内容涵盖遍历流、获取视频和音频信息、识别主流及统计流信息,并提供了常见问题解答。
🎯
关键要点
- AVStream 结构体表示媒体流,每个流对应一个 AVStream,包含流索引、流 ID、编码参数、时间基、流时长等信息。
- AVCodecParameters 结构体包含流的编码参数信息,流类型、编码格式 ID、码率等字段。
- 使用 AVCodecParameters->codec_type 判断流类型,支持视频流、音频流和字幕流。
- 视频流的帧率可以通过 r_frame_rate 和 avg_frame_rate 获取,推荐使用 avg_frame_rate。
- 时间基用于时间戳转换,流的时长以时间基为单位,计算流的实际时长的方法包括使用 av_q2d 转换时间基。
- 实践内容包括遍历流、获取视频和音频信息、识别主流及统计流信息。
- 常见问题解答涵盖流类型判断、帧率获取、声道数、编码格式名称、流的时长转换等。
- 一个文件可以有多个视频流或音频流,通常第一个找到的流是主流,但也可以通过 disposition 标志判断。
❓
延伸问答
AVStream 结构体包含哪些主要字段?
AVStream 结构体包含流索引、流 ID、编码参数、时间基和流时长等信息。
如何判断一个流是视频流还是音频流?
使用 AVCodecParameters->codec_type 判断,视频流为 AVMEDIA_TYPE_VIDEO,音频流为 AVMEDIA_TYPE_AUDIO。
如何获取视频流的帧率?
推荐使用 avg_frame_rate,通过 AVRational 类型转换为浮点数获取帧率。
流的时长如何转换为秒?
可以使用 av_q2d 转换时间基,然后乘以流的 duration,或手动计算。
一个文件可以有多个视频流或音频流吗?
是的,某些容器格式支持多个视频流和音频流,通常第一个找到的流是主流。
如何获取音频流的声道数?
使用 ch_layout.nb_channels 获取音频流的声道数。
➡️