Я пытался использовать AvaudioEngine для планирования нескольких аудиофайлов для воспроизведения в идеальной синхронизации, но при прослушивании вывода, кажется, очень небольшая задержка между входными узлами. Аудио двигатель реализован с использованием следующего графика: < /p>
//
//AVAudioPlayerNode1 -->
//AVAudioPlayerNode2 -->
//AVAudioPlayerNode3 --> AVAudioMixerNode --> AVAudioUnitVarispeed ---> AvAudioOutputNode
//AVAudioPlayerNode4 --> |
//AVAudioPlayerNode5 --> AudioTap
// |
//AVAudioPCMBuffers
//
< /code>
И я использую следующий код для загрузки образцов и планирования их одновременно: < /p>
- (void)scheduleInitialAudioBlock:(SBScheduledAudioBlock *)block {
for (int i = 0; i < 5; i++) {
NSString *path = [self assetPathForChannel:i trackItem:block.trackItem]; //this fetches the right audio file path to be played
AVAudioPCMBuffer *buffer = [self bufferFromFile:path];
[block.buffers addObject:buffer];
}
AVAudioTime *time = [[AVAudioTime alloc] initWithSampleTime:0 atRate:1.0];
for (int i = 0; i < 5; i++) {
[inputNodes scheduleBuffer:block.buffers
atTime:time
options:AVAudioPlayerNodeBufferInterrupts
completionHandler:nil];
}
}
- (AVAudioPCMBuffer *)bufferFromFile:(NSString *)filePath {
NSURL *fileURl = [NSURL fileURLWithPath:filePath];
NSError *error;
AVAudioFile *audioFile = [[AVAudioFile alloc] initForReading:fileURl commonFormat:AVAudioPCMFormatFloat32 interleaved:NO error:&error];
if (error) {
return nil;
}
AVAudioPCMBuffer *buffer = [[AVAudioPCMBuffer alloc] initWithPCMFormat:audioFile.processingFormat frameCapacity:audioFile.length];
[audioFile readIntoBuffer:buffer frameCount:audioFile.length error:&error];
if (error) {
return nil;
}
return buffer;
}
< /code>
Я заметил, что проблема может быть воспринята только на устройствах, я тестирую с iPhone5s, но я не могу выяснить, почему аудиофайлы играют из синхронизации, любая помощь будет высоко оценена. < /p>
** Ответ ** < /p>
Мы в итоге сортировали проблему со следующим кодом: < /p>
AVAudioTime *startTime = nil;
for (AVAudioPlayerNode *node in inputNodes) {
if(startTime == nil) {
const float kStartDelayTime = 0.1; // sec
AVAudioFormat *outputFormat = [node outputFormatForBus:0];
AVAudioFramePosition startSampleTime = node.lastRenderTime.sampleTime + kStartDelayTime * outputFormat.sampleRate;
startTime = [AVAudioTime timeWithSampleTime:startSampleTime atRate:outputFormat.sampleRate];
}
[node playAtTime:startTime];
}
< /code>
Это дало каждому avaudioinputnode достаточно времени, чтобы загрузить буферы и исправить все наши проблемы с синхронизацией звука. Надеюсь, это поможет другим!
Подробнее здесь: https://stackoverflow.com/questions/273 ... rfect-sync