课程名称:音视频基础+ffmpeg原理 入门音视频技术开发
课程章节:【实战】音频编码
课程讲师:李超
课程内容
ffmpeg编码的过程包括:
- 创建编码器;
- 创建上下文;
- 打开编码器;
- 送数据给编码器;
- 编码;
- 释放资源
ffmpeg 编码过程中重要的 API。
avcodec_find_encoder() #创建编码器
avcodec_alloc_context3() #创建上下文
avcodec_open2() #打开编码器
avcodec_send_frame() #将数据送给编码器
avcodec_receive_packet() #获取编码后的数据
从查找编码器,分配上下文,设置上下文参数,到打开编码器的完整代码。
AVCodecContext* open_coder(){
//查找编码器
int ret;
char error[1024] = {0, };
//libfdk_aac音频编码的ID或者名字必须跟 sample_fmt一致才可以,否则ffmpeg会报错。
AVCodec *codec = avcodec_find_encoder_by_name("libfdk_aac");
//创建上下文
AVCodecContext *codec_ctx = avcodec_alloc_context3(codec);
codec_ctx->sample_fmt = AV_SAMPLE_FMT_S16; //输入音频的采样率
codec_ctx->channel_layout = AV_CH_LAYOUT_STEREO; //输入音频的通道布局
codec_ctx->channels = 2; //输入音频的通道个数
codec_ctx->sample_rate = 44100; //输入音频的采样率
//bitrate 和profile互斥,bit_rate设置为0后,才会查找profile的值
codec_ctx->bit_rate = 0; //AAC 128K AAC HE 64K AAC HE V2 32K
codec_ctx->profile = FF_PROFILE_AAC_HE_V2;
//打开编码器
if((ret = avcodec_open2(codec_ctx, codec, NULL)) < 0){
av_strerror(ret, error, 1024);
printf(stderr, "Failed to open audio devices, [%d] %s\n", ret, error);
return NULL;
}
return codec_ctx;
}
接下来就应该将数据输入编码器,这里有两个结构体,AVFrame,AVPacket。其中AVFrame是没有编码的数据,AVPacket是编码后的数据。所以就是将AVFrame输入编码器进行编码,然后得到AVPacket数据,然后将AVPacket的保存进文件就是AAC数据了。