2017-04-16 2 views
5

Ich erstelle diese App von mir und schieße Videos mit 120 und 240 fps.Erstellen eines echten Zeitlupenvideos, die alle Zeitlupe sind

Wenn ich diese Videos auf meinem Mac sehe, sehe ich diese Markierungen unter der Zeitleiste.

enter image description here

Dieser Marker ist editierbar und den Bereich darstellen, die in Zeitlupe ist. Das Video startet also mit der normalen Bildrate, geht in Zeitlupe und kehrt am Ende zur normalen Bildrate zurück. Ich lege diese Marker nicht dorthin, iOS hat es getan. In diesem Fall frage ich mich, ob es eine Möglichkeit gibt, sie zu entfernen und die Videos in Zeitlupe zu machen.

Ich initialisiere gerade AVAssetWriter normal wie ich für ein Video non-Zeitlupe würde.

Ich habe auch festgestellt, dass diese "Slow Motion" Videos sind nicht wirklich Zeitlupe, aber sie sind "Rezepte" für Zeitlupe, die nur auf iOS-Geräten und Macs mit QuickTime X korrekt spielen. Nicht einmal QuickTime 7 spielt sie richtig .

Wie auch immer, um dieses Ding zu einer echten Zeitlupe zu machen, die auf jedem beliebigen Computer gespielt werden kann?

Antwort

2

Ihre "Slow Motion" Videodateien sind eigentlich nur Videodateien mit hohen Frameraten. iOS senkt die Wiedergaberate, um die zusätzlichen Bilder in Form von Zeitlupe anzuzeigen. Das Problem besteht darin, dass andere Player mit einer Wiedergaberate von 1 wiedergegeben werden. Um den Effekt also portierbar zu machen, müssen Sie stattdessen die Zeitstempel für die Frame-Präsentation ändern.

Sie können dies wahrscheinlich mit einem AVMutableComposition tun, aber ich bevorzuge die mehr wysiwyg AVAssetReader/AVAssetWriter Paar. So etwas für jeden Rahmen in der Eingabedatei:

if let inSampleBuffer = readerOutput.copyNextSampleBuffer() { 
    let inTimeStamp = CMSampleBufferGetPresentationTimeStamp(inSampleBuffer) 
    let outTimeStamp = CMTimeMultiplyByFloat64(inTimeStamp, 30.0/240) // slow 240 fps down to 30fps (8x slowmo) 
    var outSampleBuffer: CMSampleBuffer? 
    var outTimingInfo = CMSampleTimingInfo(duration: kCMTimeInvalid, presentationTimeStamp: outTimeStamp, decodeTimeStamp: kCMTimeInvalid) 

    if CMSampleBufferCreateCopyWithNewTiming(kCFAllocatorDefault, inSampleBuffer, 1, &outTimingInfo, &outSampleBuffer) == noErr { 
     writerInput.appendSampleBuffer(outSampleBuffer!) 
    } 
} else { 
    // finished 
} 
+0

BRILLIANT !!!!!!!!! Vielen Dank – SpaceDog

Verwandte Themen