将原始 .aac 文件包装到 .m4a 容器中的最简单方法是啥

Posted

技术标签:

【中文标题】将原始 .aac 文件包装到 .m4a 容器中的最简单方法是啥【英文标题】:What is the easiest way to wrap a raw .aac file into a .m4a container将原始 .aac 文件包装到 .m4a 容器中的最简单方法是什么 【发布时间】:2010-09-09 09:20:24 【问题描述】:

这个问题是从以下问题溢出的:

How do I programmatically convert mp3 to an itunes-playable aac/m4a file?

无论如何,我学会了如何创建 aac 文件,然后我发现 aac 不仅仅是具有不同文件扩展名的 m4a 文件。事实上,我需要以某种方式将 aac 包装到 m4a 容器中。理想情况下,我可以简单地调用命令行。

【问题讨论】:

如果你想用 Java 的方式来做,而不用弄乱 NDK 和 FFMPEG,那么请查看我的回答 here。 【参考方案1】:

mp4box 如果你想要一个专用工具;它可能是最简单的方法。 ffmpeg 也可以完成这项工作。

【讨论】:

补充一点,ffmpeg 的使用就像“ffmpeg -i in.m4a -o out.aac”一样简单。 :) mp4box 大致相同,我推荐它而不是 ffmpeg,因为它将 moov atom 放在开头而不是结尾,这对于渐进式下载、iPod 播放等很重要。跨度> ffmpeg的格式其实是:“ffmpeg -i foo.aac foo.m4a”,将raw aac包装成m4a。 你确定不是重新编码吗?见my answer 如Alastair所说,你必须添加一个选项-acodec copy,否则流被重新编码。【参考方案2】:

ffmpeg 是一个通用的 (de)muxer/transcoder。 MP4Box 是来自GPAC 的(解)复用器/转码器,这是一个专用于 MP4 相关软件技术的软件包。现在使用 MP4Box 似乎更明智,因为它在文件开头对 moov atom 进行了正确处理,这对于流媒体和 ipod 播放很重要。

像这样使用ffmpeg:

ffmpeg -i input.aac -codec: copy output.m4a

像这样使用 MP4Box:

MP4Box -add input.aac#audio output.m4a

【讨论】:

@ColonelPanic 您尝试了哪个?你怎么知道它没有包装? 控制台输出提示 ffmpeg 正在重新编码 - 这也需要一些时间,而且文件大小明显不同。但是mp4box 命令运行完美且快速,谢谢。 @ColonelPanic ffmpeg 的手册页说它需要-codec copy。感谢您了解这一点。 我也没有运气,ffmpeg 说输入已损坏,MP4Box 已转换但只写入了 1.5 秒的音频(实际上是 20 分钟长)。 有趣的是,最终封装的 m4a 比原始 aac 小。似乎是因为 m4a 中有一个较短的数据包头。【参考方案3】:

avconv -i input.aac -acodec copy output.m4a

在我的例子中,如果没有明确标记copy,它会出于某种奇怪的原因重新编码音频。

【讨论】:

也许是关于avconv,它是什么,你从哪里得到它,它与ffmpeg有什么不同? 我用ffmpeg也遇到过同样的情况。如果不添加此-acodec copyoption,则将重新编码流。但我觉得这并不奇怪,我想从命令解析器的角度来看是合乎逻辑的。【参考方案4】:

只需使用任何像 Yamb 这样的 mp4-Muxer 来创建一个只有 aac 音轨的 mp4 文件,然后将文件扩展名更改为 m4a

【讨论】:

以上是关于将原始 .aac 文件包装到 .m4a 容器中的最简单方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

M4A 和 AAC 音频文件有啥区别?

如何使用 Android MediaCodec 生成 AAC ADTS 基本流

AVAudioRecorder 录制 AAC/m4a

如何以编程方式将 mp3 转换为 iTunes 可播放的 aac/m4a 文件?

寻找用于编辑 AAC 元数据(M4A 文件)的开源库 [关闭]

将 m4a 转换为 aac 并在 Windows 7 上保留元数据