2

J'ai un problème sérieux avec le nouveau moteur audio dans iOS8. J'ai une application, qui est construite avec AVAudioPlayer et j'essaie de trouver un moyen de migrer vers la nouvelle architecture, mais je suis tombé sur le problème suivant (qui, je suis sûr que vous seriez d'accord, est un obstacle sérieux et fondamental) :AVAudioEngine gestion incorrecte du temps et rappel pour AVAudioPlayerNode

Mon fichier d'en-tête:

AVAudioEngine *engine; 
AVAudioMixerNode *mainMixer; 
AVAudioPlayerNode *player; 

Mon fichier m (à l'intérieur du viewDidLoad):

engine = [[AVAudioEngine alloc] init]; 
player = [[AVAudioPlayerNode alloc] init]; 

[engine attachNode:player]; 

NSURL *fileUrl = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp3"]]; 

AVAudioFile *file = [[AVAudioFile alloc] initForReading:fileUrl error:nil]; 

NSLog(@"duration: %.2f", file.length/file.fileFormat.sampleRate); 

[player scheduleFile:file atTime:nil completionHandler:^{ 
    AVAudioTime *nodeTime = player.lastRenderTime; 
    AVAudioTime *playerTime = [player playerTimeForNodeTime:nodeTime]; 

    float secs = (float)playerTime.sampleTime/file.fileFormat.sampleRate; 

    NSLog(@"finished at: %.2f", secs); 
}]; 

mainMixer = [engine mainMixerNode]; 

[engine connect:player to:mainMixer format:file.processingFormat]; 
[engine startAndReturnError:nil]; 

[player play]; 

le code ci-dessus initialise le moteur et un noeud, puis commence la lecture tout fichier I » J'utilise. D'abord, il imprime la durée du fichier musical, puis, après la fin de la lecture, dans la fonction de rappel, il imprime l'heure actuelle du lecteur. Ces deux doivent être identiques ou dans le pire des cas, très, très proches les uns des autres, mais ce n'est pas le cas, la différence entre ces deux valeurs est très grande, par ex.

duration: 148.51 
finished at: 147.61 

Est-ce que je fais quelque chose de mal? Cela devrait être assez simple, j'ai essayé avec différents formats de fichiers, longueurs de fichiers, des dizaines de fichiers musicaux, mais la différence est toujours autour ou juste un peu moins de 1 seconde.

Répondre

4

Selon la documentation d'Apple pour scheduleFile:atTime:completionHandler:

Il est possible pour le completionHandler d'être appelé avant de rendre commence ou avant que le fichier est joué complètement.