Я разрабатываю приложение iOS для iPad, которое должно воспроизводить видео в какой-то части экрана. У меня есть несколько видеофайлов, которые нужно воспроизводить друг за другом в порядке, который не указан во время компиляции. Должно быть, это выглядит так, как будто воспроизводится только одно видео. Это нормально, что при переходе от одного видео к другому есть некоторая задержка, когда отображается последний или первый кадр из двух видео, но не должно быть мерцания или белых экранов без содержимого. Видео не содержат аудио. Важно учитывать использование памяти. Видео имеют очень высокое разрешение, и одновременно можно воспроизводить несколько различных видеопоследовательностей.
Чтобы получить это, я пробовал несколько решений. Они перечислены ниже:
1. AVPlayer с AVComposition со всеми видео в нем
В этом решении у меня есть AVPlayer, который будет использоваться только для AVPlayerItem, созданного с использованием AVComposition, содержащего все видео, помещенные рядом друг с другом. При переходе к конкретным видео я ищу время в композиции, с которого начинается следующее видео. Проблема с этим решением заключается в том, что при поиске проигрыватель быстро показывает некоторые кадры, по которым он ищет, что недопустимо. Кажется, что нет возможности сразу перейти к определенному времени в композиции. Я попытался решить эту проблему, сделав изображение последнего кадра в видео, которое только что закончилось, затем показать его перед AVPLayer во время поиска и, наконец, удалить его после завершения поиска. Я создаю изображение с помощью AVAssetImageGenerator, но по какой-то причине качество изображения не такое, как видео, поэтому при отображении и скрытии изображения поверх видео наблюдаются заметные изменения. Другая проблема заключается в том, что AVPlayer использует много памяти, потому что один AVPlayerItem содержит все видео.
2. AVPlayer с несколькими AVPlayerItems
Это решение использует AVPlayerItem для каждого видео и заменяет элемент AVPlayer при переключении на новое видео. Проблема заключается в том, что при переключении элемента AVPlayer он будет показывать белый экран на короткое время при загрузке нового элемента. Чтобы исправить это, можно использовать решение с помещением изображения перед последним кадром во время загрузки, но все же с проблемой, заключающейся в том, что качество изображения и видео отличается и заметно.
3. Два AVPlayer друг над другом по очереди воспроизводят AVPlayerItem.
Следующее решение, которое я попробовал, заключалось в том, чтобы два AVPlayer располагались друг над другом, которые по очереди воспроизводили AVPlayerItems. Поэтому, когда один из игроков закончит воспроизведение, он останется на последнем кадре видео. Другой AVPlayer будет выведен на передний план (с его параметром, установленным в nil, поэтому он будет прозрачным), и следующий AVPlayerItem будет вставлен в этот AVPlayer. Как только он будет загружен, он начнет воспроизводиться, и иллюзия плавной транзакции между двумя видео останется неизменной. Проблема с этим решением - использование памяти. В некоторых случаях мне нужно воспроизводить два видео на экране одновременно, что приводит к одновременному появлению 4 AVPlayers с загруженным AVPlayerItem. Это просто слишком много памяти, поскольку видео могут быть в очень высоком разрешении.
Есть ли у кого-нибудь мысли, предложения, комментарии или что-то относительно общей проблемы и опробованных решений, опубликованных выше.