2012-07-03 7 views
15

Próbuję wyświetlać napisy podczas odtwarzania wideo przy użyciu AVFoundation na OS X.Pokaż napisy z przewozem AVFoundation AVPlayer na OS X

Przejrzałem dokumentacji i nie mogę znaleźć sposób, aby umożliwić ścieżka napisów. Interfejs API zawiera wiele odniesień do ścieżek napisów, co pozwala sądzić, że jest obsługiwany.

Na iOS metoda -[AVPlayerItem selectMediaOption:inMediaSelectionGroup:] służy do włączania ścieżek napisów. Ta metoda nie jest dostępna w pakiecie SDK 10.7. Czy jest inny sposób na wyświetlanie napisów?

EDIT: Quicktime Player X ma obsługę napisów, na przykład przy otwieraniu this movie pojawia się podmenu napisów z opcją wyboru języka i wyświetlą je po wybraniu języka angielskiego. To prowadzi mnie do przekonania, że ​​są one zawarte w API ...

+1

Czy wypróbowałeś 'closedCaptionDisplayEnabled = YES' – Dustin

+0

@DustinRowland Dzięki, przegapiłem to. Po prostu wypróbowałem to, nie zmieniłem niczego tak daleko, jak mogłem. – joerick

+0

Co sprawdziło się przy korzystaniu z AVAsset i AVPlayerItem, co dało mi lepszą kontrolę nad moimi obiektami. – Winston

Odpowiedz

5

Sam wpadłem na ten sam problem. Zauważyłem, że niestety jedynym sposobem, aby to zrobić, innym niż przejście na QTKit, jest stworzenie oddzielnej warstwy napisów (CATextLayer) i ustawienie jej odpowiednio jako podwarstwy do warstwy odtwarzacza. Pomysł polega na tym, że ustawiasz okresowego obserwatora, który uruchamia się co sekundę i aktualizuje napisy, a także (i jest to opcjonalne) jakiś element interfejsu użytkownika, który pokazuje, ile czasu upłynęło w filmie.

Utworzono podstawową klasę parsera plików SubRip (.srt); można go znaleźć tutaj: https://github.com/sstigler/SubRip-for-Mac. Koniecznie sprawdź wiki dla dokumentacji. Klasa jest dostępna na warunkach licencji BSD.

Kolejnym wyzwaniem, które możesz napotkać, jest dynamiczne dostosowywanie wysokości elementu CATextLayer w celu uwzględnienia różnej długości napisów i zmieniających się szerokości widoku zawierającego (jeśli chcesz zmienić jego rozmiar). Znalazłem świetną podklasę CALayoutManager, która to robi i wprowadziłem kilka poprawek, aby uruchomić to, co próbowałem zrobić: https://github.com/sstigler/height-for-width.

Mam nadzieję, że to pomoże.

+0

Wielkie dzięki. Pomocna odpowiedź, ale nie sądzę, że w moim przypadku to wystarczy. Otrzymujemy napisy jako część strumienia wideo lub pliku wideo, obecnie nie mamy dostępu do pliku SRT. Może się przydać, jeśli wymyślę sposób na wydobycie ?! – joerick

2

Sposób, aby dodać plik z napisami jest dodanie SCC napisów jako AVMediaTypeClosedCaption torze do AVPlayer użyciu AVMutableCompositionTrack a gracz będzie go kontrolować Próbowałem go i pracował lub dodając plik tekstowy z szybkiego tekstu czasu lub dowolnego tekstu jako AVMediaTypeText track, a odtwarzacz wyświetli podtytuł Nie wiem, dlaczego ten AVMediaTypeSubtitle śledził, który plik z napisami jest obsługiwany dla niego

+0

Bardzo pomocne byłoby udostępnienie przykładowego kodu. Dzięki. –

+1

Użyj sublerCLI, możesz konwertować napisy srt lub scc na ścieżkę napisów AVMediaTypeSubtitle i AVMediaTypeClosedCaption ścieżkę wewnątrz kontenera m4v ================> var sublerTask = NSTask() sublerTask.launchPath = sublerPath // SublerCLI Ścieżka sublerTask.arguments = ["-source", srtFilePath, "- dest", tempM4V, "- language", language, "- metadata", language] sublerTask.launch() sublerTask.waitUntilExit() –

+0

po tym można przeczytać m4v jako AVAsset i pobrać z niego ścieżkę napisów –