Ios 是否可以使用Avassetrader恢复立体声频道布局?

Ios 是否可以使用Avassetrader恢复立体声频道布局?,ios,core-audio,avfoundation,Ios,Core Audio,Avfoundation,我希望能够从Avassetrader获得AudioBufferList,Avassetrader有2个缓冲区,这样我就可以通过一个AudioUnit处理左右音频。我尝试使用下面的输出设置,但只要指定kAudioChannelLayoutTag_stereo设置的立体声布局,它就不会读取 Avassetrader是否可以返回非交错结果 如果不是,我将如何将其转换为非交错音频缓冲列表?我曾尝试使用音频转换器服务,但无法使其接受AudioStreamBasicDescription的输入或输出值。(A

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

Avassetrader是否可以返回非交错结果

如果不是,我将如何将其转换为非交错音频缓冲列表?我曾尝试使用音频转换器服务,但无法使其接受AudioStreamBasicDescription的输入或输出值。(ASBD)如果我无法从Avassetrader获得我想要的格式的数据,我希望至少能够将其转换为我需要的格式

任何提示都将不胜感激

- (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;
}

我认为kAudioChannelLayoutTag_立体声要求交错采样,所以我会丢失它


这完全取决于您使用这些输出设置创建的AvassetradeOutput类型。AVAssetReaderTrackOutput除了解码到LPCM之外没有任何转换,但是AVAssetReaderAudioMixOutput接受了更多的格式键,事实上它可能是AVAssetReaderTrackOutput+音频转换器。

我了解到我可以让AVAssetReader返回默认输出设置(nil)的结果这将给我一个浮点值的交错结果。浮点值的缓冲区通过缓冲区从左到右交替。我能够处理这些介于-1.0到1.0之间的值,但为了播放音频,有必要将这些值增加到短符号int的范围,因此我将它们乘以SHRT_MAX,并确保这些值保持在SHRT_MAX和SHRT_MIN的范围内,以便音频按预期播放


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

完成。我发现一些旧的挂在那里,很奇怪。我正在使用类似的设置。如果我尝试分离频道,它的播放速率会加倍,这似乎表明它正在将音频转换为单声道。