2015-10-07 7 views
0

У меня есть AVMutableComposition, сделанный из видео Slo-Mo. В AVPlayer он играет на правильной скорости, потому что я запросил его из фотографий с помощью PHVideoRequestOptions.Original, который не включает в себя часть Slo-Mo для видео. Однако экспорт изменчивой композиции будет экспортировать ее с полным FPS, что заставляет Slo-Mo вернуться, если FPS слишком высока.Сохранение видео Slo-Mo в обычном FPS

Как экспортировать видео с частотой кадров 30? Есть ли определенный тип файла, который не включает замедленное движение или какой-либо другой способ сделать это?

Два (плохие) решения, которые я нашел:

  1. Установка AVAssetExportSession в AVAssetExportPresetMediumQuality или менее заставит частоту кадров падение, но качество также будет хуже. Нехорошо.
  2. Настройка AVAssetExportSession.videoComposition на композицию видео с frameDuration, которая равна CMTimeMake(1, 30), но для экспорта видео требуется очень много времени, что тоже плохо. Я не знаю, почему это так долго.

ответ

2

Согласно Apple, DTS, в настоящее время лучшим решением является один я упомянул, как номер 2. Вот это более подробно:

 let videoComposition = AVMutableVideoComposition(propertiesOfAsset: mutableComposition) 
     videoComposition.frameDuration = CMTimeMake(1, 30) // Changes FPS to 30 

     let exportSession = AVAssetExportSession(asset: mutableComposition, presetName: AVAssetExportPresetHighestQuality) 

     exportSession?.videoComposition = videoComposition 

     exportSession?.outputURL = temporaryURL 
     exportSession?.outputFileType = AVFileTypeMPEG4      

     exportSession?.exportAsynchronouslyWithCompletionHandler({ 
      // Handling the export 
     }) 

Экспорт с видео композиции, кажется, займет гораздо больше времени, чем это делает без него, но я подал запрос на исправление об улучшении этой ситуации, как было предложено Apple DTS.

+1

Это сработало для меня. В коде есть только небольшая ошибка: 'videoComposition = CMTimeMake (1, 30) // Изменения FPS до 30' должны быть' videoComposition.frameDuration = CMTimeMake (1, 30) ' –

+0

@RuudVisser благодарит за это! Возможно, это избавит кого-то от разочарования. :) – alkku