解码 m4a 并转储 PCM 数据会返回噪声
Posted
技术标签:
【中文标题】解码 m4a 并转储 PCM 数据会返回噪声【英文标题】:Decoding m4a and dumping PCM data gives back noise 【发布时间】:2013-10-20 15:21:34 【问题描述】:我正在使用下面的代码(根据 libavcodec 中给出的示例修改)来解码音频文件
int main(int argc, char **argv)
av_register_all();
avcodec_register_all();
char *filename = argv[1];
char *outfilename = argv[2];
FILE *outfile;
AVCodec *codec;
AVCodecContext *c= NULL;
AVPacket avpkt;
AVFrame *frame = av_frame_alloc();
printf("Decode audio file %s to %s\n", filename, outfilename);
outfile = fopen(outfilename, "wb");
if (!outfile)
fprintf(stderr, "Could not write to %s\n", outfilename);
av_free(c);
exit(1);
AVFormatContext *format_context = NULL;
avformat_open_input(&format_context, filename, NULL, NULL);
printf("Opened format input\n");
int find_result = avformat_find_stream_info(format_context, NULL);
if (find_result < 0)
fprintf(stderr, "Cannot find stream info\n");
avformat_close_input(&format_context);
exit(-1);
int audio_stream_idx = av_find_best_stream(format_context, AVMEDIA_TYPE_AUDIO, -1, -1, &codec, 0);
if (audio_stream_idx < 0)
fprintf(stderr,"Couldn't find stream information\n");
exit(-1);
// Get a pointer to the codec context for the audio stream
c = format_context->streams[audio_stream_idx]->codec;
av_opt_set_int(c, "refcounted_frames", 1, 0);
if (avcodec_open2(c, codec, NULL) < 0)
fprintf(stderr, "Could not open codec\n");
exit(-1);
// read the audio frames
int ret, got_frame;
while (1)
if ((ret = av_read_frame(format_context, &avpkt)) < 0)
break;
if (avpkt.stream_index == audio_stream_idx)
avcodec_get_frame_defaults(frame);
got_frame = 0;
ret = avcodec_decode_audio4(c, frame, &got_frame, &avpkt);
if (ret < 0)
fprintf(stderr, "Error decoding audio\n");
continue;
if (got_frame)
// write to disk
fwrite(frame->extended_data[0], 1, frame->linesize[0], outfile);
av_free_packet(&avpkt);
fclose(outfile);
printf("Finished\n");
if (c)
avcodec_close(c);
avformat_close_input(&format_context);
av_frame_free(&frame);
我尝试了.mp3
和.m4a
文件; .mp3
文件工作正常,但不适用于 .m4a
文件。有什么帮助吗?
【问题讨论】:
首先要检查一个显而易见的事情 - 您使用的 FFmpeg 构建是否包含所需的 MPEG-4 解析器和 AAC 解码器。 @RomanR。是的,它确实建立了。我改进了我的代码,现在它可以正确输出一个通道;但是另一个通道仍然是静态噪声.. @lynnard。我遇到了同样的问题,但仍在努力解决。能够播放mp3音频,但不能播放aac。我确实使用所有编解码器和解析器重建了 ffmpeg,但仍然没有成功。您或任何机构是否找到了任何解决方案? 【参考方案1】:大多数aac
文件是FLOAT 格式,即AV_SAMPLE_FMT_FLTP
,而诸如libao
之类的库只能以整数格式播放音频,即AV_SAMPLE_FORMAT_S16
。
因此,您需要使用libavresample
重新采样音乐并根据需要转换格式。
【讨论】:
以上是关于解码 m4a 并转储 PCM 数据会返回噪声的主要内容,如果未能解决你的问题,请参考以下文章
从 16 位 PCM 中去除 C++ 中的音频噪声(嘶嘶声)
实时音频编解码之十三 Opus编码-SILK编码-噪声整形分析