本篇文章要把pcm原始音频数据编码为AAC格式的音频数据。由于aac格式只支持fltp格式的pcm数据,也就是float planar格式,所以,打算输入两个pcm原始音频文件,一个是左声道,一个是右声道,两文件都是f32le、单声道、采样率48000的音频文件。这样读入两个文件的内容,分别放入AVFrame的data[0]和data[1]当中。
编码为AAC格式,还要加入ADTS头,才能播放。
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/imgutils.h>
#include <libavutil/samplefmt.h>
#include <libavutil/timestamp.h>
static int check_sample_fmt(const AVCodec *codec, enum AVSampleFormat sample_fmt)
{
const enum AVSampleFormat *p = codec->sample_fmts;
while (*p != AV_SAMPLE_FMT_NONE) {
if (*p == sample_fmt)
return 1;
p++;
}
return 0;
}
int find_sample_index(int samplerate)
{
int adts_sample_rates[] = {96000,882000,64000,48000,441000,32000,24000,22050,16000,12000,11025,8000,7350,0,0,0};
int i;
for(i=0; i < 16;i++)
{
if(samplerate == adts_sample_rates[i])
return i;
}
return 16 - 1;
}
static void encode(AVCodecContext *ctx, AVFrame *frame, AVPacket *pkt,
FILE *output)
{
int ret;
/* send the frame for encoding