音视频教程-第三节
内容提要
本文介绍了如何解析媒体文件中的流,获取编码信息,识别视频和音频流,并统计其参数。重点讨论了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 获取音频流的声道数。