Одновременно транслировать и сохранять видео?
Я пишу приложение, часть которого позволяет пользователю просматривать / воспроизводить видео. Я хочу ограничить функциональность, чтобы они могли только передавать потоковое видео, если у них есть соединение WiFi. Затем я сохраню видео, чтобы при подключении только к сети 3G (или ниже) они не могли передавать потоковое видео и воспроизводить только видео, сохраненные на телефоне.
В идеале я хотел бы получить MPMoviePlayerController для потоковой передачи / воспроизведения фильма, а затем получить доступ к данным фильма и сохранить их. Однако API MPMoviePlayerController, похоже, не поддерживает доступ к данным фильма.
Я хотел бы избежать и скачать-затем-играть сценарий. Есть идеи?
3 ответа
На ум приходят два решения. Оба эти решения требуют, чтобы файл был в формате, который можно воспроизводить в прогрессивном формате, например, чтобы вам не нужно было воспроизводить весь файл целиком (но это в любом случае является обязательным условием).
- используйте поток, чтобы загрузить данные и добавить их в файл, и воспроизвести файл из другого потока. Теперь для этого требуется, чтобы вы могли обрабатывать события EOF в MPMoviePlayerController и приостанавливать воспроизведение до тех пор, пока кэш-файл не будет добавлен, а затем возобновить работу для той же точки.
Пока что то, что я видел у людей, делающих это, не работает, потому что MPMoviePlayerController не может обработать событие EOF. (пока не проверял сам) [ Кэширование видео на диск после успешной предварительной загрузки MPMoviePlayerController
- Пропустить воспроизведение из файла и настроить локальный HTTP-сервер и поток с него (на localhost). Это тоже не проверено. Идея состоит в том, что MPMoviePlayerController будет лучше обрабатывать событие отсутствия данных из потока HTTP, чем при непосредственном чтении файла. Недостатком может быть то, что он менее эффективен, но я думаю, что это незначительное увеличение процессора. Я не знаю, справится ли сетевой интерфейс с этим, но я предполагаю, что это не проблема.
Я оставляю этот ответ в вики, потому что у меня нет рабочего решения, но я тоже хочу его.
Есть способ заставить это работать, но вы должны написать свой собственный загрузчик HTTP Live Streaming.
По сути, вы анализируете файл.m3u8 (это довольно простой стандарт, но может оказаться сложнее с альтернативными потоками и возможностью того, что поток просто прекратится и потребуется новый список воспроизведения для продолжения), а затем загрузите фрагменты в формате.ts в локальное хранилище, скажем, папка "Документы" или "Кэши" и т. д.
Затем вам нужно будет настроить локальный HTTP-сервер, чтобы MPMoviePlayerController или AVPlayer могли обращаться к файлам по HTTP (поскольку они не будут затрагивать локальный путь к файлу), включая перекодированный файл списка воспроизведения, указывающий на локальные файлы, который вы должны будете создать самостоятельно из оригинальных списков воспроизведения. CocoaHTTPServer отлично подходит для этого.
После того, как вы сделали все это, он прекрасно работает. Неизбежно, что вы получаете небольшую задержку при загрузке первой или двух частей, прежде чем представить свой локальный URL-адрес HTTP для проигрывателя фильмов, но после этого вы получаете плавную загрузку, запись и предварительное воспроизведение.
Удачи!
iPhone использует прогрессивную загрузку, поэтому он не будет сохраняться на устройстве. Для этого вам нужно явно загрузить его, а затем воспроизвести видео из локальной папки.