第一章 音视频-FFmpeg解码流程和对应结构参数意义

第一章 音视频-FFmpeg解码流程和对应结构参数意义

第一章 音视频-FFmpeg解码流程和对应结构参数意
第二章 音视频-FFmpeg对应解析格式说明
第三章 音视频-FFmpeg对应AVFrame解码处理思路和用途
第四章 音视频-FFmpeg实现播放器思维
第五章 音视频-FFmpeg实现播放器解封装、读AVPacket包
第六章 音视频-FFmpeg实现播放器解码和对应数据处理

媒体文件FFmpeg对应格式

正常媒体文件常用flv、mp4等,对应第一步解封装,查看封装是什么,然后找到对应的流,通过流判断音视频进行解码。
在这里插入图片描述

FFmpeg解码步骤

在这里插入图片描述

  • avformat_open_input 是 FFmpeg 库中的一个函数,它的主要作用是打开一个多媒体文件并且将其解析成一个 AVFormatContext 结构。这个结构包含了媒体文件的元数据信息,比如媒体流的数量、编解码器信息、时长、格式等等。通过调用 avformat_open_input 函数,你可以打开音视频文件、图像序列等多种格式的文件,然后就可以使用 FFmpeg 库的其他函数来对文件进行解码、编码、处理等操作。
  • avformat_find_stream_info 函数是 FFmpeg 库中的一个重要函数,它的作用是在打开的媒体文件中获取流信息。在调用 avformat_open_input 打开一个媒体文件之后,通常需要调用 avformat_find_stream_info 来读取文件中的流信息,并且会试解码,包括视频流、音频流、字幕流等。这个函数会分析媒体文件中的所有流,并且将这些流的详细信息填充到 AVStream 结构体中,比如流的编解码器、时长、码率、分辨率等信息。
  • av_read_frame 函数是 FFmpeg 库中用于读取媒体文件中的一帧数据的函数。它的作用是从已经打开的媒体文件中读取下一帧的数据,并且将这些数据填充到 AVPacket 结构体中。

FFmpeg对应结构体说明

AVFormatContext结构体

AVFormatContext 结构体在 FFmpeg 中是一个非常重要的结构体,它包含了对媒体文件进行操作所需的各种信息。以下是 AVFormatContext 结构体中的一些重要参数及其说明:

  1. iformat/ oformat: 输入(input)/输出(output)的格式(AVInputFormat/AVOutputFormat)。这些成员变量指向输入或输出的格式,用于表示媒体文件的容器格式(如 AVI、MP4 等)。

  2. pb: I/O 上下文(AVIOContext)。指向用于读写媒体文件的 I/O 上下文,负责实际的文件 I/O 操作。

  3. streams: 媒体流数组(AVStream *streams[MAX_STREAMS])。指向一个数组,包含了媒体文件中的所有流(视频、音频、字幕等)。

  4. nb_streams: 媒体流的数量(int nb_streams)。表示媒体文件中流的数量。

  5. duration: 媒体文件的时长(int64_t duration)。以微秒为单位表示的媒体文件的总时长。

  6. start_time: 媒体文件的起始时间(int64_t start_time)。以微秒为单位表示的媒体文件的起始时间。

  7. bit_rate: 媒体文件的比特率(int64_t bit_rate)。表示媒体文件的平均比特率。

  8. filename: 媒体文件名(char filename[1024])。存储打开的媒体文件的文件名。

  9. metadata: 元数据(AVDictionary *metadata)。指向一个字典,存储了媒体文件的元数据信息,比如标题、作者、日期等。

  10. streams:一个指针数组,包含了该媒体文件中所有的流。每个元素都是一个指向 AVStream 结构体的指针。

这些是 AVFormatContext 结构体中的一些重要参数及其说明,这些参数包含了媒体文件的基本信息、流信息等,为媒体文件的读取、解析、解码等操作提供了必要的信息。

AVStream结构体

