type
status
date
slug
summary
tags
category
icon
password
Property
Mar 19, 2023 09:27 AM

解封装基础知识

notion image
notion image
  • avformat_close_input avformat_free_context:内部包含了 avformat_free_context ,你调 avformat_close_input 函数关闭一个已打开的输入文件时,FFmpeg 会释放输入文件的所有资源,包括输入流、编解码器、封装器和 AVFormatContext 结构体。因此,使用完毕输入文件后,应该调用 avformat_close_input 函数来关闭文件并释放相关资源。需要注意的是,一旦你调用了avformat_close_input 函数,你就不能再使用 AVFormatContext 结构体或与其相关的资源。如果你还需要访问这些资源,则需要在使用完毕输入文件后,直接调用 avformat_free_context 函数来释放相关资源。
    • notion image
  • av_open_input :打开一个输入文件并读取其中的数据流信息,为后续的解码工作做准备avformat_find_stream_info :用来查找媒体文件中的所有流的相关信息,例如编解码器类型、时长、分辨率、码率等。在读取媒体文件之前,需要先调用此函数
    • notion image
       
  • av_find_best_stream : 区分码流
    • notion image
  • av_dump_format :用于打印音视频文件格式信息的函数,它可以将音视频文件的媒体信息、编码格式、封装格式等信息输出到控制台
    • 参数说明:
      • fmt_ctx:AVFormatContext类型的指针,表示要输出的音视频文件的格式上下文。
      • index:表示要输出的音视频流的索引,如果为负数,表示输出所有音视频流的信息。
      • url:表示要输出的音视频文件的文件名。
      • is_output:表示要输出的音视频文件是输入文件还是输出文件,取值为0或1,0表示输入文件,1表示输出文件。
    • 使用示例:
      • 输出示例:
        • notion image

    解封装流程

    notion image
    • 也可以不使用 avformat_alloc_context AVFormatContext 分配内存,因为当 AVFormatContext 为 NULL 时,avformat_open_input 内部会进行判断并分配内存:
      • notion image
    • 若打开网络流,需在 avformat_open_input 前初始化网络模块(只打开本地文件则不需要):

      获取媒体信息

      • 获取文件路径、流索引、码率、总时长:
        • notion image
      • 获取视频或音频码流信息:
        • notion image
      • 从媒体文件读取数据包,并获取相关信息:
        • notion image
        • pkt->duration 表示当前读取的 packet 在时间轴上持续的时间长度,单位是 AVStream->time_base,是一个分数,因此需要用 av_q2d 将其转化为以秒为单位的浮点数。 ifmt_ctx->streams[videoindex]->time_base 表示视频流的时间基准,用于将 packet 的 duration 转化为实际的秒数。最终计算结果表示视频 packet 在时间轴上持续的实际时间长度,单位是秒。
          • notion image
        • 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转换为实际的时间单位。

          解封装测试代码

      校招答疑分享Linux 翻墙指南