2009-09-10 3 views
2

J'essaie de diffuser de la vidéo sur un serveur à partir d'une autre machine utilisant Java et pour commencer, j'essaie simplement de transférer un fichier en utilisant une connexion raw socket et un flux d'octets. Cependant, les choses ne se présentent pas de la même manière. Si je transfère un fichier de cette façon, un fichier de 3 Mo sur ma machine finit par être 5 Mo sur le serveur. J'essaie cela avec un fichier vidéo et le fichier résultant "joue" quand je le télécharge et est la bonne longueur mais il n'y a pas d'image. Le code est ci-dessous:Diffuser de la vidéo sur un serveur

client (streamer):

public static void main(String[] args){ 
    Socket sock = null; 

    try{ 
     System.out.println("Connecting..."); 
     sock = new Socket("server.com", 8080); 
     InputStream is = new FileInputStream(new File("Bear.wmv")); 
     byte[] bytes = new byte[1024]; 

     OutputStream stream = sock.getOutputStream(); 

     int count = is.read(bytes, 0, 1024); 
     while (count != -1){ 
      stream.write(bytes, 0, 1024); 
      count = is.read(bytes, 0, 1024); 
     } 

     is.close(); 
     stream.close(); 
     sock.close(); 

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

Server (récepteur):

public static void main(String[] args){ 
    ServerSocket sock = null; 
    try { 
     sock = new ServerSocket(8080); 
    } catch (IOException e) { 
     System.out.println("Could not instantiate socket:"); 
     e.printStackTrace(); 
     return; 
    } 

    Socket clientSock = null; 
    while(true){ 

     try{ 

      System.out.println("Waiting for connection..."); 
      clientSock = sock.accept(); 
      final Socket fin = clientSock; 
      System.out.println("Connection accepted"); 
      System.out.println("Spawning thread..."); 
      Thread trd = new Thread(new Runnable(){ 
       public void run(){ 
        try { 
         try { 
          Thread.sleep(5000); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 

         System.out.println("Receiving video..."); 
         File video = new File("test.wmv"); 
         FileOutputStream fos = new FileOutputStream(video); 
         byte[] data = new byte[1024]; 
         int count = fin.getInputStream().read(data, 0, 1024); 
         while (count != -1){ 
          fos.write(data, 0, 1024); 
          count = fin.getInputStream().read(data, 0, 1024); 
         } 
         fos.close(); 
         fin.close(); 
         System.out.println("Done receiving"); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        }} 
      }); 
      trd.start(); 

     }catch(IOException e){ 
      System.out.println("Could not accept"); 
      e.printStackTrace(); 
     } 


    } 



} 

Toute pensée? Merci d'avance!

Chris

+0

Merci, ce fut une aide précieuse pour commencer. Maintenant, essayons juste de travailler pour diffuser, par exemple. envoyer des données puis jouer en même temps – LmC

Répondre

4

Alors je me suis le problème.

J'ai changé le serveur pour écrire uniquement "nombre" octets

while (count != -1){ 
     fos.write(data, 0, count); 
     count = fin.getInputStream().read(data, 0, 1024); 
} 

Et maintenant, il fonctionne :)

Merci!

Questions connexes