将原始 .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 copy
option,则将重新编码流。但我觉得这并不奇怪,我想从命令解析器的角度来看是合乎逻辑的。【参考方案4】:
只需使用任何像 Yamb 这样的 mp4-Muxer 来创建一个只有 aac
音轨的 mp4
文件,然后将文件扩展名更改为 m4a
。
【讨论】:
以上是关于将原始 .aac 文件包装到 .m4a 容器中的最简单方法是啥的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Android MediaCodec 生成 AAC ADTS 基本流
如何以编程方式将 mp3 转换为 iTunes 可播放的 aac/m4a 文件?