2013-02-12 16 views
11

Abbiamo un'app su cui stiamo lavorando che deve fornire la riproduzione di file video tramite AVPlayer. I file devono essere memorizzati sul dispositivo dell'utente, ma devono anche essere riprodotti durante il download.Download AVPlayer e video progressivi con AVURLAssets

Al momento abbiamo creato un modulo di download che utilizza la libreria ASIHTTPRequest per ottenere i file video tramite PHP (non vogliamo che il supporto sia collegabile tramite URL pubblici) e li scriva sul disco in modo asincrono.

Abbiamo quindi impostare un AVPlayer come da AV Foundation Programming Guide, ottenendo il file con AVURLAsset, facendo un AVPlayerItem con il bene, la costruzione del AVPlayer con l'oggetto, quindi impostando il lettore ad un AVPlayerLayer. Il lettore funziona perfettamente con un file video completamente scaricato ed eseguirà anche un file scaricato progressivamente perfettamente nel simulatore.

Sfortunatamente su un dispositivo reale, il comportamento del lettore cambia, dove invece carica il video una volta e non tenta di estrarre nuovi pacchetti dal disco. Il risultato è che il lettore riprodurrà video e audio fino al punto nel video che segna dove il download è stato nel momento in cui la risorsa è stata caricata (ad esempio, se vengono salvati 2 MB di dati, il giocatore viene creato, il giocatore riprodurrà solo fino a 2 MB di dati). Poiché ha l'intestazione del video, il lettore continuerà felicemente a pensare che stia riproducendo per tutta la durata del video, ma nessun altro video viene visualizzato sullo schermo.

L'ultima ruga è che se il video è inserito in una AVComposition e l'AVPlayer è stato creato con questo, il video progressivo funzionerà correttamente. Questa sarebbe una buona soluzione (ed è necessario per la nostra app in ogni caso), tranne per il fatto che il client per la nostra app richiede che il video sia riproducibile su una Apple TV via AirPlay, di cui AVCompositions è incapace.

Qualcuno sa se esiste un modo per riprodurre in modo progressivo il download di file video utilizzando un AVPlayer creato da AVURLAssets? C'è un modo per forzare il lettore/lettore a leggere dal disco con un set AVURLA come sembra fare con un AVComposition invece di mettere apparentemente in cache il video in memoria?

Grazie!

+0

Hai mai lavorato a questo problema? In quale versione di iOS eri attivo e questo comportamento è cambiato con le versioni più recenti? –

+0

No, non ho ancora una soluzione per questo oltre all'uso di AVComposition. Stavamo usando iOS 5.1 e 6.0 al momento e il comportamento continua ancora fino alla 6.1. –

+0

@RobertNall Sto cercando di fare la stessa cosa con AVComposition - puoi elaborare un po 'come hai inserito il video in AVComposition? Se il lettore raggiunge EOF, la riproduzione riprende dopo aver scaricato più dati? –

risposta

6

Non ho una soluzione per farlo funzionare con AVURLAssets ma utilizzo un approccio leggermente diverso. Raggruppiamo la nostra app con CocoaHTTPServer e riproduciamo file video che non sono completamente scaricati attraverso una richiesta HTTP contro il server locale.

Il server conosce la lunghezza totale del file e può quindi decidere guardando le intestazioni HTTP quale parte del file è richiesta e la carica dal disco o da una fonte remota.

Durante lo sviluppo ci sono sempre 3 richieste iniziali, una per i primi due byte del file, una parte più grande dall'inizio del file e un blocco direttamente alla fine del file. Ecco perché è sempre stato necessario caricare almeno l'ultima parte direttamente dal server remoto poiché il giocatore avrebbe avuto bisogno fin dall'inizio. Immagino che lo stesso accada per i file locali, quindi il giocatore carica gli ultimi byte dal file (che non sono gli ultimi byte giusti) e non giocherà su quella lunghezza.

È necessario creare sottoclassi HTTPConnection e creare la propria classe HTTPResponse controllando il "HTTPAsyncFileResponse" fornito.

Spero che questo ti dia un'idea di come raggiungere questo obiettivo con un approccio diverso.

+0

Quando ottieni la risposta che contiene il blocco finale del file, stai scrivendo byte vuoti tra l'inizio e la fine in modo che il giocatore abbia i byte finali nel posto giusto? –

+0

Scrivo sul disco solo ciò che si adatta alla dimensione effettiva del file, quindi i blocchi dall'inizio verranno scritti sul disco. Ma la richiesta fino alla fine non sarà restituita al giocatore. – Soph

+0

Ripensandoci, potresti anche provare qualcosa di simile a questo: http://aptogo.co.uk/2010/07/protecting-resources/ ma invece la roba di crittografia potresti implementare la lettura/scrittura da remoto/locale. – Soph