Ale*_* N. 5 iphone avaudioplayer
我需要构建一个可视图表来表示录制文件中的语音级别(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];
Run Code Online (Sandbox Code Playgroud)
如果它解决了它会很酷,但事实并非如此.我总是得到-160分贝.关于如何实现的任何其他想法?
UPD:这是我最后得到的:
我只想帮助那些遇到同样问题并花费大量时间进行搜索的人.为了省时间,我把答案拿出来.我不喜欢这里的人把这当作秘密......
搜索有关extaudioservice,音频队列和avfoundation的文章后.
我意识到我应该使用AVFoundation,原因很简单,它是最新的捆绑包,它是Objective C但不是那么cpp风格.
所以这样做的步骤并不复杂:
AVAsset从音频文件创建avassetreader从中创建avasset avassettrack从中创建avassetavassetreadertrackoutput从中创建avassettrack avassetreadertrackoutput到上一个avassetreader开始读出音频数据从avassettrackoutput可以逐个copyNextSampleBuffer(它是一个循环读取所有数据).
每个copyNextSampleBuffer都会为您提供一个CMSampleBufferRef,可用于通过CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer获取AudioBufferList.AudioBufferList是阵列AudioBuffer.AudioBuffer是一堆存储在mData部分中的音频数据.
您也可以在extAudioService中实现上述内容.但我认为上述基础方法更容易.
那么下一个问题,如何处理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 您可以直接从此示例中复制上述大部分代码,并将其用于您自己的目的.
好吧,伙计们,看来我要再次回答我自己的问题: http: //www.supermegaulttragroovy.com/blog/2009/10/06/drawing-waveforms/没有很多具体内容,但至少你会知道什么苹果文档可供阅读。
| 归档时间: |
|
| 查看次数: |
7317 次 |
| 最近记录: |