2009-05-25 11 views
17

Sto scrivendo un'app, una parte della quale consente all'utente di riprodurre in streaming/riprodurre video. Voglio limitare la funzionalità in modo che possano trasmettere video solo se dispongono di una connessione WiFi. Quindi salverò il video in modo tale che quando hanno una connessione 3G (o inferiore) non possono effettuare lo streaming di video e possono solo riprodurre i video che vengono salvati sul telefono.Invia e salva contemporaneamente un video?

Idealmente, mi piacerebbe ottenere MPMoviePlayerController per lo streaming/riprodurre il film e quindi accedere ai dati del film e salvarlo. Tuttavia, l'API MPMoviePlayerController non sembra supportare l'accesso ai dati del film.

Mi piacerebbe evitare e lo scenario download-then-play. Qualche idea?

+0

Ciao, hai successo con esso? – Bkillnest

risposta

11

Due soluzioni mi vengono in mente. Entrambe queste soluzioni richiedono che il file sia in un formato che può essere riprodotto progressivamente, ad es. che non è necessario che l'intero file sia in grado di riprodurlo (ma sarebbe comunque un prerequisito).

  1. utilizzare un thread per scaricare i dati e aggiungerli a un file e riprodurre il file da un altro thread. Ora, ciò richiede che tu possa gestire gli eventi EOF nel MPMoviePlayerController e mettere in pausa la riproduzione fino a quando il file della cache viene aggiunto e quindi riprendere per lo stesso punto.

Finora quello che ho visto gente che fa questo non funziona perché MPMoviePlayerController non può gestire l'evento EOF. (Non ancora testato la mia auto) [Caching videos to disk after successful preload by MPMoviePlayerController

  1. Salta la riproduzione da un file e la configurazione di un server locale HTTP e flusso da quella (su localhost). Anche questo non è testato. L'idea è che MPMoviePlayerController possa gestire l'evento di dati mancanti meglio da un flusso HTTP e quindi dalla lettura diretta del file. Il lato negativo potrebbe essere che è meno efficiente, ma penso che sia un aumento minore della CPU. Non so se l'interfaccia di rete possa gestirlo, ma presumo che non sia un problema.

Lascio questa risposta come wiki, perché non ho una soluzione funzionante, ma anch'io ne voglio una.

+2

qualcuno ha ancora provato questo? hai avuto successo? – calimarkus

+0

Sto provando questo approccio ora. Sembra che possa funzionare ma senza fortuna ancora. Sto usando un fork di CocoaHTTPServer con un 'HTTPAsyncDataResponse' da questo progetto: https://github.com/nickhart/CocoaHTTPServer – vaughan

+0

funziona? Ho scaricato questa fonte ma non ho potuto – Bkillnest

1

l'iPhone utilizza il download progressivo per non salvare sul dispositivo. Per questo è necessario scaricarlo esplicitamente e quindi riprodurre il video dalla cartella locale.

2

C'è un modo per farlo funzionare, ma è necessario scrivere il proprio downloader HTTP Live Streaming.

In pratica, si analizza il file .m3u8 (è uno standard piuttosto semplice, ma può essere complicato con flussi alternativi e la possibilità che lo stream si interrompa e necessiti di una nuova playlist per continuare) e quindi scaricare i blocchi in Formato .ts nella tua memoria locale, ad esempio la cartella Documenti o Cache ecc.

Quindi dovrai configurare un server HTTP locale per consentire a MPMoviePlayerController o AVPlayer di accedere ai file tramite HTTP (poiché non lo faranno tocca un percorso di file locale), incluso un file di playlist ricodificato che punta ai file locali, che dovrai creare tu stesso dalle playlist originali. CocoaHTTPServer funziona alla grande per questo.

Una volta che hai fatto tutto questo, funziona benissimo. È inevitabile che si verifichi un leggero ritardo durante il download del primo blocco o due prima di presentare l'URL HTTP locale al riproduttore di filmati, ma successivamente si ottengono download, registrazione e riproduzione dell'anteprima senza interruzioni.

Buona fortuna!

Problemi correlati