确定音频文件是否为VBR

时间:2014-09-12 15:35:19

标签: objective-c macos cocoa audio mp3

我正在尝试确定音频文件是否在Cocoa应用程序(OS X 10.8 +)中使用VBR。

AVFoundation似乎根本无法回答这个问题,AudioToolbox对我说谎。

下面的代码坚定地声称我扔的任何mp3文件都是VBR;即使对于我知道不是这种情况的文件(与MediaInfo交叉检查)

OSStatus result = noErr;
UInt32 size;

AudioFileID audioFile;
AudioStreamBasicDescription audioFormat;
AudioFormatPropertyID vbrInfo;

// Open audio file.
result = AudioFileOpenURL( (__bridge CFURLRef)originalURL, kAudioFileReadPermission, 0, &audioFile );
if( result != noErr )
{
    NSLog( @"Error in AudioFileOpenURL: %d", (int)result );
    return;
}

// Get data format
size = sizeof( audioFormat );
result = AudioFileGetProperty( audioFile, kAudioFilePropertyDataFormat, &size, &audioFormat );
if( result != noErr )
{
    NSLog( @"Error in AudioFileGetProperty: %d", (int)result );
    return;
}

// Get vbr info
size = sizeof( vbrInfo );
result = AudioFormatGetProperty( kAudioFormatProperty_FormatIsVBR, sizeof(audioFormat), &audioFormat, &size, &vbrInfo);

if( result != noErr )
{
    NSLog( @"Error getting vbr info: %d", (int)result );
    return;
}

NSLog(@"%@ is VBR: %d", originalURL.lastPathComponent, vbrInfo);

为什么说谎?我做错了什么?

如何在Cocoa应用程序中真实地确定音频文件的VBR?

可以获取VBR和CBR样本文件here(不是我的页面)。

2 个答案:

答案 0 :(得分:1)

最好的办法是直接从文件中读取MPEG帧头。如果它们都指定相同的编码参数(版本,层,比特率,采样率和通道),则该文件是CBR。否则,该文件是VBR / ABR。

有几个MP3库可以直接用于执行此操作,也可以使用正确的代码供您借用。如果文件处于快速存储状态,则性能也完全符合您的要求。

如果您需要进一步的帮助,我是C#MP3解码器项目的主要贡献者,可以为您指出一些例子。

答案 1 :(得分:0)

在VBR mp3中,第一帧是不同的。因此,无需读取整个文件即可确定它是否为VBR。