确定音频文件是否为VBR

问题描述:

我试图确定音频文件是否在Cocoa应用程序(OS X 10.8+)中使用VBR。确定音频文件是否为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示例文件可以获得(不是我的网页)。

+0

看看http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header部分2.3介绍了有关VBR标题,我测试了它从您的链接文件,它检测到CBR和VBR文件正确。 – user3473830 2014-09-22 10:00:54

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

有几个MP3库可以用来直接做这个或者有正确的代码供你借用。如果文件处于快速存储状态,则性能也符合您的要求。

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

+0

谢谢你的回答! 这对于mp3和mpeg4文件都适用吗?我必须承认,我希望能得到更具体的代码样本,但显然这对许多人来说似乎并不是一个重要的问题。 – fzwo 2014-09-16 07:30:16

+0

我甚至没有看过MPEG4容器格式(看起来像标准的第14部分)。原则上我认为它可以工作,但是你必须找到代码来阅读取景信息。例如代码,我工作的解码器是https://nlayer.codeplex.com/。 MpegStreamReader.cs有相关的代码(调用其他类型)。 – ioctlLR 2014-09-16 15:49:05

+0

既然你是唯一能回答的人,而你的回答有些帮助(虽然不是我真正想找的),但我会奖赏你的赏金。感谢您花时间回答! – fzwo 2014-09-22 12:59:31