AVStream 结构体在 FFmpeg 中用于表示媒体流(视频流、音频流、字幕流等)的信息。以下是 AVStream 结构体中一些重要参数的说明:

  1. index:

    • int index: 流的索引,表示在 AVFormatContext 中的流数组中的位置。
  2. id:

    • int id: 流的唯一标识符,用于识别流。
  3. codecpar:

    • AVCodecParameters *codecpar: 指向一个 AVCodecParameters 结构体的指针,包含了流的编解码器参数信息,比如编码格式、分辨率、帧率等。
  4. time_base:

    • AVRational time_base: 表示流中时间单位的分数,用于将时间戳转换为时间值。例如,如果 time_base(1, 1000),则时间戳单位为毫秒。
  5. start_time:

    • int64_t start_time: 流的起始时间,以 AV_TIME_BASE 为单位。
  6. duration:

    • int64_t duration: 流的时长,以 AV_TIME_BASE 为单位。
  7. nb_frames:

    • int nb_frames: 流中帧的数量。
  8. disposition:

    • int disposition: 表示流的属性,比如是否是主音频流、主视频流、是否包含字幕等。
  9. metadata:

    • AVDictionary *metadata: 元数据字典,存储了流的元数据信息,比如标题、语言、编码器名称等。
  10. avg_frame_rate:

  • AVRational avg_frame_rate: 流中平均帧率。
  1. r_frame_rate:
  • AVRational r_frame_rate: 流中原始帧率。
  1. codec_info_nb_frames:
  • int64_t codec_info_nb_frames: 编解码器提供的帧数量信息。
  1. priv_data:
  • void *priv_data: 指向流的私有数据,用于存储特定于流的信息。

AVCodec结构体

AVCodec 结构体在 FFmpeg 中用于表示编解码器的信息。以下是 AVCodec 结构体中一些重要参数的说明:

  1. name:

    • const char *name: 编解码器的名称。这是一个字符串,用于标识编解码器的类型,比如 “h264”、“aac” 等。
  2. long_name:

    • const char *long_name: 编解码器的长名称。提供了更详细的描述,比如 “H.264”、“Advanced Audio Coding” 等。
  3. type:

    • enum AVMediaType type: 编解码器的类型。这是一个枚举值,表示编解码器所处理的媒体类型,比如视频、音频、字幕等。
  4. id:

    • enum AVCodecID id: 编解码器的唯一标识符。这是一个枚举值,表示编解码器的具体类型,比如 H.264、AAC、MP3 等。
  5. capabilities:

    • int capabilities: 编解码器的能力标志。这个参数指示了编解码器所支持的功能,比如是否支持硬件加速、是否支持多线程编解码等。
  6. supported_framerates:

    • const AVRational *supported_framerates: 编解码器支持的帧率。这是一个指向 AVRational 结构体数组的指针,表示编解码器能够处理的帧率范围。
  7. supported_samplerates:

    • const int *supported_samplerates: 编解码器支持的采样率。这是一个整数数组,表示编解码器能够处理的音频采样率范围。
  8. pix_fmts:

    • const enum AVPixelFormat *pix_fmts: 编解码器支持的像素格式。这是一个枚举值数组,表示编解码器能够处理的像素格式范围。
  9. sample_fmts:

    • const enum AVSampleFormat *sample_fmts: 编解码器支持的采样格式。这是一个枚举值数组,表示编解码器能够处理的音频采样格式范围。
  10. priv_class:

  • const AVClass *priv_class: 指向私有类的指针,用于访问编解码器的私有选项。
  1. profiles:
  • const struct AVProfile *profiles: 编解码器支持的配置文件。这是一个指向 AVProfile 结构体数组的指针,表示编解码器支持的不同配置文件。
  1. wrapper_name:
  • const char *wrapper_name: 编解码器所使用的包装器(wrapper)名称。

AVPacket结构体

