当前位置: 首页 > 知识库问答 >
问题:

用ffmpeg解码AAC音频

贺卜霸
2023-03-14

我正在尝试解码ADTS容器中的AAC音频流,该音频流来自外部硬件H264编码器。

我分析了ADT,它告诉我我有一个2通道,44100 AAC主配置文件框架。我为ffmpeg解码器设置了额外的数据字节,并成功解码了帧?详情如下:

(伪c代码)

设置解码器:

avcodec_find_decoder(codec_id);
avcodec_alloc_context3(context->codec);
avcodec_open2(context->av_codec_context, context->codec, nullptr);
av_init_packet(&context->av_raw_packet);

设置额外的数据字节:

// AOT_MAIN, 44.1kHz, Stereo
// 00001010 00010000
// extradata = 0x0A, 0X10
memcpy(context->av_codec_context->extradata, extradata, extradataLength);
avcodec_open2(context->av_codec_context, context->codec, nullptr);

然后解码帧:

// decode frame
const int len = avcodec_decode_audio4(context->av_codec_context, context->frame, &html" target="_blank">got_frame, &context->av_raw_packet);
*sampleRate = context->av_codec_context->sample_rate;
*sampleFormat = context->av_codec_context->sample_format;
*bitsPerSample = av_get_bytes_per_sample(context->av_codec_context->sample_fmt) * 8;
*channels = context->av_codec_context->channels;
*channelLayout = context->av_codec_context->channelLayout;
// get frame
*outDataSize = av_samples_get_buffer_size(nullptr, context->av_codec_context->channels, context->frame->nb_samples, context->av_codec_context->sample_fmt, 1);

解码帧:

// array of 8192 bytes, context info is as expected:
context->av_codec_context->channels = 2
context->av_codec_context->channelLayout = 3 (AV_CH_LAYOUT_STEREO)
context->frame->sample_fmt = 8 (AV_SAMPLE_FMT_FLTP) // float, planar
context->frame->sample_rate = 44100

现在,据我所知,32位原始格式的每个帧每个采样将有4个字节,每个通道将被交错(因此每4个字节是交替通道)。这就为每个通道(8192/32位/2通道)留下了1024个样本。

我曾尝试将多帧数据导出到一个文件,并在Audacity to sanity check中作为原始文件导入(32位浮点,2通道44100Hz,little endian)。我得到的不是音乐,而是噪音,检测到的音频长度比我预期的要长(5秒转储到文件中,但Audacity说是22.5秒)。我尝试了各种导入格式设置。我可能做错了什么?

我对音频有点陌生,所以我可能误解了什么。

共有1个答案

方博学
2023-03-14

这只不过是一个很难找到的bug。在Audacity中放大音频样本,发现了1024个样本宽的重复模式。

实际上,缓冲区没有被正确更新,我一遍又一遍地处理同一个音频帧:

for(var offset = 0; offset < packet.Length; offset++) {
  var frame = ReadAdtsFrame();
  // offset += frame.Length; 
  // ^ essentially this was missing, so the frame buffer was always the first frame
}

我将把这篇文章留在这里,向全世界展示我的羞耻感,并提醒大家,通常是你自己的错误最终导致了你。

 类似资料:
  • 我正在尝试捕获和编码音频数据,我正在使用FFMPEG AAC编码音频,为了捕获PCM数据,我使用ALSA,捕获部分在我的情况下工作,但是AAC编码器不工作。 我试图播放test.aac文件使用 ffplaytest.aac 但它包含很多噪音。 附加aac编码器代码: 这里,请忽略DUMP_TEST标志,我已经启用了。 有人能告诉我什么是问题吗? 谢谢,哈希尔

  • 问题内容: 我一直在努力用Java播放aac编码的音频文件。 我们在第一学期末有一个小组项目,希望有一个背景音乐,并且那里几乎没有音效。最后,我们使用了WAV文件,因为我们无法播放AAC。 问题答案: 这个周末,我再次尝试了一次,然后再次搜索,并且从不同的站点一起搜索了一个工作代码,但是没有一个完整的工作解决方案。 为了在以后的项目中更舒适地使用,我为我准备了一个小库,用于AAC播放。 由于很难找

  • 在Java中,我使用FFmpeg将WAV文件转换为AAC,函数如下: 当我在Audacity中打开这两个文件时,我可以清楚地看到AAC文件的长度增加了0.05秒,开头增加了0.05秒的沉默。 这是一个问题,当我试图将这个AAC文件与视频文件多路复用时,音频无法同步。 是否有某种参数来防止这种行为或另一种方法来解决这个问题? 编辑-运行函数时的控制台输出:

  • 本文向大家介绍使用ffmpeg 合并aac格式音频文件的方法,包括了使用ffmpeg 合并aac格式音频文件的方法的使用技巧和注意事项,需要的朋友参考一下 FFmpeg简介 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保

  • 我正在开发Android应用程序,我使用ffmpeg来转换文件。 我希望我的二进制文件尽可能的小,因为我没有太多的输入格式和输出格式,我的操作是非常基本的。当然,不要膨胀APK。 在我的程序中,ffmpeg接收一个文件,并复制音频流(),音频流将始终是aac()。我需要的是将流保存到文件 我的命令如下:。 我需要什么muxer才能让muxing aac归档?我试过flv、mp3、mov,但总是找不

  • 我正在尝试使用使用编解码器对一些音频流进行编码。为此,我使用了google cts ExtractEncodeMust的这个实现。 对于某些aac文件,它会在编码某些帧后抛出。更准确地说,它会在第1030行抛出异常,。 我正在配置如下: 我完全不知道如何解决这个问题。任何形式的帮助都将不胜感激。 带有一些日志的堆栈跟踪: 设备:小米POCO x3 操作系统:Android10 导致溢出的示例文件信