AVAudioPlayer - 测量 - 想要构建波形(图形)

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:这是我最后得到的:

替代文字http://img22.imageshack.us/img22/5778/waveform.png

ele*_*lyh 7

我只想帮助那些遇到同样问题并花费大量时间进行搜索的人.为了省时间,我把答案拿出来.我不喜欢这里的人把这当作秘密......

搜索有关extaudioservice,音频队列avfoundation的文章后.

我意识到我应该使用AVFoundation,原因很简单,它是最新的捆绑包,它是Objective C但不是那么cpp风格.

所以这样做的步骤并不复杂:

  1. AVAsset从音频文件创建
  2. avassetreader从中创建avasset
  3. avassettrack从中创建avasset
  4. avassetreadertrackoutput从中创建avassettrack
  5. 添加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 您可以直接从此示例中复制上述大部分代码,并将其用于您自己的目的.


Ale*_* N. 0

好吧,伙计们,看来我要再次回答我自己的问题: http: //www.supermegaulttragroovy.com/blog/2009/10/06/drawing-waveforms/没有很多具体内容,但至少你会知道什么苹果文档可供阅读。