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】:我只是想帮助遇到同样问题并花费大量时间进行搜索的其他人。为了节省您的时间,我提出了我的答案。我不喜欢这里有人把这当成一种秘密......
搜索了关于extaudioservice、audio queue和avfoundation的文章。
我意识到我应该使用 AVFoundation,原因很简单,它是最新的 bundle,它是 Objective C 但不是 cpp 风格。
所以步骤并不复杂:
-
从音频文件创建
AVAsset
从avasset
创建avassetreader
从avasset
创建avassettrack
从avassettrack
创建avassetreadertrackoutput
将avassetreadertrackoutput
添加到之前的avassetreader
开始读出音频数据
从avassettrackoutput你可以一个一个copyNextSampleBuffer(它是一个循环读取所有数据)。
每个copyNextSampleBuffer 都会给你一个CMSampleBufferRef,它可以被CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer 用来获取AudioBufferList。 AudioBufferList 是 AudioBuffer 的数组。 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 标准 附件第一卷 中文版