1

我正在开发一个可以渲染每个录音波形的录音机。每当进行录音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);
        }
    }
4

0 回答 0