Wie die Zeit Etikett während der Aufnahme mit dieser Capture-Pipeline in AVFoundation aktualisieren:iOS richtiger Weg für die Aktualisierung Aufnahmezeit seit Beginn der Aufzeichnung
Mic -> AVCaptureDeviceInput -> AVCaptureSession -> AVCaptureAudioDataOutput
AVCaptureAudioDataOutput hat Delegierter und AVAssetWritter die sampleBuffers in die Ausgabedatei schreibt. In dieser Lösung möchte ich die Aufnahmezeit aktualisieren. Ich kann die Zeit aufzeichnen, wenn der Benutzer auf "Aufnahme/Pause/Fortsetzen/Stopp" klickt, aber gibt es einen offiziellen Weg von Apple, wie man ein UILabel um 00:00:00 Uhr am Anfang aktualisieren kann. Ich weiß, ich NSTimer verwenden kann, aber wie ich mit AVAudioRecorder arbeite ich hatte Eigenschaft:
var currentTime: TimeInterval
// The time, in seconds, since the beginning of the recording.
Die obige Eigenschaft mit Pause arbeitet/Taste weiterhin als gut.
Jetzt in dieser neuen Pipeline habe ich diese Eigenschaft nicht und ich frage mich, ob ich etwas vermisse und es nirgends finden kann. Auch habe ich bemerkt, dass AVCaptureSession die CMClock-Eigenschaft namens masterClock hat, aber ich bin nicht sicher, wie man es seit dem Beginn der Aufzeichnung zur Berechnung der Zeit verwendet. basierend auf andere sample
CMClockGetHostTimeClock()
CMSyncConvertTime
So erhält Anzahl der Sekunden seit dem Beginn der Aufzeichnung in AVCaptureAudioDataOutputSampleBufferDelegate Methode:
ich diese ganze Idee von Uhren und Methoden nicht wie bekommen?
UPDATE
entdeckte ich eine Klasse namens CMTimebase und ich denke, das exacly ist das, was ich suchte. Zur Zeit weiß ich nicht, wie man es benutzt, aber was ich nach einigen Experimenten auf dem Spielplatz gefunden habe.
import CoreMedia
let masterClock = CMClockGetHostTimeClock() // This masterclock should be from captureSession
var timebase: CMTimebase? = nil
CMTimebaseCreateWithMasterClock(kCFAllocatorDefault, masterClock, &timebase)
print(CMTimeGetSeconds(CMTimebaseGetTime(timebase!)))
CMTimebaseSetRate(timebase!, 1.0) // Start/Resume recording
sleep(1)
print(CMTimeGetSeconds(CMTimebaseGetTime(timebase!)))
sleep(1)
CMTimebaseSetRate(timebase!, 0.0) // Pause Recording
print(CMTimeGetSeconds(CMTimebaseGetTime(timebase!)))
sleep(1)
print(CMTimeGetSeconds(CMTimebaseGetTime(timebase!)))
So ist dieses Objekt wirklich nützlich. Wenn ich die Rate auf 1.0 setze, beginnt die Zeit synchron mit MasterClock zu messen. Wenn ich die Rate auf 0.0 stelle, hört die Messung auf. Ich habe auch bemerkt, dass ich Timer an dieses Objekt anhängen kann. Leider gibt es kein gutes Tutorial dieses Core Media Krams überhaupt nur ein paar API-Dokumentation auf Apple-Website. Weiß jemand, ob es ein gutes Tutorial/Video von der WWDC zum Thema CoreMedia Framework gibt?
Ich habe CMTimebase vorher noch nicht benutzt, aber Sie sollten es nutzen können, um das zu tun, was Sie wollen. Wenn Sie die Aufzeichnung starten und die CMTimebase lesen, wenn Sie die Uhrzeit aktualisieren möchten, fügen Sie sie einfach an die AVCaptureSession-Uhr an. Sie werden immer noch entweder einen Timer benötigen oder immer "so oft" Puffer auslösen, um die Anzeige zu aktualisieren. Leider kenne ich keine Dokumentation und eine schnelle Google zeigt auch keine. Viel Glück! –