0
点赞
收藏
分享

微信扫一扫

学而时习之---状态模式

 前言 

                             

从本章开始我们将要学习嵌入式音视频的学习了 ,使用的瑞芯微的开发板

 

今天讲解的部分就是继上章未讲完的部分继续讲解

首先我们看上图红框里面的函数,函数内部就是实现ffmpeg初始化,合成复合流以及推流

里面内容比价多,我可能分为三章去分别讲解,今天我们先讲一下ffmpeg的参数初始化

01  ffmpeg输出模块结构体

在FFMPEG输出模块中用到了很多个结构体,分别是:AVFormatContext、AVStream、AVCodec、AVCodecContext、AVIOContext

 02 ffmpeg初始化代码分析

 这个代我们要我们要先从这个结构体开始看

这个结构体会有些许复杂

typedef struct
{
    AVStream *stream;  /*主要储存了音视频流的具体信息*/
    AVCodecContext *enc;   //编解码上下文,它主要的功能是除了存储 AVCodec 的信息外,还保存了额外的编码属性
    int64_t next_timestamp;  //
    int samples_count;
    AVPacket *packet;   //压缩后的数据和关于这些数据的一些附加的信息,如显示时间戳(pts),解码时间戳(dts),数据时长(duration),所在流媒体的索引(stream_index)等等。
} OutputStream;

typedef struct
{
    unsigned int config_id;
    int protocol_type;                    //流媒体TYPE
    char network_addr[NETWORK_ADDR_LENGTH];//流媒体地址
    enum AVCodecID video_codec; //视频编码器ID
    enum AVCodecID audio_codec; //音频编码器ID
    OutputStream video_stream; //VIDEO的STREAM配置
    OutputStream audio_stream; //AUDIO的STREAM配置
    AVFormatContext *oc; //是存储音视频封装格式中包含的信息的结构体,也是FFmpeg中统领全局的结构体,对文件的封装、编码操作从这里开始。
} RKMEDIA_FFMPEG_CONFIG; //FFMPEG配置

 

这个结构体很重要,这里面保存着配置相关的所有信息

其中最重要的结构体是AVFormatContext,里面存储音视频封装格式中包含的信息的结构体,

也是FFmpeg中统领全局的结构体,对文件的封装、编码操作从这里开始。

 将一些简单的参数配置完后,我们看一下如何初始化FFmpeg

 ffmpeg输出模块初始化大概就是这八步,我们一步一步解析

2.1 根据需要配置码流属性avformat_alloc_output_context2()

函数原型:

int avformat_alloc_output_context2(AVFormatContext **ctx, 
AVOutputFormat *oformat, const char *format_name, const char *filename)

2.2配置推流器编码参数和AVStream结构体

AVStream主要是存储流信息结构体,这个流信息包含音频流和视频流。

创建的API是avformat_new_stream如下

 函数原型:

AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c)

创建输出码流AVStream, AVStream是存储每一个视频/音频流信息的结构体


 2.3找到编码器avcodec_find_encoder

找到对应的编码ID

函数原型:

AVCodec *avcodec_find_encoder(AVCodecID id)

 

 2.4 avcodec_alloc_context3分配AVCodecContext结构体

函数原型:

AVCodecContext *avcodec_alloc_context3(const AVCodec *codec)

 2.5 设置AVCodecContext的参数

 

 

AV_CODEC_FLAG_GLOBAL_HEADER发送视频数据的时候都会在关键帧前面添加SPS/PPS,这个标识符在FFMPEG初始化的时候都需要添加。

 2.6 使能推流编码器

这里的open_videoopen_audio就是使能推流编码器,其中avcodec_open2让编码器和编码器上下文进行关联。并用avcodec_parameters_from_context把刚初始化的上下文传输到AVStream的编解码器。

 2.7打开IO文件操作

使用avio_open打开对应的文件,注意这里的文件不仅是指本地的文件也指的是网络流媒体文件,下面是avio_open的定义。

int avio_open(AVIOContext **s, const char *url, int flags);

2.8  avformat_write_header对头部进行初始化

int avformat_write_header(AVFormatContext *s, AVDictionary **options);

 

举报

相关推荐

0 条评论