Reading audio samples via AVAssetReader

后端 未结 3 1279
陌清茗
陌清茗 2020-11-27 13:05

How do you read audio samples via AVAssetReader? I\'ve found examples of duplicating or mixing using AVAssetReader, but those loops are always controlled by the AVAssetWrite

3条回答
  •  北海茫月
    2020-11-27 13:42

    The answers here are not generic. The call to CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer might fail when the AudioBufferList needs to be sized differently. When having non-intererleaved samples as example.

    The correct way is to call CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer twice. The first call queries the size needed for the AudioBufferList and second one actually fills the AudioBufferList.

    size_t bufferSize = 0;
    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
        sampleBuffer,
        &bufferSize,
        NULL,
        0,
        NULL,
        NULL,
        0,
        NULL
    );
    
    AudioBufferList *bufferList = malloc(bufferSize);
    CMBlockBufferRef blockBuffer = NULL;
    CMSampleBufferGetAudioBufferListWithRetainedBlockBuffer(
        sampleBuffer,
        NULL,
        bufferList,
        bufferSize,
        NULL,
        NULL,
        kCMSampleBufferFlag_AudioBufferList_Assure16ByteAlignment,
        &blockBuffer
    );
    
    // handle audio here
    
    free(bufferList);
    CFRelease(blockBuffer);
    

    In a real world example you must perform error handling and also you should not malloc every frame, instead cache the AudioBufferList.

提交回复
热议问题