我正在尝试确定音频文件是否在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(不是我的页面)。
答案 0 :(得分:1)
最好的办法是直接从文件中读取MPEG帧头。如果它们都指定相同的编码参数(版本,层,比特率,采样率和通道),则该文件是CBR。否则,该文件是VBR / ABR。
有几个MP3库可以直接用于执行此操作,也可以使用正确的代码供您借用。如果文件处于快速存储状态,则性能也完全符合您的要求。
如果您需要进一步的帮助,我是C#MP3解码器项目的主要贡献者,可以为您指出一些例子。
答案 1 :(得分:0)
在VBR mp3中,第一帧是不同的。因此,无需读取整个文件即可确定它是否为VBR。