そこにはいくつかの質問が積み上げられているようですね。
AVAssetReader をセットアップするときに、設定のディクショナリを渡すことができます。AVAssetReaders を作成する方法は次のとおりです...
AVAssetReader* CreateAssetReaderFromSong(AVURLAsset* songURL) {
if([songURL.tracks count] <= 0)
return NULL;
AVAssetTrack* songTrack = [songURL.tracks objectAtIndex:0];
NSDictionary* outputSettingsDict = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithInt:kAudioFormatLinearPCM],AVFormatIDKey,
// [NSNumber numberWithInt:AUDIO_SAMPLE_RATE],AVSampleRateKey, /*Not Supported*/
// [NSNumber numberWithInt: 2],AVNumberOfChannelsKey, /*Not Supported*/
[NSNumber numberWithInt:16],AVLinearPCMBitDepthKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsBigEndianKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsFloatKey,
[NSNumber numberWithBool:NO],AVLinearPCMIsNonInterleaved,
nil];
NSError* error = nil;
AVAssetReader* reader = [[AVAssetReader alloc] initWithAsset:songURL error:&error];
{
AVAssetReaderTrackOutput* output = [[AVAssetReaderTrackOutput alloc] initWithTrack:songTrack outputSettings:outputSettingsDict];
[reader addOutput:output];
[output release];
}
return reader;
}
左チャンネルと右チャンネルを分割する限り、「AVLinearPCMBitDepthKey」に基づいてデータをループできます。
16ビットの場合、このようなもの...
for (j=0; j<tBufCopy; j++, pAD+=2) { // Fill the buffers...
mProcessingBuffer.Left[(tBlockUsed+j)] = ((sint32)pAD[0]);
mProcessingBuffer.Right[(tBlockUsed+j)] = ((sint32)pAD[1]);
}
これで、処理にこれが必要になると思います。しかし、インターリーブ形式でデータを保持することは、非常に優れています。通常、ストレート インターリーブ形式を使用して、AudioQueue またはリモート I/O コールバックに直接渡すと、正しく再生されます。
AudioQueue フレームワークを使用してオーディオを再生するには、データが次のフローに従う必要があります。
AVAssetReader -> NSData Buffer -> AudioQueueBuffer
次に、追加のデータを要求する AudioQueue コールバックで、単純に AudioQueueBuffer を渡します。何かのようなもの...
- (void) audioQueueCallback:(AudioQueueRef)aq buffer:(AudioQueueBufferRef)buffer {
memcpy(buffer->mAudioData, srcData, mBufferByteSize);
//Setup buffer->mAudioDataSize
//...
AudioQueueEnqueueBuffer(mQueue, buffer, 0 /*CBR*/, 0 /*non compressed*/);
}