2017-04-16 61 views
5

Tworzę tę aplikację i nagrywam filmy z szybkością 120 i 240 fps.Tworzenie prawdziwego filmu w zwolnionym tempie, które jest zwolnione.

Kiedy oglądam te filmy na moim komputerze mac, widzę te znaczniki poniżej osi czasu.

enter image description here

Znaczniki te są edytowalne i stanowią obszar, który znajduje się w zwolnionym tempie. Zatem wideo zaczyna się od normalnej szybkości klatek, wchodzi na zwolnionym tempie i powraca do normalnej szybkości klatek na końcu. Nie umieszczam tam tych znaczników, iOS. W takim przypadku zastanawiam się, czy istnieje sposób, aby je usunąć i spowolnić filmy.

Po prostu inicjuję normalnie AVAssetWriter, tak jak w przypadku wideo nie będącego w zwolnionym tempie.

Zauważyłem również, że te filmy "w zwolnionym tempie" nie są w rzeczywistości filmami w zwolnionym tempie, ale są "recepturami" do zwolnionego ruchu, które są poprawnie odtwarzane na urządzeniach z systemem iOS i komputerach Mac przy użyciu QuickTime X. Nawet QuickTime 7 nie odtwarza ich poprawnie .

W każdym razie, aby uczynić z niego prawdziwy powolny ruch, który można odtwarzać na dowolnym odtwarzaczu, dowolnym komputerze?

Odpowiedz

2

Twoje pliki wideo "w zwolnionym tempie" są w rzeczywistości plikami wideo o dużej liczbie klatek na sekundę. iOS obniża szybkość odtwarzania, aby pokazać dodatkowe klatki w postaci zwolnionego tempa. Problem polega na tym, że inni gracze grają z szybkością odtwarzania równą 1, więc aby efekt był przenośny, należy zamiast tego zmienić znaczniki czasu prezentacji ramek.

Prawdopodobnie możesz to zrobić z AVMutableComposition, ale wolę używać pary więcej wysiwyg AVAssetReader/AVAssetWriter. Coś takiego jak dla każdej ramki w pliku wejściowym:

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 !!!!!!!!! dzięki – SpaceDog