2017-08-17 2 views
-1

J'essaie de créer une application Android sur le studio android qui se transforme en serveur distant et exécute une commande. Il doit également transférer le port 8080 à partir du serveur distant qui configure un flux HTTP sur vlc. Cela doit ensuite être utilisé dans un widget videoview qui affiche la vidéo dans l'application. Cette application s'exécute sans erreurs dans le logcat et exécute la commande ssh avec succès, mais la vue vidéo montre juste une boîte noire - je soupçonne qu'il y a quelque chose qui ne va pas avec mon code. Toute aide serait grandiose!Diffuser une vidéo http sur une application android

public class MainActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final VideoView videoView = (VideoView) findViewById(R.id.videoView); 
    new AsyncTask<Integer, Void, Void>() { 
     @Override 
     protected Void doInBackground(Integer... params) { 
      try { 
       executeRemoteCommand0("xxx", "xxx", "xxx", 22, videoView); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 
    }.execute(1); 

    try { 
     sleep(5); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 


videoView.setVideoPath(String.format("http://localhost:%d/video.mp4", 5000)); 

    videoView.start(); 

} 


public String executeRemoteCommand0(String username, String password, String hostname, int port, VideoView videoView) throws Exception { 

    JSch jsch = new JSch(); 
    Session session = jsch.getSession(username, hostname, port); 
    session.setPassword(password); 

    // Avoid asking for key confirmation 
    Properties prop = new Properties(); 
    prop.put("StrictHostKeyChecking", "no"); 
    session.setConfig(prop); 

    int camport = session.setPortForwardingL(5000, hostname,8080); 
    session.connect(); 


    // SSH Channel 
    ChannelExec channelssh = (ChannelExec) session.openChannel("exec"); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    channelssh.setOutputStream(baos); 

    // Execute command 

    channelssh.setCommand("command"); 
    channelssh.setPty(true); 
    channelssh.connect(); 

    return baos.toString(); 
} 
} 

Répondre

0

Je pense que votre problème réside dans cette ligne: videoView.setVideoPath(String.format("http://localhost:%d/video.mp4", 5000));

Vous essayez de référence localhost du dispositif mobile lui-même. Vous devez le remplacer par l'adresse IP réelle ou le nom de domaine du serveur que vous utilisez pour diffuser la vidéo.

En outre, c'est une mauvaise pratique de dormir votre fil principal sur Android. Essayez d'éviter cela.

+0

Je pensais après avoir retransmis le port 8080 du serveur distant à 5000 du serveur local, vous pouvez y accéder localement? En outre, j'ai essayé de mettre la vue vidéo dans la tâche asynchrone mais cela jette un 'besoin de déclarer looper.prepare() et quand je fais toutes les variables ne sont plus résolues dans la fonction des bibliothèques externes. Je connais sa super maladresse:/ – Liz

+0

Faire référence à 'localhost' signifie que vous avez une instance du serveur déployée sur le périphérique mobile (ce qui n'est évidemment pas le cas). Vous devez définir le chemin du lecteur vidéo sur le thread principal. Vous pouvez implémenter la méthode 'onPostExecute()' de votre 'AsyncTask'. Il sera appelé sur le thread principal après que l'arrière-plan soit terminé. –

+0

Est-il nécessaire de transférer le port à l'origine alors? Ou fonctionne-t-elle comme une URL? Merci pour l'astuce sur le onPostExecute() :) – Liz