2009-05-25 11 views
17

Piszę aplikację, której część pozwala użytkownikowi na przesyłanie/odtwarzanie filmów. Chcę ograniczyć funkcjonalność, aby mogły przesyłać strumieniowo filmy tylko wtedy, gdy mają połączenie Wi-Fi. Następnie zapiszę film, aby po połączeniu 3G (lub mniejszym) nie mógł przesyłać strumieniowo filmów i odtwarzać tylko filmy zapisane w telefonie.Jednoczesne przesyłanie strumieniowe i zapisywanie wideo?

Idealnie, chciałbym, aby MPMoviePlayerController przesyłać strumieniowo/odtwarzać film, a następnie uzyskać dostęp do danych filmu i zapisać go. Jednak api MPMoviePlayerController wydaje się nie obsługiwać dostępu do danych filmowych.

Chciałbym uniknąć i pobrać scenariusz. Jakieś pomysły?

+0

Witam, czy odniosłeś z tym sukces? – Bkillnest

Odpowiedz

11

Dwa rozwiązania przychodzą na myśl. Oba te rozwiązania wymagają, aby plik był w formacie, który może być odtwarzany progresywnie, np. że nie potrzebujesz całego pliku, aby móc go odtworzyć (ale i tak byłby to warunek wstępny).

  1. użyć wątku, aby pobrać dane i dołączyć je do pliku, i odtwarzać plik z innego wątku. Teraz wymaga to obsłużenia zdarzeń EOF w MPMoviePlayerController i wstrzymania odtwarzania, dopóki plik pamięci podręcznej nie zostanie dołączony, a następnie wznowiony dla tego samego punktu.

Do tej pory nie widziałem ludzi robiących to, to nie działa, ponieważ MPMoviePlayerController nie może obsłużyć zdarzenia EOF. (jeszcze tego nie przetestowałem) [Caching videos to disk after successful preload by MPMoviePlayerController

  1. Pomiń odtwarzanie z pliku i skonfiguruj lokalny serwer HTTP i strumień z niego (na localhost). To też nie jest testowane. Chodzi o to, że MPMoviePlayerController lepiej radzi sobie z przypadkiem brakujących danych ze strumienia HTTP, a następnie bezpośrednio z pliku. Wadą może być to, że jest mniej wydajne, ale myślę, że jest to niewielki wzrost CPU. Nie wiem, czy interfejs sieci sobie z tym poradzi, ale zakładam, że to nie problem.

Pozostawię tę odpowiedź jako wiki, ponieważ nie mam działającego rozwiązania, ale ja też tego chcę.

+2

ma ktoś próbował już to? czy osiągnąłeś sukces? – calimarkus

+0

Próbuję teraz tego podejścia. Wygląda na to, że może działać, ale bez powodzenia. Używam widelca CocoaHTTPServer z 'HTTPAsyncDataResponse' z tego projektu: https://github.com/nickhart/CocoaHTTPServer – vaughan

+0

czy to działa? Pobrałem to źródło, ale nie mogłem – Bkillnest

1

iPhone używa progresywnego pobierania, więc nie zostanie zapisany na urządzeniu. W tym celu należy go jawnie pobrać, a następnie odtworzyć wideo z lokalnego folderu.

2

Istnieje sposób, aby to zadziałało, ale musisz napisać własny program do pobierania HTTP Live Streaming.

Zasadniczo analizuje się plik .m3u8 (jest to całkiem prosty standard, ale może być kłopotliwy w przypadku alternatywnych strumieni i możliwość, że strumień po prostu zniknie i potrzeba nowej listy odtwarzania do kontynuowania), a następnie pobrać porcje w .ts formatuj do lokalnego magazynu, powiedz folder Documents lub Caches itp.

Następnie musisz skonfigurować lokalny serwer HTTP, aby umożliwić MPMoviePlayerController lub AVPlayer dostęp do plików przez HTTP (ponieważ nie będą dotknij ścieżki pliku lokalnego), w tym ponownie zakodowany plik listy odtwarzania wskazujący na pliki lokalne, które musisz utworzyć samodzielnie z oryginalnej listy odtwarzania. CocoaHTTPServer działa doskonale do tego.

Kiedy już to wszystko zrobisz, działa świetnie. Nie można uniknąć opóźnień podczas pobierania pierwszej części lub dwóch przed zaprezentowaniem lokalnego adresu URL HTTP odtwarzacza filmowego, ale po tym można uzyskać płynne pobieranie, nagrywanie i odtwarzanie podglądu.

Powodzenia!