Вопрос

Я пишу приложение, часть которого позволяет пользователю транслировать/воспроизводить видео.Я хочу ограничить функциональность, чтобы они могли транслировать видео только при наличии подключения к Wi-Fi.Затем я сохраню видео, чтобы при наличии соединения только 3G (или меньшего) они не могли транслировать видео и могли воспроизводить только видео, сохраненные на телефоне.

В идеале я хотел бы, чтобы MPMoviePlayerController осуществлял потоковую передачу/воспроизведение фильма, а затем получал доступ к данным фильма и сохранял их.Однако API MPMoviePlayerController, похоже, не поддерживает доступ к данным фильма.

Я бы хотел избежать сценария «загрузи, а затем играй».Есть идеи?

Это было полезно?

Решение

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

  1. используйте поток для загрузки данных и добавления их в файл, а также воспроизведите файл из другого потока.Теперь для этого требуется, чтобы вы могли обрабатывать события EOF в MPMoviePlayerController и приостанавливать воспроизведение до тех пор, пока файл кэша не будет добавлен, а затем возобновить его с той же точки.

Пока что я видел, как люди делают это, но это не работает, потому что MPMoviePlayerController не может обработать событие EOF.(еще не проверял на себе) [Кэширование видео на диск после успешной предварительной загрузки с помощью MPMoviePlayerController

  1. Пропустите воспроизведение из файла и настройте локальный HTTP-сервер и транслируйте с него (на локальном хосте).Это также не проверено.Идея состоит в том, что MPMoviePlayerController будет лучше обрабатывать события отсутствия данных из потока HTTP, чем при непосредственном чтении файла.Обратной стороной может быть то, что он менее эффективен, но я думаю, что это незначительное увеличение загрузки ЦП.Я не знаю, справится ли с этим сетевой интерфейс, но предполагаю, что это не проблема.

Я оставляю этот ответ в виде вики, потому что у меня нет рабочего решения, но я тоже его хочу.

Другие советы

Есть способ заставить это работать, но вам придется написать свой собственный загрузчик HTTP Live Streaming.

По сути, вы анализируете файл .m3u8 (это довольно простой стандарт, но может оказаться затруднительным из-за альтернативных потоков и возможности того, что поток просто прекратится и для продолжения потребуется новый список воспроизведения), а затем загружаете фрагменты в формате .ts в ваше локальное хранилище, скажем, папка «Документы» или «Кэши» и т. д.

Затем вам нужно будет настроить локальный HTTP-сервер, чтобы позволить MPMoviePlayerController или AVPlayer получать доступ к файлам через HTTP (поскольку они не будут касаться локального пути к файлу), включая перекодированный файл списка воспроизведения, указывающий на локальные файлы, который вам придется создать самостоятельно из исходных плейлистов.CocoaHTTPServer отлично подходит для этого.

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

Удачи!

iPhone использует прогрессивную загрузку, поэтому сохранение на устройстве не сохраняется.Для этого вам необходимо явно загрузить его, а затем воспроизвести видео из локальной папки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top