AVAudioPlayer - Metering - 想要建立一个波形(图表)

Posted

技术标签:

【中文标题】AVAudioPlayer - Metering - 想要建立一个波形(图表)【英文标题】:AVAudioPlayer - Metering - Want to build a waveform (graph) 【发布时间】:2009-11-19 23:42:05 【问题描述】:

我需要构建一个可视化图表来表示录制文件中的语音级别 (dB)。我试着这样做:

NSError *error = nil;
AVAudioPlayer *meterPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:self.recording.fileName] error:&error];

if (error) 
    _lcl_logger(lcl_cEditRecording, lcl_vError, @"Cannot initialize AVAudioPlayer with file %@ due to: %@ (%@)", self.recording.fileName, error, error.userInfo);
 else 
    [meterPlayer prepareToPlay];
    meterPlayer.meteringEnabled = YES;
    
    for (NSTimeInterval i = 0; i <= meterPlayer.duration; ++i) 
        meterPlayer.currentTime = i;
        [meterPlayer updateMeters];
        float averagePower = [meterPlayer averagePowerForChannel:0];
        _lcl_logger(lcl_cEditRecording, lcl_vTrace, @"Second: %f, Level: %f dB", i, averagePower);
    

[meterPlayer release];

如果它成功了,那就太酷了,但它没有。我总是得到-160分贝。关于如何实现它的任何其他想法?

UPD:这是我最终得到的:

alt text http://img22.imageshack.us/img22/5778/waveform.png

【问题讨论】:

见这里https://github.com/prodia/AudioVisualizer 【参考方案1】:

我只是想帮助遇到同样问题并花费大量时间进行搜索的其他人。为了节省您的时间,我提出了我的答案。我不喜欢这里有人把这当成一种秘密......

搜索了关于extaudioserviceaudio queueavfoundation的文章。

我意识到我应该使用 AVFoundation,原因很简单,它是最新的 bundle,它是 Objective C 但不是 cpp 风格。

所以步骤并不复杂:

    从音频文件创建AVAssetavasset 创建avassetreaderavasset 创建avassettrackavassettrack创建avassetreadertrackoutputavassetreadertrackoutput添加到之前的avassetreader开始读出音频数据

avassettrackoutput你可以一个一个copyNextSampleBuffer(它是一个循环读取所有数据)。

每个copyNextSampleBuffer 都会给你一个CMSampleBufferRef,它可以被CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer 用来获取AudioBufferListAudioBufferListAudioBuffer 的数组。 AudioBuffer 是一堆音频数据,存储在它的 mData 部分中。

您也可以在 extAudioService 中实现上述功能。但我认为上述 avfoundation 方法更容易。

那么下一个问题,如何处理mData?注意当你得到avassetreadertrackoutput时,你可以指定它的输出格式,所以我们指定输出为lpcm

那么你最终得到的mData其实是一个浮点格式的幅值。

简单吧?虽然我花了很多时间来整理这篇文章。

两个有用的资源分享: 阅读本文以了解基本术语和概念:https://www.mikeash.com/pyblog/friday-qa-2012-10-12-obtaining-and-interpreting-audio-data.html

示例代码:https://github.com/iluvcapra/JHWaveform 您可以直接从该示例中复制上述大部分代码并用于您自己的目的。

【讨论】:

【参考方案2】:

我自己没有使用过,但 Apple 的 avTouch iPhone 示例有条形图,由 AVAudioPlayer 提供支持,您可以轻松查看它们是如何做到的。

【讨论】:

我知道这个示例,主要区别在于它们正在播放音频文件。我不需要玩它。我需要在任意时间调查文件的任意部分而不实际播放它。并构建一个图表,将这些特征可视化。 啊啊啊...您必须自己阅读数据并找到选定时期的水平。而且由于文件未解压缩,您必须对其进行解码,或使用其他框架来获取 PCM 数据。我了解 ExtAudio、Audio Queue 和 Remote IO AudioUnit 将是您研究的领域。我还在自学。 >>而且由于文件没有解压,所以你必须对其进行解码 --> 不知道答案的请不要回复。读取压缩数据或原始数据没有区别。 SDK 正在处理这一切。因此,您只是在误导以后会阅读您的人。 您的意思是,如果您查看将其 URL 传递给 AVAudioPlayer 的文件的内容,无论是压缩还是解压缩,它看起来都一样?那为什么还要使用 ExtAudioFile 呢?【参考方案3】:

我认为您不能根据您的限制使用AVAudioPlayer。即使您可以在不实际播放声音文件的情况下让它“启动”,它也只会帮助您以与音频文件流式传输一样快的速度构建图形。您所说的是对声音进行静态分析,这将需要一种截然不同的方法。您需要自己读取文件并手动解析它。我认为使用 SDK 中的任何内容都没有快速解决方案。

【讨论】:

【参考方案4】:

好的,伙计们,看来我要再次回答我自己的问题了:http://www.supermegaultragroovy.com/blog/2009/10/06/drawing-waveforms/ 没有太多的具体内容,但至少你会知道要阅读哪些 Apple 文档。

【讨论】:

我知道这还不到一岁,但在你原来的帖子中你确实说过你要发布一个开源组件。我阅读了您的博客文章,但没有看到任何可下载的内容。我错过了什么还是你改变了主意? 我没有改变主意,但我根本没有机会这样做。写一封电子邮件告诉我你的需要,也许我能帮到你。

以上是关于AVAudioPlayer - Metering - 想要建立一个波形(图表)的主要内容,如果未能解决你的问题,请参考以下文章

Open Metering System 2021-12 标准 附件第一卷 中文版

如何在 Spark Java 中的数据集上应用地图功能

如何将“AVAudioPlayer.Type”类型的值分配给“AVAudioPlayer?”

为啥 AVAudioPlayer 没有响应?

斯威夫特:非托管 AVAudioPlayer

声音 AVAudioPlayer 不工作