AvaudioEngine Несколько avaudioinputnodes не играют в идеальной синхронизацииIOS

Программируем под IOS
Ответить
Anonymous
 AvaudioEngine Несколько avaudioinputnodes не играют в идеальной синхронизации

Сообщение Anonymous »

Я пытался использовать 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 достаточно времени, чтобы загрузить буферы и исправить все наши проблемы с синхронизацией звука. Hope this helps others!

Подробнее здесь: https://stackoverflow.com/questions/273 ... rfect-sync
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»