2011-11-29 3 views
6

J'ai un projet Android où j'ai besoin de créer une application cliente pour recevoir des flux vidéo UDP ou RTP unicast et les lire. Malheureusement, je n'arrive pas à le faire fonctionner et j'ai cherché intensivement une solution! Je suis en train de tester sur un Xoom (Android 3.2) et un Nexus S (Android 2.3.6) et je sais qu'ils peuvent lire le contenu en utilisant MX Player (une application de lecteur multimédia tiers) en tant que client, mais je Impossible d'obtenir le lecteur multimédia natif pour lire le contenu. J'ai essayé d'utiliser à la fois un simple VideoView et un MediaPlayer mais les deux échouent avec le même code d'erreur et je ne peux pas vraiment trouver d'informations utiles sur.UDP Vidéo en streaming sur Android

La vidéo est codée en H.264 avec audio aac.

En outre, le serveur est une solution par un tiers auquel je n'ai pas accès (autre que spécifier udp ou rtp) mais comme je l'ai dit, en utilisant MX Player, les flux peuvent être lus.

Voici la partie de lecteur multimédia de mon code:

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'erreur que je reçois est:

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) 

J'ai mis les autorisations Internet aussi.

Quelqu'un a-t-il des suggestions s'il vous plaît? Je ne trouve aucune information utile nulle part.

Merci.

+0

Avez-vous essayé d'utiliser 'player.prepareAysnc()' au lieu de 'player.prepare()'? Vous devriez utiliser 'prepareAsync()' lors de la lecture de flux. – Squonk

Répondre

3

Je ne suis pas sûr Android supporte nativement UDP comme il est pas répertorié dans les protocoles réseau

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

De nombreux mediaplayers 3ème partie sont basés sur les bibliothèques FFMPEG. Vous pouvez utiliser FFMPEG dans votre projet, bien que ce soit une tâche à part entière.

+0

Oui, il semble que c'est le cas! J'avais vu cette page mais j'espérais que quelqu'un avait trouvé sa propre solution! – theChumpus

+0

@theChumpus, Alex, Avez-vous utilisé witch ffmpeg lib? Avez-vous utilisé une bibliothèque pré-compilée? Avez-vous essayé les vidéos stream h264? – Derzu

+0

@Derzu J'ai compilé ffmpeg sous Unix comme sur http://code.google.com/p/dolphin-player/. Il joue h264 oui. –

1

Vous pouvez également diffuser via udp: // en utilisant la bibliothèque Vitamio (elle utilise ffmpeg dans les coulisses). http://www.vitamio.org/en/

+0

J'ai supprimé mon post précédent, car j'ai testé vitamio sur ma tablette (nexus-7) et cela a bien fonctionné. – user1767754

+0

pourriez-vous vérifier https://stackoverflow.com/questions/45521175/vitamio-unable-to-play-udp-streaming-in-android? –

+0

Je vais devoir chercher mon code POC pour un projet particulier que j'ai fait il y a 4 ans; Je n'ai pas le travail réel qui a été fait pour cela bien sûr, puisque je ne le possède pas. Ne pas faire de promesses, mais je vais regarder. –