Одновременно транслировать и сохранять видео? - PullRequest
17 голосов
/ 25 мая 2009

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

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

Я бы хотел избежать сценария "скачай и играй". Есть идеи?

Ответы [ 3 ]

11 голосов
/ 08 октября 2009

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

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

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

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

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

2 голосов
/ 07 апреля 2013

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

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

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

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

Удачи!

1 голос
/ 29 августа 2009

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

...