There are a number of audio files that have .m4a suffix and these are encoded in one of AAC or Apple Lossless (ALAC). I want to choose only audio files encoded in Apple Lossless of them. Is there any way to determine this? I tried FFmpeg, but it says all of them are encoded in AAC.

Edit: I am currently on Windows.

有帮助吗?

解决方案

Here is a file that has a description of M4A (best I could find so far) on page 67: 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.

At first I figured 'ftyp' would be where format is determined, but judging by this list that is more like the file type itself (already known as m4a): http://www.ftyps.com/index.html

http://www.ftyps.com/what.html Describes a bit more of the format.

If ftyp doesn't differentiate, then I think that the 'Major Brand' field might refer to the fourcc's on this page: http://wiki.multimedia.cx/index.php?title=QuickTime_container The one for Apple Lossless being 'alac' and AAC is probably 'mp4a'

Apple's Lossless format open source page indicates that the ftype is 'alac' (slightly contradictory to above) http://alac.macosforge.org/trac/browser/trunk/ALACMagicCookieDescription.txt

So far what I can tell is that the 4 bytes following ftyp are always (in a smallish sample size) 'M4A '.

Somewhere in the first ~200 (hex) bytes or so there is an ascii 'mp4a' for AAC compression or an 'alac' for Apple Lossless. The 'alac' always seems to come in pairs ~30 bytes apart ('mp4a' only once).

Sorry that's not more specific, if I find the exact location or prefix I'll update again. (My guess is the earlier part of the header has a size specified somewhere.)

其他提示

If you have the FFmpeg package, you should have ffprobe.

Give this a try:

ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 file.m4a
  • -v error: to hide the startup text
  • -select_streams a:0: to select the first audio track
  • -show_entries stream=codec_name: to display only the codec type
  • -of default=noprint_wrappers=1:nokey=1: to remove extra formatting

This will print out just aac or alac. Perfect for scripting.

You can do it with Core Audio.

Something like:

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
}

On a Mac, you select the file you want and then right click. Find "Get Info" and click that and a window will pop up with extra information about the file you selected. It should say next to "Codecs:" "AAC" or "Apple Lossless" I hope I helped those Mac users out there that had the same question (and possibly Windows users in some way even though I am not familiar with the OS.)

try using http://sourceforge.net/projects/mediainfo/

"MediaInfo is a convenient unified display of the most relevant technical and tag data for video and audio files." - sourceforge project description

This is how info is displayed.

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

Check audio section for codec/encoding details.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top