ffmpeg:如何将 AAC 音频数据包转换为 ADTS 格式

Posted

技术标签:

【中文标题】ffmpeg:如何将 AAC 音频数据包转换为 ADTS 格式【英文标题】:ffmpeg: How to convert AAC audio packets to ADTS format 【发布时间】:2017-01-12 04:07:21 【问题描述】:

我正在尝试编写一个从 MP4 文件中解复用音频并将解复用后的 AVPacket 数据写入文件的 C 程序。但生成的转储缺少 ADTS 标头。有关添加 ADTS 标头的最佳方法的任何指针。

我看到 ffmpeg 有“adtsenc.c”文件,它似乎实现了一个 ADTS 多路复用器:

AVOutputFormat ff_adts_muxer = 
    .name              = "adts",
    .long_name         = NULL_IF_CONFIG_SMALL("ADTS AAC (Advanced Audio Coding)"),
    .mime_type         = "audio/aac",
    .extensions        = "aac,adts",
    .priv_data_size    = sizeof(ADTSContext),
    .audio_codec       = AV_CODEC_ID_AAC,
    .video_codec       = AV_CODEC_ID_NONE,
    .write_header      = adts_write_header,
    .write_packet      = adts_write_packet,
    .write_trailer     = adts_write_trailer,
    .priv_class        = &adts_muxer_class,
    .flags             = AVFMT_NOTIMESTAMPS,
;

最好的祝愿。

【问题讨论】:

mp4 文件通常不包含 ADTS 标头,因为它们 would be redundant。但是,如果您将数据保存为“裸”aac 文件,FFmpeg 将添加 ADTS 标头。 感谢 AkselA 的评论。我认为您为我指明了正确的方向。你能给我一些想法我需要做什么才能将数据保存为“裸”aac文件吗?我真的很感谢这方面的帮助。 【参考方案1】:

更新:我知道当您尝试时,命令行解复用实现了放置 ADTS 标头:

ffmpeg -i input.mp4 -acodec copy -vn output.aac

我检查了这个过程是否使用 adts.c 即 ADTS muxer 通过调用来实现这一点:

adts_write_header()
adts_write_packet()
adts_write_packet()
.....
adts_write_trailer()

我需要弄清楚如何在我的程序中使用它。如果我弄明白了,我会发布更新。

【讨论】:

我最终从 adtsenc.c 中提取了代码并进行了修改以适应我的情况。如果有人需要代码,请告诉我。 非常有趣的 Malik,我也有同样的问题。既然你提供了代码,你能把它发给我或张贴在某个地方吗?非常感谢!

以上是关于ffmpeg:如何将 AAC 音频数据包转换为 ADTS 格式的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 FFmpeg (C/C++) 将原始 pcm_f32le 音频编码为 AAC 编码音频?

最简单的基于FFMPEG的音频编码器(PCM编码为AAC)

FFmpeg 命令行工具ffmpeg

FFmpeg开发从mp4中提取aac音频

iOS录制时如何将PCM缓冲区实时转换为AAC数据?

FFmpeg AAC编码