安卓视音频基础(二)ffmpeg库的简介、解码函数简介、数据结构简介

    科技2022-08-07  117

    FFmpeg一共包含8个库

    avcodec:编解码(最重要的库)

    avformat:封装格式处理。

    avfilter:滤镜特效处理。 

    avdevice:各种设备的输入输出。

    avutil:工具库(大部分库都需要这个库的支持)。

    postproc:后加工。

    swresample:音频采样数据格式转换。

    swscale:视频像素数据格式转换。


     FFmpeg解码的流程图如下所示: (这里借鉴一下雷神的ppt)

    分析一下解码函数

    av_register_all():注册所有组件。

    avformat_open_input():打开输入视频文件。

    avformat_find_stream_info():获取视频文件信息。

    avcodec_find_decoder():查找解码器。

    avcodec_open2():打开解码器。

    av_read_frame():从输入文件读取一帧压缩数据。

    avcodec_decode_video2():解码一帧压缩数据。

    avcodec_close():关闭解码器。

    avformat_close_input():关闭输入视频文件


    AVFormatContext    封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装 格式相关信息。

                                       iformat:         输入视频的AVInputFormat

                                       nb_streams : 输入视频的AVStream 个数

                                       streams :       输入视频的AVStream []数组

                                       duration :       输入视频的时长(以微秒为单位)

                                       bit_rate :        输入视频的码率 

    AVInputFormat    每种封装格式(例如FLV, MKV, MP4, AVI)对应一个该结构体。

                                       name:         封装格式名称

                                       long_name:封装格式的长名称

                                       extensions: 封装格式的扩展名

                                       id:               封装格式ID

                                       一些封装格式处理的接口函数

    AVStream    视频文件中每个视频(音频)流对应一个该结构体。

                                       id:                  序号

                                       codec:           该流对应的AVCodecContext

                                       time_base:    该流的时基

                                       r_frame_rate:该流的帧率

    AVCodecContext    编码器上下文结构体,保存了视频(音频)编解码相关信息。

                                       codec:          编解码器的AVCodec

                                       width, height:图像的宽高(只针对视频)

                                       pix_fmt:         像素格式(只针对视频)

                                       sample_rate: 采样率(只针对音频)

                                       channels:       声道数(只针对音频)

                                       sample_fmt:  采样格式(只针对音频

    AVCodec    每种视频(音频)编解码器(例如H.264解码器)对应一个该结构体。

                                       name:         编解码器名称

                                       long_name:编解码器长名称

                                       type:           编解码器类型

                                       id:               编解码器ID

                                       一些编解码的接口函数

    AVPacket    存储一帧压缩编码数据。

                                       pts:                 显示时间戳

                                       dts :                解码时间戳

                                       data :              压缩编码数据

                                       size :               压缩编码数据大小

                                       stream_index :所属的AVStream 

    AVFrame    存储一帧解码后像素(采样)数据。 

                                       data:            解码后的图像像素数据(音频采样数据)。

                                       linesize:        对视频来说是图像中一行像素的大小;对音频来说是整个音 频帧的大小。

                                       width, height:图像的宽高(只针对视频)。

                                       key_frame:    是否为关键帧(只针对视频) 。

                                       pict_type:       帧类型(只针对视频) 。例如I,P,B

    Processed: 0.012, SQL: 8