У меня есть два решения этой проблемы:
РЕШЕНИЕ А
- Преобразуйте актив в
AVMutableComposition
. - Каждую секунду сохраняйте только один кадр, удаляя
timing
для всех остальных кадров с помощью методаremoveTimeRange(...)
.
РЕШЕНИЕ Б
- Используйте
AVAssetReader
для извлечения всех отдельных кадров в виде массиваCMSampleBuffer
- Запишите
[CMSampleBuffer]
обратно в фильм, пропуская каждые 20 кадров или около того, согласно требованию. - Преобразуйте полученный видеофайл в
AVMutableComposition
и используйтеscaleTimeRange(..)
, чтобы уменьшить общееtimeRange
видео для эффекта интервальной съемки.
ПРОБЛЕМЫ
- Первое решение не подходит для видео в формате Full HD , видео зависает в нескольких местах, а на панели поиска отображается неточное время .
например, 12-секундный таймлапс может отображаться только как 5-секундный, поэтому он продолжает воспроизводиться даже после завершения поиска.
Я имею в виду, что время видео по какой-то причине сбивается.
- Второе решение невероятно медленное. Для 10-минутного HD видео память будет работать до бесконечности, так как все выполнение выполняется в памяти.
Я ищу метод, который может создавать таймлапс для видео сразу же, без ожидания. Решение A делает это, но не подходит из-за проблем со временем заикание.
Любое предложение было бы здорово. Спасибо!
CMSampleBufferCreateCopyWithNewTiming()
. Тогда нет необходимости в вашем шаге 3. - person Rhythmic Fistman   schedule 13.05.2017[CMSampleBuffer]
вообще должен быть извлечен изassetTrack
, делает это решение очень медленным, а также создает большую нагрузку на память. Это не очень хорошее решение. Я хочу держаться подальше отCMSampleBuffer
. Но если ничего другого не получится, это, вероятно, будет единственный выход. - person   schedule 13.05.2017