2014-10-02 6 views
15

Jestem w stanie z powodzeniem utworzyć odtwarzacz, ale zostałem zirytowany początkowym czarnym ekranem. Zdecydowałem się na nałożenie UIImageView i schowanie go po uruchomieniu odtwarzacza. To działało, ale nie chciałem kłopotów z tworzeniem i utrzymywaniem obrazów dla wszystkich moich filmów.Jak wyświetlić wstrzymane wideo zamiast czarnego ekranu po uruchomieniu odtwarzacza AVPlayer

Udało mi się osiągnąć dokładnie takie wyniki, jakich chciałem, grając i natychmiast wstrzymując odtwarzacz po jego utworzeniu. Jedynym problemem było to, że czasami stan odtwarzacza był nagrywany niepoprawnie, więc kiedy poszedłem do ponownego uruchomienia odtwarzacza, status został wymieniony jako "grający", mimo że odtwarzacz został zatrzymany.

Zaczynam szukanie w użyciu AVPlayerItem seekToTime, ale nie znalazłem żadnych wykonalnych rozwiązań. Czy istnieje "nie-hacky" sposób na osiągnięcie tego?

+1

@Cris: http://stackoverflow.com/questions/15360721/create-a-thumbnail-or-image-of-an-avplayer-at-current-time? – Larme

+1

Myślę, że link, o którym wspomniał Larme, dałby ci właściwy kierunek. Stwórz miniaturę na żądanie i nakładkę na odtwarzaczu (być może również przycisk Odtwórz), dzięki czemu nie musisz już grać ani odkładać od razu. – Stephenye

+1

W projekcie, który muszę zbudować, potrzebuję nowego wideo odtwarzane po drugim bez czarnego ekranu i miniatur. Klient poprosił mnie, bym przekazał od pierwszego filmu do drugiego, tak jakby druga była następną klatką, bez przerw – Cris

Odpowiedz

8

Jeśli używasz AVPlayerViewController, jest to idealne wykorzystanie właściwości kontrolera odtwarzacza contentOverlayView. Jest to UIView pomiędzy warstwą gracz i kontroli wystawionych dokładnie do tego celu:

Najpierw utwórz zrzut ekranu:

let asset = AVAsset(URL: URL(string: "")!) // link to some video 
let imageGenerator = AVAssetImageGenerator(asset: asset) 
let screenshotTime = CMTime(seconds: 1, preferredTimescale: 1) 
if let imageRef = try? imageGenerator.copyCGImageAtTime(screenshotTime, actualTime: nil) { 

    let image = UIImage(CGImage: imageRef) 

    // see part 2 below 
} 

Teraz dodaj zdjęcie jako podrzędny o contentOverlayView w kontrolerze gracza:

// in the same try block 

let imageView = UIImageView(image: image) 
let playerVC = AVPlayerViewController() 
let playerItem = AVPlayerItem(asset: asset) 
playerVC.player = AVPlayer(playerItem: playerItem) 

self.presentViewController(playerVC, animated: true) { 
    playerVC.contentOverlayView?.addSubview(imageView) 
    // adjust the frame of your imageView to fit on the player controller's contentOverlayView 
} 

Następnie wyjąć imageView podrzędny, gdy gracz zaczyna grać składnika aktywów, albo gdy buforowanie ukończone,.

1

Aplikacja AVPlayerLayer powiązana z odtwarzaczem ma właściwość readyForDisplay.

Możesz spróbować ustawić widok hosta jako obserwatora dla tej wartości i zrobić odświeżenie zaraz po ustawieniu wartości true.

Ustawiono wartość true, gdy pierwsza ramka jest gotowa do renderowania, więc zanim gracz będzie miał wystarczającą ilość danych do odtworzenia i ustawi status na ReadyToPlay.

Powiązane problemy