2

私はUDP接続を使用しています.Javaアプリケーションを実行するPCにビデオを送信するAndroidアプリケーションがあります。Java アプリケーションは ByteArrayInputStream(imageData) として Android アプリケーションによって送信されたパケットを受信する PC で実行されます。これらの画像をビデオ クリップに変換する必要があります。次のコードは Java アプリケーションの PC コードです。

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.lang.Runnable;
import java.lang.Thread;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class cam_thread_UDP implements Runnable
{
    int nb = 0;
    CAR_GUI car_state;
    Thread t;

    public static int HEADER_SIZE = 5;
    public static int DATAGRAM_MAX_SIZE = 1450;
    public static int DATA_MAX_SIZE = DATAGRAM_MAX_SIZE - HEADER_SIZE;

    public cam_thread_UDP(CAR_GUI gui) 
    {
        car_state = gui;
        try 
        {
            t = new Thread(this);
            t.start();
        } 
        catch (Exception e){e.printStackTrace();}
    }

    public void run() 
    {
        System.out.println("Cam thread waiting...");

        handleConnection_UDP();
    }

    public void handleConnection_UDP() 
    {
        int current_frame = -1;
        int slicesStored = 0;
        byte[] imageData = null;
        DatagramSocket socket=null;

        try 
        {                   
            InetAddress serverAddr = InetAddress.getLocalHost();
            System.out.println("PC IP address: " + serverAddr.getHostAddress());
            socket = new DatagramSocket(9000, serverAddr);
            byte[] buffer = new byte[DATAGRAM_MAX_SIZE];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

            while (true) 
            {               
                socket.receive(packet);             
                byte[] data = packet.getData();         
                int frame_nb = (int)data[0];
                int nb_packets = (int)data[1];
                int packet_nb = (int)data[2];
                int size_packet = (int) ((data[3] & 0xff) << 8 | (data[4] & 0xff)); 

                if((packet_nb==0) && (current_frame != frame_nb))
                {
                    current_frame = frame_nb;
                    slicesStored = 0;               
                    imageData = new byte[nb_packets * DATA_MAX_SIZE];
                }

                if(frame_nb == current_frame)
                {
                        System.arraycopy(data, HEADER_SIZE, imageData, packet_nb * DATA_MAX_SIZE, size_packet);
                        slicesStored++;             
                }

                /* If image is complete display it */
                if (slicesStored == nb_packets) 
                {                   
                    ByteArrayInputStream bis = new ByteArrayInputStream(imageData);
                    car_state.set_image(bis);
                }
            }
        } catch (IOException e) 
        {
            e.printStackTrace();
            socket.close();
        } 
    }
}
4

0 に答える 0