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