背景
直播SDK一开始使用的FFmpeg 2.8版本的,现在的FFmpeg最新版已经是4.4了。播放器编辑器使用的FFmpeg都是4.0的版本;新版本FFmpeg在内部结构也做了优化,效率、稳定性相比较旧版本都提升了不少。所以直播SDK FFmpeg也要必须升级了。
简介
直播SDK内部主要3部分使用了FFmpeg:
- 使用libavcodec 编码Audio;
- 使用libavcodec 编码Video;
- 使用libavformat 合成/推流;
我会先讲解使用旧AP Ilibavcodec编码Audio、Video的过程。然后再讲解使用新API编码Audio、Video的过程,通过前后的对比就可以很容易的知道直播SDK FFmpeg升级点在哪里?这里只是通过分析新旧API的使用来对比出我们直播SDK的更新点,同时也可以学习如何通过FFmpeg新旧API编码Audio、Video、Muxer。因为篇幅有限,这里并不会具体去讲解每个API内部的源码逻辑,感兴趣可以自行了解。
libavcodec旧API编码Audio
文本阐述感觉是比较枯燥的,这里先上图了解下通过FFmpeg libavcodec模块旧API如何编码Audio。后面在具体介绍API的作用与功能。
编码器注册
av_register_all()也可以使用avcodec_register_all()代替。查看源码可以发现av_register_all()内部调用了avcodec_register_all()。它的作用更就是注册所有的编解码器。
查找编码器
编码器注册好了之后就可以通过avcodec_find_encoder_by_name()、avcodec_find_encoder()获取我们想要的编码器。例如:通过avcodec_find_encoder(AV_CODEC_ID_AAC), 如果我们想使用libfdk-aac编码器编码音频必须在FFmpeg交叉编译的时候链接进去。否则我们在获取编码器的时候会使用FFmpeg内部默认的AAC编码器。
创建 AVCodecContext
当编码器创建好了之后,就需要根据编码器创建AVCodecContext,并初始化编码参数:采样里、声道数、采样格式等。
AVCodecContext *avCodecContext = avcodec_alloc_context3(codec);
avCodecContext->codec_type = AVMEDIA_TYPE_AUDIO;
avCodecContext->sample_rate = 44100;
avCodecContext->bit_rate = 64000;
avCodecContext->sample_fmt = AV_SAMPLE_FMT_S16;
avCodecConte