#define AUDIO_INBUF_SIZE 20480
static char audio_buf[AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
//avresample_convert method
int outputframe_audio(VideoState *is,AVFrame *frame)
{
AVCodecContext *dec = is->audio_st->codec;
if( is->avr== NULL)
{
is->avr = avresample_alloc_context();
av_opt_set_int(is->avr, "in_channel_layout", AV_CH_LAYOUT_STEREO, 0);
av_opt_set_int(is->avr, "in_sample_fmt", AV_SAMPLE_FMT_FLTP, 0);
av_opt_set_int(is->avr, "in_sample_rate", 44100, 0);
av_opt_set_int(is->avr, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0);
av_opt_set_int(is->avr, "out_sample_fmt", AV_SAMPLE_FMT_S16, 0);
av_opt_set_int(is->avr, "out_sample_rate", 44100, 0);
avresample_open(is->avr);
}
if(is->avr)
{
int maxLen;
uint8_t *output=NULL;
int out_linesize;
int out_size = av_samples_get_buffer_size(&out_linesize,
2,
frame->nb_samples,
AV_SAMPLE_FMT_S16, 0);
int out_samples = frame->nb_samples;
output = av_realloc(output, out_size);
maxLen = avresample_convert(is->avr,
&output,
out_linesize,
out_samples,
frame->data,//extended_data,
frame->linesize[0],
frame->nb_samples) *4; // for 2channels
memcpy(audio_buf, output, maxLen);
av_freep(&output);
audio_output(audio_buf,maxLen);
}
}
//swr_convert method
int outputframe_audio(VideoState *is,AVFrame *frame)
{
AVCodecContext *dec = is->audio_st->codec;
if( is->swr_ctx== NULL)
{
is->swr_ctx = swr_alloc();
is->swr_ctx=swr_alloc_set_opts(NULL,
AV_CH_LAYOUT_STEREO,
AV_SAMPLE_FMT_S16,
44100,
dec->channel_layout,
dec->sample_fmt ,
44100,//dec->sample_rate,
0,
NULL);
swr_init(is->swr_ctx);
}
if (is->swr_ctx)
{
int out_linesize;
int needed_buf_size = av_samples_get_buffer_size(&out_linesize,
dec->channels,
frame->nb_samples,
AV_SAMPLE_FMT_S16, 1);
uint8_t *out[] = { audio_buf };
int outsamples = swr_convert(is->swr_ctx,
out,
out_linesize,//needed_buf_size,
dst,//(const uint8_t**)frame->extended_data, //&is->frame->data[0],
frame->nb_samples);
is->audio_buf = audio_buf;
int resampled_data_size = outsamples * dec->channels * av_get_bytes_per_sample(AV_SAMPLE_FMT_S16);
audio_output(audio_buf,resampled_data_size);
}
}