聽起來像你有幾個問題堆積在那裏。
當您設置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的緩衝 - > 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*/);
}
我不關注「立體聲」和「交錯」之間的區別。我認爲你要處理的是有兩個雙聲道音頻流(交錯,其中L和R是交替的),而不是兩聲道單聲道聲音。單位可以處理,但一個隊列將會與一個交錯流更快樂。 – invalidname 2011-06-15 21:06:56