新版本ffmpeg-2.1.4转换其他音频为AAC格式出现噪音,时间长度也不对,有代码
代码如下,请高手帮忙看看,谢谢啦
src_nb_samples = pSelf->oAcc->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE ? 10000 : oAcc->frame_size;
int ret = av_samples_alloc_array_and_samples(&src_samples_data, &src_samples_linesize, oAcc->channels, src_nb_samples, oAcc->sample_fmt, 0);
if (ret < 0) return;
max_dst_nb_samples = av_rescale_rnd(src_nb_samples, oAcc->sample_rate, aCodecCtx->sample_rate, AV_ROUND_UP);
ret = av_samples_alloc_array_and_samples(&dst_samples_data, &dst_samples_linesize, oAcc->channels,max_dst_nb_samples, oAcc->sample_fmt, 0);
if (ret < 0) return;
while(av_read_frame(ic,&packet)>=0)
if(packet.stream_index==audioindex)
{
AVFrame *decoded_frame = NULL;
int len;
decoded_frame = avcodec_alloc_frame();
ret=avcodec_decode_audio4(aCodecCtx, decoded_frame, &out_size, &packet);
if ((ret>=0)&&(out_size))
{
src_samples_data = (uint8_t **)decoded_frame->data[0];
if(aCodecCtx->sample_rate != oAcc->sample_rate || aCodecCtx->channels != oAcc->channels || aCodecCtx->sample_fmt != oAcc->sample_fmt)
{
if (swr_ctx == NULL)
swr_ctx = swr_alloc();
if (!swr_ctx) {
return;
}
av_opt_set_int(swr_ctx, "in_channel_layout", aCodecCtx->channel_layout, 0);
av_opt_set_int(swr_ctx, "in_sample_rate", aCodecCtx->sample_rate, 0);
av_opt_set_sample_fmt(swr_ctx, "in_sample_fmt",aCodecCtx->sample_fmt , 0);
av_opt_set_int(swr_ctx, "out_channel_layout", oAcc->channel_layout, 0);
av_opt_set_int(swr_ctx, "out_sample_rate", oAcc->sample_rate, 0);
av_opt_set_sample_fmt(swr_ctx, "out_sample_fmt", oAcc->sample_fmt, 0);
int ret;
if ((ret = swr_init(swr_ctx)) < 0) {
return;
}
dst_nb_samples = av_rescale_rnd(swr_get_delay(swr_ctx, aCodecCtx->sample_rate) + src_nb_samples, oAcc->sample_rate,aCodecCtx->sample_rate, AV_ROUND_UP);
if (dst_nb_samples > max_dst_nb_samples) {
av_free(dst_samples_data[0]);
ret = av_samples_alloc(dst_samples_data, &dst_samples_linesize, oAcc->channels,dst_nb_samples, oAcc->sample_fmt, 0);
if (ret < 0)
return;
max_dst_nb_samples = dst_nb_samples;
dst_samples_size = av_samples_get_buffer_size(NULL, oAcc->channels, dst_nb_samples, oAcc->sample_fmt, 0);
}
len = swr_convert(swr_ctx , dst_samples_data, dst_nb_samples, (const uint8_t **)decoded_frame->extended_data, src_nb_samples);
}
AVPacket pkt;
av_init_packet(&pkt);
pkt.data = NULL;
pkt.size = 0;
int got_packet = 0;
decoded_frame->nb_samples = oAcc->frame_size;
int samples_size = av_samples_get_buffer_size(NULL, oAcc->channels, decoded_frame->nb_samples, oAcc->sample_fmt, 0);
avcodec_fill_audio_frame(decoded_frame, oAcc->channels, oAcc->sample_fmt, dst_samples_data[0], samples_size, 0);
avcodec_encode_audio2(oAcc, &pkt, decoded_frame,&got_packet);
if(got_packet > 0){
pkt.stream_index = audio_st->index;
ret = av_interleaved_write_frame(oc, &pkt);
if(ret < 0)
return;
av_free_packet(&pkt);
}
}
}