Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 确定音频文件是否为VBR_Objective C_Macos_Cocoa_Audio_Mp3 - Fatal编程技术网

Objective c 确定音频文件是否为VBR

Objective c 确定音频文件是否为VBR,objective-c,macos,cocoa,audio,mp3,Objective C,Macos,Cocoa,Audio,Mp3,我正在尝试确定Cocoa应用程序(OS X 10.8+)中的音频文件是否使用VBR AVFoundation似乎根本无法回答这个问题,AudioToolbox在骗我 下面的代码坚决声称我扔给它的任何mp3文件都是VBR;即使对于我知道不是这样的文件(与交叉检查) 为什么撒谎?我做错了什么 如何在Cocoa应用程序中确定音频文件的VBR属性? 可以获得VBR和CBR示例文件(不是我的页面)。最好的办法是直接从文件中读取MPEG帧头。如果它们都指定相同的编码参数(版本、层、比特率、采样器和通道),则

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

AVFoundation似乎根本无法回答这个问题,AudioToolbox在骗我

下面的代码坚决声称我扔给它的任何mp3文件都是VBR;即使对于我知道不是这样的文件(与交叉检查)

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

如何在Cocoa应用程序中确定音频文件的VBR属性?


可以获得VBR和CBR示例文件(不是我的页面)。

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

有几个MP3库,可以直接用来做这件事,或者有正确的代码供你借用。如果文件位于快速存储上,那么性能也在您的要求之内


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

在VBR MP3中,第一帧是不同的。因此,不需要阅读整个文件来确定它是否为VBR。

谢谢您的回答!这对mp3和mpeg4文件都有效吗?我必须承认,我希望得到更多具体的代码示例,但显然,这对许多人来说似乎不是一个重要的问题。我甚至没有看过MPEG4容器格式(看起来像标准的第14部分)。原则上我认为这是可行的,但是你必须找到代码来读取帧信息。例如代码,我工作的解码器是。MpegStreamReader.cs有相关的代码(可以调用其他类型)。由于您是唯一一个回答的人,并且您的回答有一定的帮助(虽然不是我真正想要的),我将奖励您。感谢您抽出时间回答!看一看第2.3部分描述的关于VBR头的内容,我根据链接中的文件对它进行了测试,它正确地检测到了CBR和VBR文件。
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);