2011-04-29 12 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)で結果を返すことができることを知りました。浮動小数点値のバッファは、バッファを介して左から右へ交互に切り替わります。私はこれらの値を-1.0から1.0の範囲で扱うことができますが、オーディオを再生するには、値を短い符号付き整数の範囲に増やす必要があります。したがって、SHRT_MAXでそれらを掛け、値はSHRT_MAXとSHRT_MINの範囲内にとどまり、オーディオは期待どおりに再生されます。

インターリーブバッファは同じバッファにLとRの値を返すので、AudioBufferListに反映される1つのバッファの2つのチャネルとみなされます。以前は、1つのバッファにつき1つのチャンネルで2つのバッファを取得することができましたが、これは非常に簡単なインターリーブ形式を理解したので、今は必要ありません。

+0

奇妙な。私は同様のセットアップを使用しています。チャンネルを分離しようとすると、再生レートが倍になります。これは、オーディオをモノラルに変換しているようです。 – jin

1

kAudioChannelLayoutTag_Stereoがインターリーブされたサンプルをリクエストしていると思いますので、それを失います。

これらの出力設定で作成するAVAssetReaderOutputの種類によって異なります。 AVAssetReaderTrackOutputはデコードを超えてLPCMに変換することはありませんが、AVAssetReaderAudioMixOutputはより多くのフォーマットキーを受け取ります。実際はAVAssetReaderTrackOutput + AudioConverterです。

関連する問題