我试图在一个ADTS容器中解码一个AAC音频流,它是从外部硬件H264编码器中流出来的。
我已经分析了ADTS,它告诉我,我有一个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, &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字节就是交替通道)。这给我留下了每个通道的1024个样本(8192 / 32位/2通道)。
我已经尝试过将这个数据的多个帧导出到一个文件中,并以原始文件(32位浮点数,2声道44100 in,小endian)的形式导入。而不是音乐,我所得到的只是噪音,检测到的音频长度比我预期的要长得多(5秒倒入文件,但奥迪说22.5秒)。我尝试过各种导入格式设置。我在这里可能做错了什么?
我对音频工作有点陌生,所以我可能误解了一些东西。
编辑:我尝试将音频摇摄到正确的频道,并将其反映在数据中。它看起来也像一个重复的模式,正好是1024个样本,在我看来,这表明了一个编程错误,在第一个示例之后没有覆盖一个缓冲区。

发布于 2021-01-16 05:26:20
这只不过是一个很难找到的虫子。放大后的音频样本显示出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
}我将把这个留在这里,向全世界展示我的耻辱,并提醒大家,最终让你感到羞愧的往往是你自己的错误。
https://stackoverflow.com/questions/65744845
复制相似问题