Одновременно транслировать и сохранять видео?

17

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

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

Я бы хотел избежать сценария download-then-play. Любые идеи?

    
задан edoloughlin 25.05.2009 в 17:54
источник
  • Привет, у вас есть успех? –  Bkillnest 15.03.2016 в 03:23

3 ответа

11

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

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

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

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

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

    
ответ дан Johan Carlsson 23.05.2017 в 13:47
  • кто-нибудь пробовал это еще? у вас был успех? –  calimarkus 29.08.2012 в 23:01
  • Я сейчас пытаюсь использовать этот подход. Похоже, что он может работать, но пока не везет. Я использую вилку CocoaHTTPServer с HTTPAsyncDataResponse из этого проекта: github.com/nickhart/CocoaHTTPServer –  vaughan 07.01.2014 в 21:08
  • работает ли это? Я загрузил этот источник, но не смог –  Bkillnest 09.03.2016 в 09:29
2

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

В принципе, вы разбираете файл .m3u8 (это довольно простой стандарт, но может быть сложным с альтернативными потоками и возможностью того, что поток просто выпадет и потребуется новый плейлист для продолжения), а затем загрузите куски. ts в локальное хранилище, скажем папку Documents или Caches и т. д.

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

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

Удачи!

    
ответ дан Simon Tillson 07.04.2013 в 14:07
1

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

    
ответ дан CiNN 29.08.2009 в 16:20