2011-04-29 1 views
7

AudioUnit을 통해 왼쪽 및 오른쪽 오디오를 처리 할 수 ​​있도록 2 개의 버퍼가있는 AVAssetReader에서 AudioBufferList를 다시 가져올 수 있기를 바랍니다. 아래 출력 설정을 사용해 보았지만 kAudioChannelLayoutTag_Stereo로 설정 한 스테레오 레이아웃을 지정하면 읽을 수 없습니다.AVAssetReader를 사용하여 스테레오 채널 레이아웃을 다시 가져올 수 있습니까?

AVAssetReader가 비 인터리브 결과를 반환 할 수 있습니까?

그렇지 않은 경우 어떻게 인터리브되지 않은 AudioBufferList로 변환하겠습니까? Audio Converter Services를 사용하려고했지만 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; 
} 
+0

완료. 나는 옛날 사람들이 거기서 놀고있는 것을 발견했다. – Brennan

답변

0

나는 AVAsetReader가 플로팅 값의 인터리브 결과를 얻을 수있는 기본 출력 설정 (nil)으로 결과를 반환 할 수 있음을 알게되었습니다. float 값의 버퍼는 버퍼를 통해 왼쪽에서 오른쪽으로 번갈아 가며 나타납니다. 나는이 값을 -1.0에서 1.0까지의 범위에서 사용할 수 있지만 오디오를 재생하려면 값을 짧은 부호있는 int 범위로 늘려야하므로 SHRT_MAX로 곱해서 값은 SHRT_MAX 및 SHRT_MIN 범위 내에 있으므로 오디오가 예상대로 재생됩니다.

인터리브 된 버퍼는 동일한 버퍼에 L 및 R 값을 반환하므로 1 버퍼에서 2 개의 채널로 간주되어 AudioBufferList에 반영됩니다. 이전에는 버퍼 당 1 개의 채널로 2 개의 버퍼를 되 찾을 수 있었지만 이제는 매우 간단한 인터리브 형식을 이해할 필요가 없습니다.

+0

이상한. 비슷한 설정을 사용하고 있습니다. 채널을 분리하려고하면 재생 속도가 두 배로 늘어나므로 오디오를 모노로 변환하고있는 것으로 보입니다. – jin

1

kAudioChannelLayoutTag_Stereo가 인터리브 샘플을 요청 중이므로 손실 될 것입니다.

모든 출력 설정으로 생성하려는 AVAssetReaderOutput의 종류에 따라 다릅니다. AVAssetReaderTrackOutput은 디코딩을 넘어 LPCM으로 변환하지 않지만 AVAssetReaderAudioMixOutput은 더 많은 형식 키를 허용합니다. 사실 AVAssetReaderTrackOutput + AudioConverter입니다.