Подтвердить что ты не робот

Одновременно поток и сохранение видео?

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

Удачи!

Ответ 3

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