2016-11-02 1 views
3

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?

+0

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! –

Antwort

2

Wenn Sie mit AVCaptureAudioOutput arbeiten, arbeiten Sie jetzt mit Sample Buffers. Unabhängig davon, ob es sich um Video oder Audio handelt, benötigen Sie zwei wichtige Informationen, die Beispieldaten und die Zeit, zu der die Beispieldaten aufgezeichnet wurden.

Dies ist die „Clock“ https://developer.apple.com/reference/coremedia/cmclock

Eine Uhr eine Quelle von Zeitinformationen darstellt: in der Regel, ein Stück Hardware, die den Lauf der Zeit misst.

Es ist sehr genau, und das ist wirklich der Punkt. Es ist schreibgeschützt, Sie können nur eine Referenz davon abrufen und Sie können es nicht festlegen. Bei Puffern können allerlei Dinge passieren, sie werden in die Warteschlange gestellt, sie können über ein Netzwerk weitergeleitet werden, aber wenn Sie diese CMTime-Referenz haben, können sie in die richtige Reihenfolge und zum richtigen Zeitpunkt rekonstruiert werden.

CMSync ist eine Teilmenge von Funktionen, die sich mit der Taktdrift (zwischen zwei verschiedenen Uhren, die leicht unterschiedliche Werte melden) befassen. Sie brauchen sich überhaupt keine Gedanken über diese zu machen.

Eigentlich zu tun, was Sie wollen, ist sehr einfach. Hier ist ein Beispiel, das Sie auf einen Spielplatz schneiden und einfügen können.

import AVFoundation 

let masterClock : CMClock = CMClockGetHostTimeClock() 
let startTime : CMTime = CMClockGetTime(masterClock) 
sleep(1) 
let endTime : CMTime = CMClockGetTime(masterClock) 
let difference : CMTime = CMTimeSubtract(endTime, startTime) 
let seconds = CMTimeGetSeconds(difference) 

, dass Sie einen Sekundenwert von etwas> 1.

geben sollten, wenn Sie die Aufnahmetaste in der Anwendung klicken, wird die AVCaptureSession Uhr greifen und die Startzeit erfassen.

Wenn Sie die Benutzeroberfläche aktualisieren möchten, überprüfen Sie die Uhr AVCaptureSession erneut, subtrahieren Sie die beiden CMTime und konvertieren Sie sie in Sekunden.

Stellen Sie nur sicher, dass Sie die Benutzeroberfläche nicht auf jedem Sample-Puffer aktualisieren, das wäre viel zu häufig, also vielleicht nur alle 14.000 Samples oder so (oder was auch immer für die von Ihnen verwendete Audiofrequenz funktioniert) . Stellen Sie außerdem sicher, dass das in einen separaten Thread ausgelagert wird.

Hoffe das hilft und erklärt ein wenig auf den Uhren. Viel Glück!

+1

Großartige großartige Antwort, sehr informativ. Ich werde versuchen, damit auf dem Spielplatz zu spielen. Ich bin mir bewusst, dass es sinnlos ist, UILabel 44100 Mal pro Sekunde (mit der Audio-Sampleraten-Frequenz) zu aktualisieren, wenn ich nur 60fps im Display habe. Ich komme morgen dazu. Vielen Dank! –

+0

Ich bin froh, dass das nützlich war, sobald du es ausprobiert hast und du glücklich bist, kannst du gerne die Antwort annehmen und abstimmen. –

+0

Tim kannst du mein Update auf die Frage ansehen und meine Entdeckung überprüfen. Vielleicht kennen Sie einige gute Tutorials/Materialien zu CoreMedia Framework? –

Verwandte Themen