AVPacket 结构体在 FFmpeg 中用于表示编码后的数据包。以下是 AVPacket 结构体中一些重要参数的说明:

  1. buf:

    • AVBufferRef *buf: 指向数据包的缓冲区引用。这个参数指示了存储编码数据的缓冲区。
  2. pts:

    • int64_t pts: 指定数据包的显示时间戳(Presentation Time Stamp)。这是一个以 AV_TIME_BASE 为单位的时间戳,用于指示数据包应该在播放器中显示的时间。
  3. dts:

    • int64_t dts: 指定数据包的解码时间戳(Decode Time Stamp)。这是一个以 AV_TIME_BASE 为单位的时间戳,用于指示数据包在解码时应该被解码的时间。
  4. duration:

    • int64_t duration: 数据包的时长。表示数据包的持续时间,以 AV_TIME_BASE 为单位。
  5. pos:

    • int64_t pos: 数据包在媒体文件中的位置。用于指示数据包在文件中的偏移量,以字节为单位。
  6. size:

    • int size: 数据包的大小。表示数据包中编码数据的字节数。
  7. stream_index:

    • int stream_index: 数据包所属的流的索引。指示数据包属于 AVFormatContext 中流数组中的哪一个流。
  8. flags:

    • int flags: 数据包的标志。这个参数包含了一些标志位,表示数据包的一些属性,比如是否为关键帧等。
  9. side_data:

    • AVPacketSideData *side_data: 指向附加数据(Side Data)的指针。这个参数用于存储与数据包相关的额外信息,比如编解码器的配置信息、裁剪信息等。
  10. side_data_elems:

  • int side_data_elems: 附加数据的数量。表示 side_data 数组中的附加数据的数量。
  1. duration_count:
  • int duration_count: 数据包的时长计数。用于指示 duration 字段中的时间单位数量。

AVPacket 结构体中的这些参数提供了对编码数据包的基本描述和特性,帮助应用程序进行音视频数据的编码、解码和处理。

AVFrame结构体

AVFrame 结构体在 FFmpeg 中用于表示解码后的音视频帧数据。以下是 AVFrame 结构体中一些重要参数的说明:

  1. data:

    • uint8_t *data[AV_NUM_DATA_POINTERS]: 数据指针数组。这个数组用于存储指向帧数据的指针,每个元素对应一个数据平面。
  2. linesize:

    • int linesize[AV_NUM_DATA_POINTERS]: 数据行大小数组。这个数组存储了每个数据平面的行大小(以字节为单位)。
  3. extended_data:

    • uint8_t **extended_data: 扩展数据指针。指向一个指针数组,用于访问帧数据的每个数据平面的指针。
  4. width:

    • int width: 帧的宽度(像素数)。
  5. height:

    • int height: 帧的高度(像素数)。
  6. format:

    • int format: 像素格式。表示帧数据的像素格式,如 YUV420、RGB24 等。
  7. pts:

    • int64_t pts: 显示时间戳(Presentation Time Stamp)。指示帧应该在播放器中显示的时间。
  8. pkt_pts:

    • int64_t pkt_pts: 数据包的显示时间戳。指示生成该帧的数据包的显示时间戳。
  9. pkt_dts:

    • int64_t pkt_dts: 数据包的解码时间戳。指示生成该帧的数据包的解码时间戳。
  10. key_frame:

  • int key_frame: 关键帧标志。指示该帧是否为关键帧。
  1. sample_aspect_ratio:
  • AVRational sample_aspect_ratio: 采样纵横比。表示帧的采样纵横比,用于指示像素的宽高比。
  1. opaque:
  • void *opaque: 不透明数据。用于存储一些不透明的私有数据。
  1. quality:
  • int quality: 图像质量。表示帧的图像质量,一般用于视频编码。
  1. coded_picture_number:
  • int coded_picture_number: 编码图像编号。指示编码器为该帧分配的编码图像编号。
  1. display_picture_number:
  • int display_picture_number: 显示图像编号。指示编码器为该帧分配的显示图像编号。

AVFrame 结构体中的这些参数提供了对解码后的音视频帧数据的描述和特性,用于进行音视频数据的解码、处理和显示。

  • 32
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baoyu45585

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值