Как наиболее эффективно получить кадр из видео в Swift

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

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

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

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

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

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

0 ответов

Другие вопросы по тегам