2011-11-29 32 views
6

Ho un progetto Android in cui ho bisogno di costruire un'app client per ricevere flussi video unicast UDP o RTP e riprodurli. Sfortunatamente, non riesco a farlo funzionare e ho cercato a lungo una soluzione!Streaming video UDP su Android

Ho eseguito il test su un Xoom (Android 3.2) e un Nexus S (Android 2.3.6) e so che possono riprodurre il contenuto quando si utilizza MX Player (un'app di un lettore multimediale di terze parti) come client ma io impossibile ottenere il lettore multimediale nativo per riprodurre il contenuto. Ho provato a utilizzare sia una semplice VideoView che un MediaPlayer ma entrambi non riescono con lo stesso codice di errore e non riesco davvero a trovare alcuna informazione utile su.

Il video è codificato H.264 con audio aac.

Inoltre, il server è una soluzione da una terza parte che non ho accesso a (diverso per specificare UDP o RTP), ma, come ho detto, quando si utilizza MX Player, i flussi possono essere riprodotti.

Ecco la parte media player del mio codice:

public class Main extends Activity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    try { 
     MediaPlayer player = new MediaPlayer(); 
     SurfaceView surface = (SurfaceView) findViewById(R.id.video); 

     player.setDisplay(surface.getHolder()); 

     player.setDataSource(this, Uri.parse("udp://192.168.0.78:1234")); 

     player.prepare(); 

     player.setOnPreparedListener(new OnPreparedListener() { 

      @Override 
      public void onPrepared(MediaPlayer mp) { 
       Log.d("SimpleVideoPlayer", "Starting player"); 
       mp.start(); 
      } 
     }); 

     player.setOnErrorListener(new OnErrorListener() { 

      @Override 
      public boolean onError(MediaPlayer mp, int what, int extra) { 
       Log.d("SimpleVideoPlayer", "error with code: " + what); 
       return false; 
      } 
     }); 

    }catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

L'errore che sto ricevendo è:

11-29 15:44:14.660: D/MediaPlayer(15451): Couldn't open file on client side, trying server side 
11-29 15:44:14.670: E/MediaPlayer(15451): error (1, -2147483648) 
11-29 15:44:14.670: W/System.err(15451): java.io.IOException: Prepare failed.: status=0x1 
11-29 15:44:14.670: W/System.err(15451): at android.media.MediaPlayer.prepare(Native Method) 
11-29 15:44:14.670: W/System.err(15451): at com.android.vidplayer.Main.onCreate(Main.java:26) 
11-29 15:44:14.670: W/System.err(15451): at android.app.Activity.performCreate(Activity.java:4397) 
11-29 15:44:14.670: W/System.err(15451): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
11-29 15:44:14.670: W/System.err(15451): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1804) 
11-29 15:44:14.670: W/System.err(15451): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1856) 
11-29 15:44:14.670: W/System.err(15451): at android.app.ActivityThread.access$500(ActivityThread.java:125) 
11-29 15:44:14.670: W/System.err(15451): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1049) 
11-29 15:44:14.670: W/System.err(15451): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-29 15:44:14.670: W/System.err(15451): at android.os.Looper.loop(Looper.java:132) 
11-29 15:44:14.670: W/System.err(15451): at android.app.ActivityThread.main(ActivityThread.java:4157) 
11-29 15:44:14.670: W/System.err(15451): at java.lang.reflect.Method.invokeNative(Native Method) 
11-29 15:44:14.670: W/System.err(15451): at java.lang.reflect.Method.invoke(Method.java:491) 
11-29 15:44:14.670: W/System.err(15451): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
11-29 15:44:14.670: W/System.err(15451): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
11-29 15:44:14.670: W/System.err(15451): at dalvik.system.NativeStart.main(Native Method) 

Ho impostato anche i permessi di Internet.

Qualcuno ha qualche suggerimento per favore ?? Non riesco a trovare nessuna informazione utile da nessuna parte.

Grazie.

+0

Hai provato a utilizzare 'player.prepareAysnc()' invece di 'player.prepare()'? Dovresti usare 'prepareAsync()' durante la riproduzione di stream. – Squonk

risposta

3

non sono sicuro Android supporta nativamente UDP come non è elencato nei protocolli di rete

http://developer.android.com/guide/appendix/media-formats.html

Molti mediaplayers 3rd party si basano sulle librerie ffmpeg. Potresti voler usare FFMPEG nel tuo progetto, anche se questo è un compito a sé stante.

+0

Sì, sembra proprio questo il caso! Avevo visto quella pagina ma speravo che qualcuno avesse trovato la propria soluzione! – theChumpus

+0

@theChumpus, Alex, hai usato witch ffmpeg lib? Hai usato qualche lib pre-compilata? Hai provato i video di streaming h264? – Derzu

+0

@Derzu Ho compilato ffmpeg sotto Unix come fanno su http://code.google.com/p/dolphin-player/. Suona h264 sì. –

1

È inoltre possibile eseguire lo streaming tramite udp: // utilizzando la libreria Vitamio (utilizza ffmpeg dietro le quinte). http://www.vitamio.org/en/

+0

Ho cancellato il mio post precedente, come ho provato vitamio sul mio tablet (nexus-7) e ha funzionato bene. – user1767754

+0

potresti gentilmente controllare https://stackoverflow.com/questions/45521175/vitamio-unable-to-play-udp-streaming-in-android? –

+0

Dovrò cercare il mio codice POC per un particolare progetto che ho fatto 4 anni fa; Non ho il vero lavoro che è stato fatto per questo, poiché non lo posseggo. Non facendo promesse, ma guarderò. –