AVAudioRecorder currentTime gibt schlechte Werte

8

Ich habe ein Setup wie folgt, testen auf einem iPhone 5s mit iOS 10.3, sowohl innerhalb als auch außerhalb des Debug.

  • Ein AVAudioRecorder feuert record(forDuration: 5.0)
  • A CADisplayLink überwacht die Ebenen des Rekorders (der Rekorder ist meteringEnabled ), synchronisiert eine Animation und verfolgt recorder.currentTime (aber das Problem kann reproduziert werden, indem man die Zeit in der Anzeigeverbindung minimal verfolgt) )
  • Die Berichte von recorder.currentTime erreichen konsistent Werte & gt; 5 (oft 5,2 bis 5,5). Die Ergebnisse stimmen im Wesentlichen mit den Werten von recorder.deviceTime und CFAbsoluteTimeGetCurrent überein
  • Ich initialisiere ein AVAudioPlayer und vergewissere mich, dass das Sound-Asset eine Dauer von genau 5,0 Sekunden hat.

Nach meinem Verständnis wird der currentTime des Rekorders in Sekunden gemessen und auf 0,0 zurückgesetzt, wenn recorder.isRecording auf false zurückgesetzt wird. Dies geschieht sofort, wenn der Rekorder stoppt (dies stimmt mit dem in audioRecorderDidFinishRecording überein). .. also die Beobachtung mit einem CADisplayLink sollte currentTime Werte strikt kleiner als 5.0 ergeben?

Die Frage ist: Was könnte hier schiefgehen? Der Recorder hält nach genau 5 Sekunden an, wie er sollte, aber intern denkt er, dass er für mehr als 5 Sekunden aufgenommen wurde? Ich höre alle meine Aufnahmen und sie klingen gut.

Ich bin mir nicht sicher, ob das relevant ist, aber mein AVAudioSession ist vom Typ AVAudioSessionCategoryPlayAndRecord , und meine Audioeinstellungen sind wie folgt (alle diese mit Ausnahme der Abtastrate sind für die spätere Analyse notwendig):

%Vor%

Ich habe schon versucht, an all diesen Dingen herumzuhantieren und habe kein Änderungsverhalten gesehen.

Der CADisplayLink wird vom Hauptthread über

hinzugefügt %Vor%

Die einzige ähnliche Frage, die ich im Stack-Austausch finden kann, ist diese , aber die Frage ist unterspezifiziert und die Antwort nicht hilfreich (für mich zumindest).
Zuerst dachte ich, dass das Problem vielleicht darin besteht, die Hauptwarteschlange zu überladen, so dass das Zeitgefühl des Rekorders irgendwie aufgebläht wird (was ich denke  würde immer noch schlechtes Verhalten darstellen), aber nachdem ich die Animation deaktiviert habe (und auch mit einem Timer statt mit einem CADisplayLink experimentiere), besteht das Problem weiterhin !!! Vielleicht ist es immer noch ein Threading-Problem, aber ich sehe nicht, warum das der Fall wäre. Und wenn ich Multithreading benötige, könnte ich etwas Hilfe sowohl beim Verständnis als auch bei der Implementierung verwenden :) Irgendwelche Ideen geschätzt.

    
Badam Baplan 11.04.2017, 16:50
quelle

1 Antwort

0

Von all den Zeiten, in denen ich AVAudioRecorder benutzt habe, musste ich sie irgendwann ersetzen. AVAudioRecorder ist eine universelle Aufnahmeklasse. Wenn Ihre Anforderungen etwas spezialisiert sind, werden Sie enttäuscht.

Es macht jedoch das Dosieren, was viele Leute dazu anzieht. Vielleicht kann die Situation gerettet werden.

Möglichkeiten:

a. Wenn currentTime nicht vertrauenswürdig ist, dann beobachte es nicht! Sie haben Ihre 5-Sekunden-Dateien, also finden Sie vielleicht eine andere Möglichkeit, diesen Zeitabschnitt in Ihrer App zu markieren.

b. von der Eigenschaft currentTime lautet die Header-Datei:

%Vor%

Probieren Sie currentTime nur während der Aufnahme aus? Wenn ja, könnte das das Problem sein. In diesem Fall könnten Sie die Eigenschaft deviceCurrentTime verwenden, die immer gültig ist, obwohl Sie das ursprüngliche deviceCurrentTime abziehen müssen.

Wenn die Situation nicht gerettet werden kann, könntest du AVAudioRecorder mit AVAudioEngine und AVAudioFile ziemlich schnell ersetzen, aber das ist eine Frage für einen anderen Tag.

    
Rhythmic Fistman 13.04.2017 21:48
quelle