Aşağıdaki soru için not edin: Cihazdaki tüm varlıklar yereldir - ağ akışı gerçekleşmez. Videolar ses parçaları içeriyor.
Söz konusu video klibi başlatmak için video dosyalarını minimum gecikmeyle oynatmayı gerektiren bir iOS uygulaması üzerinde çalışıyorum. Maalesef, gerçekten başlatmamız gerekene kadar bir sonraki video klibin ne olduğunu bilmiyoruz. Spesifik olarak: Bir video klip oynatılırken, bir sonraki (kabaca) 10 video klip setinin ne olduğunu bileceğiz, ancak bir sonraki klibi 'hemen' oynatma zamanı gelene kadar tam olarak hangisinin olduğunu bilmiyoruz.
Gerçek başlatma gecikmelerine bakmak için yaptığım şey addBoundaryTimeObserverForTimes
, videonun gerçekte ne zaman oynatılmaya başladığını görmek için bir milisaniyelik bir süre ile video oynatıcıyı aramak ve ilk sırada bu zaman damgasının farkını alıyorum hangi varlığın oynatılmaya başlanacağını gösteren kod.
Şimdiye kadar gördüğüm kadarıyla, AVAsset
yükleme kombinasyonunu kullanmanın ve AVPlayerItem
hazır olduğunda ondan bir tane oluşturmanın ve ardından AVPlayerStatusReadyToPlay
oynamayı çağırmadan önce beklemenin , başlatmanın 1 ile 3 saniye arasında sürdüğünü buldum. klips.
O zamandan beri kabaca eşdeğer olduğunu düşündüğüm şeye geçtim: aramak [AVPlayerItem playerItemWithURL:]
ve AVPlayerItemStatusReadyToPlay
oynamak için beklemek . Kabaca aynı performans.
Gözlemlediğim bir şey, ilk AVPlayer öğe yüklemesinin diğerlerinden daha yavaş olmasıdır. İlk videoyu oynatmaya çalışmadan önce AVPlayer'ı kısa / boş bir varlık ile önceden uçurmak iyi bir genel uygulama olabilir gibi görünüyor. [ AVAudioPlayer için ilk ses çalındığında yavaş başlatma
Videonun başlama zamanlarını olabildiğince kısaltmayı ve denemek için bazı fikirlere sahip olmayı çok isterim, ancak yardımcı olabilecek herkesten biraz rehberlik almak isterim.
Güncelleme: aşağıdaki fikir 7, uygulandığı gibi yaklaşık 500 ms anahtarlama süreleri sağlar. Bu bir gelişme, ama bunu daha hızlı yapmak güzel olurdu.
Fikir 1: N AVPlayer kullanın (işe yaramaz)
~ 10 AVPPlayer
nesne kullanarak ve ~ 10 klibin tümünü başlatıp duraklatın ve hangisine gerçekten ihtiyacımız olduğunu öğrendikten sonra, doğru olana geçiş yapın, duraklatmayı kaldırın AVPlayer
ve bir sonraki döngü için baştan başlayın.
Bunun işe yaradığını düşünmüyorum, çünkü AVPlayer's
iOS'ta kabaca 4 aktif sınırı olduğunu okudum . Burada StackOverflow'da bunu soran biri vardı ve 4 AVPlayer sınırını öğrendi: videolar arasında hızlı geçiş avfoundation kullanarak
Fikir 2: AVQueuePlayer'ı kullanın (çalışmaz)
Benim 10 shoving inanmıyorum AVPlayerItems
bir içine AVQueuePlayer
sorunsuz başlaması için hepsini önceden yükleyerek olacaktır. AVQueuePlayer
bir kuyruk ve bence bu gerçekten yalnızca sıradaki bir sonraki videoyu anında oynatmaya hazır hale getiriyor. Başlama zamanı gelene kadar ~ 10 videodan hangisini oynatmak istediğimizi bilmiyorum. ios-avplayer-video-ön yükleme
Fikir 3: AVPlayerItems
Arka planda yükleyin, oynatın ve saklayın (henüz% 100 emin değil - ama iyi görünmüyor)
Arka planda her video klibin ilk saniyesini yüklemek ve oynatmak (video ve ses çıkışını bastırmak) ve her birine bir referans tutmak AVPlayerItem
ve hangi öğenin oynatılması gerektiğini bildiğimizde herhangi bir fayda olup olmadığına bakıyorum. gerçek, onu içinde değiştirin ve arka plan AVPlayer'ı aktif olanla değiştirin. Durulayın ve Tekrarlayın.
Teori, yakın zamanda oynatılanların AVPlayer/AVPlayerItem
, daha sonra oynatmayı daha hızlı hale getirecek bazı hazırlanmış kaynakları hala tutabileceğidir. Şimdiye kadar, bundan fayda görmedim, ancak AVPlayerLayer
arka plan için doğru kurulum yapmamış olabilirim . Bunun gerçekten gördüklerimi iyileştireceğinden şüpheliyim.
Fikir 4: Farklı bir dosya biçimi kullanın - belki daha hızlı yüklenen bir biçim?
Şu anda .m4v'nin (video-MPEG4) H.264 biçimini kullanıyorum. H.264'ün birçok farklı codec seçeneği vardır, bu nedenle bazı seçeneklerin diğerlerinden daha hızlı aranması mümkündür. Dosya boyutunu küçülten daha gelişmiş ayarlar kullanmanın arama süresini artırdığını buldum, ancak tersine giden herhangi bir seçenek bulamadım.
Fikir 5: Kayıpsız video formatı + AVQueuePlayer kombinasyonu
Yüklemesi hızlı, ancak dosya boyutunun çılgın olduğu bir video formatı varsa, bir fikir, her video klibin ilk 10 saniyesini şişirilmiş ancak yüklenmesi daha hızlı, ancak daha hızlı bir sürümle önceden hazırlamak olabilir. H.264'te kodlanmış bir varlık ile bu kadar. Bir AVQueuePlayer kullanın ve sıkıştırılmamış dosya biçiminde ilk 10 saniyeyi ekleyin ve bunu 10 saniyeye kadar hazırlık / önyükleme süresi sağlayan H.264'te olan bir saniye ile takip edin. Böylece her iki dünyanın da 'en iyisini' elde ederim: hızlı başlangıç zamanları, ancak daha kompakt bir formattan da yararlanır.
Fikir 6: Standart olmayan bir AVPlayer kullanın / kendiminkini yazın / başkasınınkini kullanın
İhtiyaçlarım göz önüne alındığında, belki AVPlayer'ı kullanamıyorum, ancak AVAssetReader'a başvurmam ve ilk birkaç saniyenin kodunu çözmem gerekiyor (muhtemelen ham dosyayı diske yazıyorum) ve oynatma söz konusu olduğunda, oynatmak için ham formattan yararlanın hızlı geri dön. Bana çok büyük bir proje gibi görünüyor ve bunu saf bir şekilde yaparsam, belirsiz / daha iyi çalışması bile olası değil. Her kodu çözülmüş ve sıkıştırılmamış video çerçevesi 2,25 MB'dir. Naif bir şekilde konuşursak - video için ~ 30 fps ile gidersek, ~ 60 MB / s diskten okuma gereksinimi ile sonuçlanırdım, ki bu muhtemelen imkansız / zorlama. Açıkçası, bir miktar görüntü sıkıştırma (belki de PVRTC aracılığıyla yerel openGL / es sıkıştırma formatları) yapmamız gerekir ... ama bu biraz çılgınca. Belki orada kullanabileceğim bir kütüphane vardır?
Fikir 7: Her şeyi tek bir film varlığında birleştirin ve seekToTime
Yukarıdakilerin bazılarından daha kolay olabilecek bir fikir, her şeyi tek bir filmde birleştirmek ve seekToTime kullanmaktır. Mesele şu ki, her yerde zıplıyor olacağız. Esasen filme rastgele erişim. Bunun gerçekten işe yarayacağını düşünüyorum: avplayer-movie-playing-lag-in-ios5
Sizce en iyi yaklaşım hangisi? Şimdiye kadar gecikmeyi azaltma konusunda o kadar ilerleme kaydetmedim.