是否可以使用AVAssetReader来恢复立体声通道布局?

Bre*_*nan 8 core-audio avfoundation ios

我希望能够从AVAssetReader获取AudioBufferList,它有2个缓冲区,这样我就可以通过AudioUnit处理左右音频.我尝试使用下面的输出设置,但只要我指定由kAudioChannelLayoutTag_Stereo设置的立体声布局,它就不会读取.

AVAssetReader是否可以返回非交错结果?

如果没有,我将如何将其转换为非交错的AudioBufferList?我曾尝试使用音频转换器服务,但我不能让它接受AudioStreamBasicDescription的输入或输出值.(ASBD)如果我无法从AVAssetReader获取我想要的格式的数据,我想至少能够将其转换为我需要的格式.

任何提示都表示赞赏.

- (NSDictionary *) getOutputSettings {
    AudioChannelLayout channelLayout;
    memset(&channelLayout, 0, sizeof(AudioChannelLayout));
    channelLayout.mChannelLayoutTag = kAudioChannelLayoutTag_Stereo;
    NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys:
                                    [NSNumber numberWithInt:kAudioFormatLinearPCM], AVFormatIDKey, 
                                    [NSNumber numberWithFloat:44100.0], AVSampleRateKey,
                                    [NSNumber numberWithInt:2], AVNumberOfChannelsKey,
                                    [NSData dataWithBytes:&channelLayout length:sizeof(AudioChannelLayout)], AVChannelLayoutKey,
                                    [NSNumber numberWithInt:16], AVLinearPCMBitDepthKey,
                                    [NSNumber numberWithBool:NO], AVLinearPCMIsNonInterleaved,
                                    [NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
                                    [NSNumber numberWithBool:NO], AVLinearPCMIsBigEndianKey,
                                    nil];

    return outputSettings;
}
Run Code Online (Sandbox Code Playgroud)

Bre*_*nan 0

我了解到我可以让 AVAssetReader 返回具有默认输出设置(nil)的结果,这将为我提供浮点值的交错结果。浮点值的缓冲区在缓冲区中从左到右交替。我可以使用 -1.0 到 1.0 范围内的这些值,但为了播放音频,有必要将这些值增加到短有符号整数的范围,因此我将它们乘以 SHRT_MAX 并确保值保持在 SHRT_MAX 和 SHRT_MIN 范围内,以便音频按预期播放。

由于交错缓冲区在同一缓冲区上返回 L 和 R 值,因此将其视为 1 个缓冲区上的 2 个通道,这反映在 AudioBufferList 中。以前我能够取回 2 个缓冲区,每个缓冲区有 1 个通道,但现在我了解了非常简单的交错格式,这并不是真正必要的。