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