Ich habe ein Setup wie folgt, testen auf einem iPhone 5s mit iOS 10.3, sowohl innerhalb als auch außerhalb des Debug.
AVAudioRecorder
feuert record(forDuration: 5.0)
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) ) 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
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):
Ich habe schon versucht, an all diesen Dingen herumzuhantieren und habe kein Änderungsverhalten gesehen.
Der CADisplayLink
wird vom Hauptthread über
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.
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.
Tags und Links ios avaudioplayer avaudiorecorder swift avaudiosession