确定音频文件是不是为 VBR
Posted
技术标签:
【中文标题】确定音频文件是不是为 VBR【英文标题】:Determine if an audio file is VBR确定音频文件是否为 VBR 【发布时间】:2014-09-12 15:35:18 【问题描述】:我正在尝试在 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-iness?
VBR和CBR示例文件可以获取here(不是我的页面)。
【问题讨论】:
看看codeproject.com/Articles/8295/MPEG-Audio-Frame-Header 第 2.3 部分关于 VBR 头的描述,我根据您的链接中的文件对其进行了测试,它正确地检测到了 CBR 和 VBR 文件。 【参考方案1】:最好的办法是直接从文件中读取 MPEG 帧头。如果它们都指定相同的编码参数(版本、层、比特率、采样率和通道),则文件为 CBR。否则,文件为 VBR / ABR。
有几个 MP3 库可以直接用于执行此操作,或者有正确的代码供您借用。如果文件在快速存储上,性能也完全符合您的要求。
如果您需要进一步的帮助,我是 C# MP3 解码器项目的主要贡献者,可以为您提供一些示例。
【讨论】:
感谢您的回答!这对 mp3 和 mpeg4 文件都有效吗?我必须承认,我希望有更具体的代码示例,但显然,这对很多人来说似乎不是一个重要的问题。 我什至没有看过 MPEG4 容器格式(看起来像标准的第 14 部分)。原则上我认为它会起作用,但你必须找到代码来阅读框架信息。例如代码,我工作的解码器是nlayer.codeplex.com。 MpegStreamReader.cs 有相关代码(调用其他类型)。 因为你是唯一一个回答的人,而且你的回答有点帮助(虽然不是我真正想要的),所以我奖励你。感谢您花时间回答!【参考方案2】:在 VBR mp3 中,第一帧不同。因此,无需阅读整个文件即可确定它是否为 VBR。
【讨论】:
以上是关于确定音频文件是不是为 VBR的主要内容,如果未能解决你的问题,请参考以下文章
了解速率控制模式Rate Control Mode-CBR,VBR,CRF(x264x265vpx)