录制时提取录制的音频样本

时间:2014-08-15 20:20:27

标签: ios audio avfoundation avaudiorecorder avasset

我正在使用录音机来渲染每个录音的波形。无论何时进行录制,音频文件的NSURL都将转换为AVAsset。使用AVAsset,我可以提取音轨的样本。这适用于短(<40秒)的录音,但是该过程在2.5分钟的轨道上需要15-20秒,并且只有在轨道越长时才变得越来越差。任何人都有关于如何解决这个问题的任何提示或建议?

AVAssetReader *reader = [[AVAssetReader alloc] initWithAsset:self.audioAsset error:&error];

AVAssetReaderTrackOutput *output = [[AVAssetReaderTrackOutput alloc] initWithTrack:songTrack outputSettings:outputSettingsDict];

[reader addOutput:output];

NSMutableData * data = [NSMutableData dataWithLength:32768];

NSMutableArray *allSamples = [NSMutableArray array];


while (reader.status == AVAssetReaderStatusReading) {
        CMSampleBufferRef sampleBufferRef = [output copyNextSampleBuffer];

        if (sampleBufferRef) {
            CMBlockBufferRef blockBufferRef = CMSampleBufferGetDataBuffer(sampleBufferRef);
            size_t bufferLength = CMBlockBufferGetDataLength(blockBufferRef);

            if (data.length < bufferLength) {
                [data setLength:bufferLength];
            }

            CMBlockBufferCopyDataBytes(blockBufferRef, 0, bufferLength, data.mutableBytes);

            Float32 *samples = (Float32 *)data.mutableBytes;
            int sampleCount = (int)(bufferLength / bytesPerInputSample);
            for (int i = 0; i < sampleCount; i++) {
                [allSamples addObject:@(samples[i*channelCount])];
            }
            CMSampleBufferInvalidate(sampleBufferRef);
            CFRelease(sampleBufferRef);
        }
    }

0 个答案:

没有答案