2009-05-25 3 views
17

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

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

Хотелось бы избежать и загрузить сценарий после игры. Есть идеи?

+0

Привет, у вас есть успех? – Bkillnest

ответ

11

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

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

До сих пор, что я видел, люди, делающие это, не работают, потому что MPMoviePlayerController не может обрабатывать событие EOF. (еще не проверял его сам еще) [Caching videos to disk after successful preload by MPMoviePlayerController

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

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

+2

Кто-нибудь пробовал это еще? у вас был успех? – calimarkus

+0

Я сейчас пытаюсь использовать этот подход. Похоже, что он может работать, но пока не везет. Я использую вилку CocoaHTTPServer с «HTTPAsyncDataResponse» из этого проекта: https://github.com/nickhart/CocoaHTTPServer – vaughan

+0

это работает? Я загрузил этот источник, но не смог – Bkillnest

1

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

2

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

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

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

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

Удачи вам!