У меня есть особый вариант использования, в котором я использую CIFilter
для наложения видео поверх предварительного просмотра камеры в реальном времени, используя AVFoundation
.Короче говоря, я беру пример буфера из captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)
, а затем извлекаю кадр next из массива CMSampleBuffer
, который я уже обработал, используя AVAssetReader
для преобразования желаемого «наложения»."видео в буферы.
Чтобы усложнить ситуацию, мои пользователи могут загружать неограниченное количество видео для наложения поверх их предварительного просмотра видео, используя жест касания для переключения между видео.Я ищу способ развить гладкий опыт с низким объемом памяти для переключения между видео.Вот мои возможные подходы:
Перед тем, как начать AVCaptureSession
, я конвертирую все возможные "оверлейные" видео в массив CMSampleBuffer
.Это меньше, чем хотелось бы, из-за невероятного количества занятой памяти.
Когда пользователь выбирает новое «оверлейное» видео, я затем конвертирую видео, используя AVAssetReader
длямассив CMSampleBuffer
.Это меньше, чем хотелось бы из-за заметного лага, когда AVAssetReader
выполняет его обработку (но приличное использование памяти, в зависимости от длины видео).
Не уверен, если это возможно, но используйте AVPlayer
, чтобы загрузить желаемое видео и извлечь соответствующий кадр.Я не уверен, как «пройти» через AVPlayer, чтобы выбрать «следующий» кадр в видео, хотя я могу гарантировать, что и у моего AVCaptureSession
, и у «оверлейного» видео всегда будет одинаковая частота кадров.Это было бы идеально, так как буферы не должны быть сохранены в памяти, но я могу заметить задержку в преобразовании такого кадра в CIImage.
Любые другие мысли о том, как к этому можно приблизитьсяБуду очень признателен!