新版本ffmpeg-2.1.4转换其他音频为AAC格式出现噪音,时间长度也不对,有代码

ilovehellworld 2014-03-24 03:11:23

代码如下,请高手帮忙看看,谢谢啦
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);
}
}
}
...全文
1388 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang_shaner 2014-08-16
  • 打赏
  • 举报
回复
这个是源码带的例子吧
iloveffmpeg 2014-03-25
  • 打赏
  • 举报
回复
项目时间太紧了,只好求购一份音频格式转换的源代码, 要求ffmpeg-2.1.4 + vs2008 有重采样(swr_convert), 可以修改采样率等 联系QQ 1198669732

2,541

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