Как наиболее эффективно получить кадр из видео в Swift - PullRequest
0 голосов
/ 01 марта 2019

У меня есть особый вариант использования, в котором я использую CIFilter для наложения видео поверх предварительного просмотра камеры в реальном времени, используя AVFoundation.Короче говоря, я беру пример буфера из captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection), а затем извлекаю кадр next из массива CMSampleBuffer, который я уже обработал, используя AVAssetReader для преобразования желаемого «наложения»."видео в буферы.

Чтобы усложнить ситуацию, мои пользователи могут загружать неограниченное количество видео для наложения поверх их предварительного просмотра видео, используя жест касания для переключения между видео.Я ищу способ развить гладкий опыт с низким объемом памяти для переключения между видео.Вот мои возможные подходы:

  • Перед тем, как начать AVCaptureSession, я конвертирую все возможные "оверлейные" видео в массив CMSampleBuffer.Это меньше, чем хотелось бы, из-за невероятного количества занятой памяти.

  • Когда пользователь выбирает новое «оверлейное» видео, я затем конвертирую видео, используя AVAssetReader длямассив CMSampleBuffer.Это меньше, чем хотелось бы из-за заметного лага, когда AVAssetReader выполняет его обработку (но приличное использование памяти, в зависимости от длины видео).

  • Не уверен, если это возможно, но используйте AVPlayer, чтобы загрузить желаемое видео и извлечь соответствующий кадр.Я не уверен, как «пройти» через AVPlayer, чтобы выбрать «следующий» кадр в видео, хотя я могу гарантировать, что и у моего AVCaptureSession, и у «оверлейного» видео всегда будет одинаковая частота кадров.Это было бы идеально, так как буферы не должны быть сохранены в памяти, но я могу заметить задержку в преобразовании такого кадра в CIImage.

Любые другие мысли о том, как к этому можно приблизитьсяБуду очень признателен!

...