2012-03-21 18 views
11

Pracuję nad małą aplikacją na iPhone'a, która przesyła strumieniowo zawartość filmową przez połączenie sieciowe za pomocą zwykłych gniazd. Film jest w formacie H.264. Mam jednak trudności z odtwarzaniem/dekodowaniem danych. Rozważałem użycie FFMPEG, ale licencja czyni go nieodpowiednim dla projektu. Wcześniej analizowałem strukturę Apple AVFoundation (w szczególności AVPlayer), która wydaje się być w stanie obsłużyć zawartość h264, ale jestem w stanie znaleźć metody inicjowania filmu za pomocą adresu URL - nie przez udowodnienie bufora pamięci przesłanego z sieć.Odtwarzanie strumieniowego wideo w jakości H.264 na iOS przy użyciu AVFoundation

Robiłem kilka testów, aby to się zdarzyć i tak, przy użyciu następujących metod:

  1. Odtwórz film przy użyciu zwykłego AVPlayer. Za każdym razem, gdy dane są odbierane w sieci, jest on zapisywany do pliku za pomocą fopen z trybem append. Zasób AVPlayer jest następnie ponownie ładowany/odtwarzany ze zaktualizowanymi danymi. Wydaje się, że są dwa problemy z tym podejściem: po pierwsze, ekran staje się czarny przez krótką chwilę, podczas gdy pierwszy zasób jest rozładowywany, a nowy ładowany. Po drugie, nie wiem dokładnie, gdzie gra się zatrzymała, więc nie jestem pewien, jak znaleźć właściwe miejsce, by zacząć grać z nowym zasobem.
  2. Drugie podejście polega na zapisaniu danych do pliku, podobnie jak w pierwszym podejściu, ale z tą różnicą, że dane są ładowane do drugiego zasobu. A AVQueuedPlayer jest następnie używany, gdy drugi zasób jest wstawiany/umieszczany w kolejce w odtwarzaczu, a następnie wywoływany, gdy buforowanie zostało wykonane. Pierwszy zasób można następnie rozładować bez czarnego ekranu. Jednak przy użyciu tego podejścia jest jeszcze bardziej kłopotliwe (niż pierwsze podejście), aby dowiedzieć się, gdzie zacząć grać nowy zasób.

Czy ktoś zrobił coś takiego i sprawił, że zadziałało? Czy jest to właściwy sposób, używając AVFoundation?

+0

Znalazłeś odpowiedź na to pytanie? Ja również próbuję odtworzyć plik h264 (rozszerzenie .264) zawierający pojedynczą ramkę i próbując ją odkodować. AVAssetReader nie akceptuje tego formatu pliku i jedynym planem jaki mam jest stworzenie pliku mp4 na klatkę (to brzmi szalenie). – Cthutu

+0

Czy jest jakiś szczególny powód, dla którego źródło musi przesłać wideo, zamiast ściągać aplikację? HLS zwykle działa na odwrót. Jeśli na komputerze źródłowym można uruchomić system OSX, istnieją narzędzia Apple do segmentowania dla ciebie ze strumienia wejściowego UDP rtsp. Jeśli nie, możesz prawdopodobnie zepsuć AVPlayer'a, myśląc, że ma do czynienia z normalnym HLS, uruchamiając serwer proxy w telefonie - dziel plik w momencie jego pojawienia się, i napisz jakiś kod, aby wygenerować odpowiednią fałszywą playlistę .m3u8 do reprezentowania porcji. –

Odpowiedz

0

Oficjalną metodą wykonania tego jest format HTTP Live Streaming, który obsługuje wiele poziomów jakości (między innymi) i automatycznie przełącza się między nimi (np. Jeśli użytkownik przechodzi z WiFi do sieci komórkowej).

można znaleźć w dokumentacji tutaj: Apple Http Streaming Docs

Powiązane problemy