Низкая производительность при воспроизведении больших MP4 через HTTP по локальной сети с AVFoundation - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть несколько больших файлов MP4, размещенных на HTTP-сервере в моей локальной сети. Я пытаюсь передать их в приложение tvOS, используя AVPlayer. Apple TV имеет гигабитное соединение с сервером, и я подтвердил, что он может загружать с него обычные файлы со скоростью не менее 600 Мбит.

Потоковое видео, закодированное с примерно до 20 Мбит работает без проблем: никаких задержек нет, поиск является практически экземпляром, и при этом появляется предварительный просмотр миниатюр и т. д., например, c.

К сожалению, при потоковой передаче 4K HEV C кодируется файлы на скорости около 50 Мбит - это отдельная история: после нескольких секунд воспроизведения без каких-либо сбоев обычно они полностью замирают и пытаются возобновить работу после любой сцены даже легкой сложности.

Я знаю, что видео воспроизводится по HTTP URL в AVFoundation загружает фрагменты по мере необходимости, а не загружает полный файл один раз, поэтому я ожидал некоторых дополнительных затрат, но после анализа журналов сервера кажется, что он извлекает не более нескольких мегабайт за раз, со многими запросами быть еще меньше. В любом случае, кажется, что в среднем он выполняет несколько запросов в секунду, что, по-моему, является узким местом где-то.

Я пытался связать HTTP-сервер в моем приложении tvOS, который бы проксировал восходящий HTTP-сервер, но получил ~ 50 Вместо этого фрагменты МБ кешируются, поскольку AVPlayer запрашивает их гораздо меньшие, но это, похоже, приводит к проблемам с производительностью.

Если я перекодирую видео на сервере, используя FFmpeg для генерации потоков HLS с фрагментированными MP4 они воспроизводятся без проблем, я полагаю, потому что это действительно заставляет его загружать большие фрагменты реже (хотя, когда я делаю это таким образом, при поиске, кажется, теряется эскиз предварительного просмотра).

У меня вопрос:

  • Можно ли заставить AVFoundation более эффективно загружать большие MP4, например, прося загружать более крупные фрагменты реже?
  • Если это невозможно, возможно ли это? можно как-то перекодировать формат по запросу в режиме реального времени с сервера без изменения кодеки (например, используя -c copy в FFmpeg) таким образом, который позволяет AVFoundation гораздо более эффективно загружать его? Или я могу перекодировать сами файлы только один раз? (Я пытался создать фрагментированные MP4 самостоятельно без плейлиста m3u8, но AVFoundation, похоже, не хотел их воспроизводить.)
  • Если это все еще невозможно, я, вероятно, могу просто создать потоки HLS для всех больших MP4. файлы на стороне сервера, так же, как и unideal. В каком случае, как я могу получить предварительный просмотр при поиске работы?

Существуют и другие приложения, которые могут передавать большие MP4 в режиме реального времени из локальной сети, хотя я думаю, что большинство из них не работают. не использовать AVPlayer, что является требованием для меня. Возможно ли, что AVFoundation, как известно, ужасно неэффективен в этом отношении, и я должен просто использовать HLS?

...