Зауважте, для наведеного нижче питання: Усі об’єкти локальні на пристрої - мережева трансляція не відбувається. Відео містить аудіозаписи.
Я працюю над додатком для iOS, який вимагає відтворення відеофайлів з мінімальною затримкою для запуску відповідного відеокліпу. На жаль, ми не знаємо, який конкретний відеокліп буде наступним, поки нам насправді не потрібно його запустити. Зокрема: Коли відтворюється один відеокліп, ми будемо знати, що таке наступний набір (приблизно) 10 відеокліпів, але ми не знаємо, який саме, поки не настане час «негайно» відтворити наступний кліп.
Що я зробив, щоб подивитися на фактичні затримки старту, - це зателефонувати addBoundaryTimeObserverForTimes
на відеоплеєр із періодом часу в одну мілісекунд, щоб побачити, коли відео насправді почало відтворювати, і я вважаю різницю цієї позначки часу з першим місцем у код, який вказує, з якого активу почати грати.
З того, що я бачив до цих пір, я виявив, що використання комбінації AVAsset
завантаження, а потім створення AVPlayerItem
з того, коли воно буде готове, а потім очікування AVPlayerStatusReadyToPlay
перед тим, як я зателефоную, грає, як правило, займає від 1 до 3 секунд, щоб почати кліп.
З тих пір я перейшов на те, що, на мою думку, приблизно еквівалентне: дзвінки [AVPlayerItem playerItemWithURL:]
та очікування AVPlayerItemStatusReadyToPlay
гри. Приблизно таке ж виконання.
Я зауважую, що завантаження першого елемента AVPlayer повільніше, ніж решта. Здається, одна ідея полягає в тому, щоб попередньо покласти AVPlayer з коротким / порожнім активом, перш ніж спробувати відтворити перше відео, може бути корисною загальною практикою. [ Повільний запуск для AVAudioPlayer під час першого відтворення звуку
Я хотів би максимально скоротити час початку відео і мати деякі ідеї, з якими можна експериментувати, але хотів би отримати деякі поради від усіх, хто може допомогти.
Оновлення: ідея 7, наведена нижче, як впроваджений приносить час перемикання близько 500 мс. Це вдосконалення, але було б непогано зробити це ще швидше.
Ідея 1: Використовуйте N AVPlayers (не працює)
Використовуючи ~ 10 AVPPlayer
об'єктів і запускайте і призупиняйте всі ~ 10 кліпів, і як тільки ми дізнаємося, який нам насправді потрібен, переключимось на та AVPlayer
повторно призупинивши правильне та почніть все спочатку для наступного циклу.
Я не думаю, що це працює, тому що я читав, що AVPlayer's
в iOS приблизно обмежено 4 активних . Тут хтось запитував про це на StackOverflow і дізнався про обмеження 4 AVPlayer: швидке перемикання між відео-використанням-avfoundation
Ідея 2: Використовуйте AVQueuePlayer (не працюватиме)
Я не вірю, що забивання 10 AVPlayerItems
у « AVQueuePlayer
би» заздалегідь навантажило їх для легкого запуску. AVQueuePlayer
є чергою, і я думаю, що це дійсно лише робить наступне відео в черзі готовим до негайного відтворення. Я не знаю, яке з ~ 10 відео ми хочемо відтворити, поки не настав час розпочати це. ios-avplayer-video-попередня завантаження
Ідея 3: Завантажуйте, грайте та зберігайте AVPlayerItems
у фоновому режимі (ще не на 100% впевнені - але не виглядайте добре)
Я переглядаю, чи є користь для завантаження та відтворення першої секунди кожного відеокліпу у фоновому режимі (вимкнення відео та аудіовиходу), і зберігаю посилання на кожен AVPlayerItem
, і коли ми знаємо, для якого елемента потрібно відтворити реально, поміняйте його одним і замініть фон AVPlayer на активний. Промийте і повторіть.
Теорія полягала б у тому, що останнім часом гравці AVPlayer/AVPlayerItem
можуть все-таки мати деякі підготовлені ресурси, які б зробили подальше відтворення швидше. Поки що я не бачив переваг від цього, але, можливо, я не маю AVPlayerLayer
налаштування правильно для фону. Я сумніваюся, що це дійсно покращить речі від побаченого.
Ідея 4: Використовуйте інший формат файлу - можливо, той, який швидше завантажується?
Зараз я використовую формат H.264 у форматі .m4v (video-MPEG4). H.264 має багато різних варіантів кодеків, тому можливо, що деякі варіанти швидше шукати, ніж інші. Я виявив, що використання більш вдосконалених налаштувань, які зменшують розмір файлу, збільшує час пошуку, але не знайшов жодного варіанту, який би йшов іншим шляхом.
Ідея 5: Поєднання відеоформату без втрат + AVQueuePlayer
Якщо є формат відео, який швидко завантажується, але, можливо, там, де розмір файлу є божевільним, одна ідея може бути попередньо підготувати перші 10 секунд кожного відеокліпу з роздутою, але швидшою для завантаження, але назад що з активом, кодованим у H.264. Використовуйте AVQueuePlayer і додайте перші 10 секунд у нестиснений формат файлу, а потім дотримуйтесь того, який знаходиться в H.264, який отримує до 10 секунд часу підготовки / попереднього завантаження. Тож я отримав би "найкраще" з обох світів: швидкі стартові часи, але також виграє більш компактний формат.
Ідея 6: Використовуйте нестандартний AVPlayer / пишіть власний / використовуйте чужі
Враховуючи мої потреби, можливо, я не можу використовувати AVPlayer, але мені доведеться вдатися до AVAssetReader і розшифрувати перші кілька секунд (можливо, записати необроблений файл на диск). назад швидко. Мені це здається величезним проектом, і якщо я буду вести про це наївно, незрозуміло / навряд чи навіть краще працюватиме. Кожен декодований та нестиснений кадр відео - 2,25 Мб. Наївно кажучи - якщо ми будемо мати ~ 30 кадрів в секунду для відео, я б закінчився вимогою для читання з диска ~ 60 Мб / с, що, ймовірно, неможливо / проштовхує його. Очевидно, що нам доведеться виконати деякий рівень стиснення зображень (можливо, нативні формати стиснення openGL / es через PVRTC) ... але це начебто шалено. Можливо, там є бібліотека, яку я можу використовувати?
Ідея 7: Об'єднайте все в один актив фільму та шукайтеToTime
Одна ідея, яка може бути простішою, ніж деякі з перерахованих вище, полягає в тому, щоб об'єднати все в один фільм і використовувати searchToTime. Річ у тім, що ми б стрибали всюди. По суті випадковий доступ до фільму. Я думаю, що це насправді може спрацювати нормально: avplayer-movie-igra-lag-in-ios5
Який підхід, на вашу думку, буде найкращим? Поки що я не досяг такого великого прогресу в плані зменшення відставання.