type
status
date
slug
summary
tags
category
icon
password
Property
Mar 19, 2023 09:27 AM
解封装基础知识


avformat_close_input
和avformat_free_context
:内部包含了avformat_free_context
,你调avformat_close_input
函数关闭一个已打开的输入文件时,FFmpeg 会释放输入文件的所有资源,包括输入流、编解码器、封装器和 AVFormatContext 结构体。因此,使用完毕输入文件后,应该调用avformat_close_input
函数来关闭文件并释放相关资源。需要注意的是,一旦你调用了avformat_close_input
函数,你就不能再使用 AVFormatContext 结构体或与其相关的资源。如果你还需要访问这些资源,则需要在使用完毕输入文件后,直接调用avformat_free_context
函数来释放相关资源。

av_open_input
:打开一个输入文件并读取其中的数据流信息,为后续的解码工作做准备avformat_find_stream_info
:用来查找媒体文件中的所有流的相关信息,例如编解码器类型、时长、分辨率、码率等。在读取媒体文件之前,需要先调用此函数

av_find_best_stream
: 区分码流

av_dump_format
:用于打印音视频文件格式信息的函数,它可以将音视频文件的媒体信息、编码格式、封装格式等信息输出到控制台- 参数说明:
fmt_ctx
:AVFormatContext类型的指针,表示要输出的音视频文件的格式上下文。index
:表示要输出的音视频流的索引,如果为负数,表示输出所有音视频流的信息。url
:表示要输出的音视频文件的文件名。is_output
:表示要输出的音视频文件是输入文件还是输出文件,取值为0或1,0表示输入文件,1表示输出文件。- 使用示例:
- 输出示例:

解封装流程

- 也可以不使用
avformat_alloc_context
为AVFormatContext
分配内存,因为当AVFormatContext
为 NULL 时,avformat_open_input
内部会进行判断并分配内存:

- 若打开网络流,需在
avformat_open_input
前初始化网络模块(只打开本地文件则不需要):
获取媒体信息
- 获取文件路径、流索引、码率、总时长:

- 获取视频或音频码流信息:

- 从媒体文件读取数据包,并获取相关信息:
pkt->duration
表示当前读取的 packet 在时间轴上持续的时间长度,单位是 AVStream->time_base,是一个分数,因此需要用 av_q2d 将其转化为以秒为单位的浮点数。ifmt_ctx->streams[videoindex]->time_base
表示视频流的时间基准,用于将 packet 的 duration 转化为实际的秒数。最终计算结果表示视频 packet 在时间轴上持续的实际时间长度,单位是秒。time_base
:在音视频编解码中,时间戳是一个非常重要的概念,可以用来表示音视频帧的时序关系。为了让各种视频格式、音频格式之间的时间戳能够相互转换,FFmpeg在内部定义了一个统一的时间基准值。这个基准值称为 time_base,是一个AVRational类型的结构体。- AVRational是FFmpeg中表示有理数的结构体,包含两个成员变量num和den,表示分子和分母。它的数值表示实际时间和time_base时间之间的换算关系。
- 在解封装时,多媒体文件中不同的流可能使用不同的time_base值,因此需要根据每个流的time_base对pts和dts进行转换,以便正确地表示出每一帧的时间戳。例如,video duration的计算中使用了ifmt_ctx->streams[videoindex]->time_base,就是为了将AVPacket中的duration转换为实际的时间单位。


解封装测试代码
- 作者:OctalZero
- 链接:https://octalzero.com/article/904f3a57-61ad-47e1-bcf6-dd7c3ef384a4
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章