确定音频文件是不是以 Apple Lossless (ALAC) 编码

Posted

技术标签:

【中文标题】确定音频文件是不是以 Apple Lossless (ALAC) 编码【英文标题】:Determine whether an audio file is encoded in Apple Lossless (ALAC)确定音频文件是否以 Apple Lossless (ALAC) 编码 【发布时间】:2012-06-11 16:36:21 【问题描述】:

有许多带有.m4a 后缀的音频文件,它们被编码为AAC 或Apple Lossless (ALAC) 之一。我只想选择其中以 Apple Lossless 编码的音频文件。有没有办法确定这一点?我试过FFmpeg,但它说它们都是用AAC编码的。

编辑:我目前在 Windows 上。

【问题讨论】:

您是在使用特定语言还是在寻找基于 CLI 的 linux 工具? 您尝试过不同版本的 FFMPEG 吗?我很惊讶它无法识别正确的编解码器。 @Lee 我目前正在使用 Python,但如果有任何可编程方式我还可以。我可以打开一个 CLI 实用程序,使用 ctypes 调用一个 C 函数,或者用另一种语言编写它。 @aglassman 正如我上面所说,我不在乎我必须使用哪种语言。 您当前使用的是哪个版本的 ffmpeg。 ALAC 是在 v0.5 中引入的(就像 2008 年???)。我想你的版本很好,但只是为了涵盖所有基础...... 【参考方案1】:

如果你有 FFmpeg package,你应该有ffprobe

试试这个:

ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 file.m4a
-v error: 隐藏启动文本 -select_streams a:0:选择第一个音轨 -show_entries stream=codec_name: 只显示编解码器类型 -of default=noprint_wrappers=1:nokey=1: 删除多余的格式

这将只打印出aacalac。非常适合编写脚本。

【讨论】:

完美。谢谢。【参考方案2】:

这是第 67 页的 M4A 描述文件(到目前为止我能找到的最好的): http://iweb.dl.sourceforge.net/project/audiotools/audio%20formats%20reference/2.14/audioformats_2.14_letter.pdf

A typical M4A begins with an 'ftyp' atom indicating its file type...
10.2.1 the ftyp atom
[0 31] ftyp Length [32 63] 'ftyp' (0x66747970)
[64 95] Major Brand [96 127] Major Brand Version
[128 159] Compatible Brand₁ ...
The 'Major Brand' and 'Compatible Brand' elds are ASCII strings. 
'Major Brand Version' is an integer.

起初我认为“ftyp”是确定格式的地方,但从这个列表来看,它更像是文件类型本身(已经称为 m4a): http://www.ftyps.com/index.html

http://www.ftyps.com/what.html 描述更多格式。

如果 ftyp 不区分,那么我认为“主要品牌”字段可能指的是该页面上的fourcc: http://wiki.multimedia.cx/index.php?title=QuickTime_container Apple Lossless 是 'alac' 而 AAC 可能是 'mp4a'

苹果的Lossless format开源页面显示ftype为'alac'(与上面略有矛盾) http://alac.macosforge.org/trac/browser/trunk/ALACMagicCookieDescription.txt

到目前为止,我可以说 ftyp 后面的 4 个字节总是(在较小的样本大小中)'M4A'。

在前约 200 个(十六进制)字节左右的某个地方,有一个用于 AAC 压缩的 ascii 'mp4a' 或一个用于 Apple Lossless 的 'alac'。 'alac' 似乎总是成对出现,相隔约 30 个字节('mp4a' 只有一次)。

抱歉,这不是更具体,如果我找到确切的位置或前缀,我会再次更新。 (我的猜测是标题的前面部分在某处指定了大小。)

【讨论】:

【参考方案3】:

您可以使用 Core Audio 做到这一点。

类似:

CFStringRef pathToFile;
CFURLRef inputFileURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, pathToFile, kCFURLPOSIXPathStyle, false);
ExtAudioFileRef inputFile;
ExtAudioFileOpenURL(inputFileURL,  &inputFile);

AudiostreamBasicDescription fileDescription;
UInt32 propertySize = sizeof(fileDescription);

ExtAudioFileGetProperty(inputFile, 
  kExtAudioFileProperty_FileDataFormat,
  &propertySize,
  &fileDescription);    

if(fileDescription.mFormatID == kAudioFormatAppleLossless)
  // file is apple lossless

【讨论】:

【参考方案4】:

在 Mac 上,您选择所需的文件,然后单击鼠标右键。找到“获取信息”并单击它,将弹出一个窗口,其中包含有关您选择的文件的额外信息。它应该在“编解码器”旁边显示:“AAC”或“Apple Lossless” 我希望我能帮助那些有同样问题的 Mac 用户(即使我不熟悉操作系统,也可能以某种方式帮助 Windows 用户。)

【讨论】:

【参考方案5】:

尝试使用http://sourceforge.net/projects/mediainfo/

“MediaInfo 是视频和音频文件最相关的技术和标签数据的便捷统一展示。” - sourceforge 项目描述

这就是信息的显示方式。

General
Complete name                    : C:\Downloads\recit24bit.m4a
Format                           : MPEG-4
Format profile                   : Apple audio with iTunes info
Codec ID                         : M4A 
File size                        : 2.62 MiB
Duration                         : 9s 9ms
Overall bit rate                 : 2 441 Kbps
Track name                       : 24 bit recital ALAC Test File
Performer                        : N\A
Comment                          : Test File

Audio
ID                               : 1
Format                           : ALAC
Codec ID                         : alac
Codec ID/Info                    : Apple Lossless Format
Duration                         : 9s 9ms
Bit rate mode                    : Variable
Bit rate                         : 2 438 Kbps
Channel(s)                       : 2 channels
Sampling rate                    : 22.7 KHz
Bit depth                        : 24 bits
Stream size                      : 2.62 MiB (100%)
Language                         : English

检查音频部分以了解编解码器/编码详细信息。

【讨论】:

以上是关于确定音频文件是不是以 Apple Lossless (ALAC) 编码的主要内容,如果未能解决你的问题,请参考以下文章

从 MemoryStream 打开音频 (wav) 文件以确定持续时间

使用 swift 我们可以以编程方式在 Apple TV 上播放照片吗?

在网络服务器上播放 Apple 的 .caf 音频文件?

确定音频文件是不是为 VBR

Google Speech API - 有没有办法确定音频是不是有人声?

使用 Swift 分析录制的音频文件以将语音转换为文本