确定音频文件是不是为 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的主要内容,如果未能解决你的问题,请参考以下文章

编码 MP3 文件“-aq 0”设置

音频转化mp3 ,到底选vbr还是cbr

了解速率控制模式Rate Control Mode-CBR,VBR,CRF(x264x265vpx)

Google Speech API - 有没有办法确定音频是不是有人声?

用于从 MP3 文件中提取音频信息的 Java 库

从 MemoryStream 打开音频 (wav) 文件以确定持续时间