Question

J'essaie de diffuser de la vidéo sur un serveur depuis une autre machine en streaming via Java. Pour commencer, j'essaie simplement de transférer un fichier à l'aide d'une connexion socket brut et d'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 sera de 5 Mo sur le serveur. J'essaie ceci avec un fichier vidéo et le fichier résultant "joue" " quand je le télécharge et que c'est la bonne longueur mais qu'il n'y a pas d'image. Le code est ci-dessous:

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();
    }
}

Serveur (destinataire):

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();
        }


    }



}

Des pensées? Merci d'avance!

Chris

Était-ce utile?

La solution

J'ai donc compris le problème.

J'ai modifié le serveur pour n'écrire que "compte". octets

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

Et maintenant cela fonctionne:)

Merci!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top