2010-05-28 8 views
14

Ho visto un bel paio di messaggi che chiedono questa domanda così, ma ci non sembra essere una risposta definitiva (o almeno una risposta che mi piace!)Come per lo streaming di contenuti autenticato con MediaPlayer su Android

Ho protetto i contenuti dietro l'autenticazione di base (nome utente/password) - Posso scaricarlo bene usando le varie versioni di download HTTP ma per la vita di me non riesco a capire come dire al lettore multimediale di trasmetterlo in streaming (e fornire l'autenticazione). Ho visto un post che suggeriva che non era possibile dal momento che MediaPlayer è tutto il codice nativo e non cose come Authenticator.

Ci sono molti esempi di come scaricare prima una copia memorizzata nella cache e poi riprodurla ma .... Questo tipo di risucchio (e forse i file di 100 di MB). Ho visto almeno una proposta per scaricarlo in blocchi di piccole dimensioni e quindi avviare & interrompere la riproduzione (reindirizzamento al nuovo file) ma quel tipo di risucchia anche perché ci sarebbe (presumo) essere una balbuzie (non ho provato però

L'idea migliore che ho a questo punto è avviare il download in un file di cache e poi quando è "abbastanza pieno" avviare la riproduzione mentre continuo a riempire il file .... I speranza che questo funziona (ma ancora, non l'ho provato).

Mi manca qualcosa di ovvio? È così doloroso avere tutti i vari pezzi quasi funzionanti e mi sono convinto che ci sia un modo per riprodurre in modo nativo il contenuto protetto (o prendere un InputStream qualificato & abilitato) ma non sembra una gioia.

BTW Sono un ragazzo Mac/iPhone e un newb su Android quindi sto ancora combattendo un po 'di apprendimento Java .... Scusami se mi manca qualcosa di ovvio.

+0

Da http://developer.android.com/guide/topics/media/index.html, "Nota: se sei passando un URL a un file multimediale online, il file deve essere in grado di scaricare progressivamente. " In caso contrario, pubblica un codice. –

+2

hey @loghound hai trovato una soluzione? Oltre alle tue considerazioni, sto pensando di usare qualcosa come un cookie per memorizzare le credenziali, e forse la funzione di streaming di Android lo prenderà. – sosergio

+1

Ho anche scoperto che non è possibile eseguire lo streaming di HTTPS. Come soluzione, abbiamo implementato la riproduzione progressiva e funziona, ma è un sacco di codice. –

risposta

2

Se si controlla il server, un'opzione potrebbe essere quella di modificarlo in modo che sia disponibile un'opzione per generare un URL casuale temporaneo per il contenuto al momento dell'autenticazione, quindi eseguire il flusso. Le funzioni di streaming accettano un URL che include parametri di script?

Per fare le cose interamente sul telefono, un'altra opzione sarebbe quella di scrivere un proxy http banale come un server in codice java o nativo ed eseguirlo in un thread in background. Invece di puntare il lettore multimediale sul server, devi puntarlo sul tuo proxy sul dispositivo. Il proxy passerebbe le richieste al server remoto, mentre gestisce l'autenticazione.

1

Un approccio è scaricare i dati da soli, decodificarli (da ??? a PCM) e utilizzare AudioTrack per riprodurre il PCM. Il trucco sta nella decodifica. In che formato è codificato lo stream?

I decodificatori non elaborati per i protocolli comuni sono disponibili su Android, ma nelle librerie C. Quindi potresti dover aggiungere un layer JNI per eseguire la decodifica, ancora, a seconda della codifica del tuo stream.

0

Ho avuto lo stesso problema e l'ho risolto inserendo le credenziali nell'URL. Non è ufficialmente supportato per HTTP, ma la maggior parte dei client web lo supporta.

Il seguente codice si basa su questo tutorial: http://www.coderzheaven.com/2012/08/14/stream-audio-android/

try { 
     // You can use HTTPS or HTTP as protocol. 
     String myURL = "https://example.com/song.mp3"; 

     mp.reset(); 
     mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     mp.setOnPreparedListener(this); 
     mp.setOnErrorListener(this); 

     // These are the two lines, doing the magic ;) It transforms it to a url like this: https://user:[email protected]/song.mp3 
     UsernamePasswordCredentials credentials = connHelper.getCredetials(); 
     myURL = myURL.replace("://", "://" + URLEncoder.encode(credentials.getUserName(), "UTF-8") + ":" + URLEncoder.encode(credentials.getPassword(), "UTF-8") + "@"); 

     mp.setDataSource(myURL); 
     mp.prepareAsync(); 
     mp.setOnCompletionListener(this); 
    } catch (Exception e) { 
     Log.e("StreamAudioDemo", e.getMessage()); 
    } 

NOTA: Usando l'URLEncoder qui, vogliamo problemi Ungo come: Se il nome utente o la password contiene un colon o un @.

NOTA2: Potrebbe, o potrebbe non funzionare, a seconda del server. Se incontri questo problema, ti suggerisco di dare un'occhiata a quello: Why do browsers not send the Authentication header when the credentials are provided in the URL?

Problemi correlati