objective-c - 判断音频文件是否为VBR

标签 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 (不是我的页面)。

最佳答案

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

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

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

关于objective-c - 判断音频文件是否为VBR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25811885/

相关文章:

macos - Mac OS X (Mavericks) 中的文件夹图标关联

macos - 在cocoa中打开共享文件夹中的文件

cocoa - 如何更新 NSView 中的文本?

objective-c - 为我的应用程序的文档类型注册一个图标

ios - 嵌入在 UITextView 中的三列表

ios - xcode 6中启动屏幕中的动画

objective-c - 向对象发送消息?

macos - 如何制作下载后自动打开的 dmg 安装程序?

cocoa - 为什么 NSString 和 NSLog 处理 %C 和 %lc(以及 %S 和 %ls)的方式不同?

iphone - 游戏中心邀请失败