Android视频流使用DatagramSocket setPreviewCallback

时间:2013-12-10 12:13:57

标签: c# android sockets datagram

我已经在android中使用Datagram Socket创建了一个服从UDP的应用程序。我正在尝试使用Camera的setPreviewCallback函数将字节发送到(c#)客户端,使用Datagram Socket;

但是,

问题是:它抛出异常“数据报太大而不适合指定的缓冲区,因此被截断”并且客户端上没有接收到任何字节。

我已经将缓冲区的大小更改为不同的值但没有工作。现在:

数据报方法是对的吗?

我用什么方法/方法来完成任务?

这是什么理想的解决方案?

Android服务器:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    videoView = (VideoView) findViewById(R.id.videoView1);
    start = (Button)findViewById(R.id.start);
    stop = (Button)findViewById(R.id.stop);
    setTitle(GetCurrentIP());
    mainList = new LinkedList<byte[]>();
    secondaryList = new LinkedList<byte[]>();
    mCam = null;
    mCam = Camera.open();
    if (mCam == null) {
        Msg("Camera is null");
    } else {
        if (!Bind()) {
            Msg("Bind Error.");
        } else {
            Msg("Bound Success.");

            start.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    try {
                        mCam.setPreviewDisplay(videoView.getHolder());
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                        Msg(e1.getMessage());
                    }
                    mCam.setPreviewCallback(new PreviewCallback() {
                        @Override
                        public void onPreviewFrame(byte[] data, Camera camera) {
                            // TODO Auto-generated method stub
                            DatagramPacket pack;
                            try {
pack = new DatagramPacket(data, data.length, InetAddress.getByName(clientIP), clientPort);
                                    me.send(pack);
                                } catch (UnknownHostException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                    Msg(e.getMessage());
                                } catch (IOException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                    Msg(e.getMessage());
                                }   
                            }
                        });
                        mCam.startPreview();
                    }
                });
            }
        }
    }

private boolean Bind(){
    try {
        me = new DatagramSocket(MY_PORT);
        return true;
    } catch (SocketException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        Msg(e.getMessage());
    }
    return false;
}

private String GetCurrentIP(){
    WifiManager wifiMgr = (WifiManager) getSystemService(WIFI_SERVICE);
    return Formatter.formatIpAddress(wifiMgr.getConnectionInfo().getIpAddress());
}

public void Msg(String msg){
    Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
    Log.v(">>>>>", msg);
}
}

C#客户端:

public partial class Form1 : Form
 {
      const int MY_PORT = 55566;
      IPAddress MY_IP;

      Thread Receiver;

      Socket me;
      EndPoint myEndPoint;

      EndPoint serverEndPoint;

      byte[] buffer;

      public Form1()
      {
           InitializeComponent();
      }

      private IPAddress GetCurrentIPAddress()
      {
           IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());
           var selectedIPs = from ip in ips
                             where ip.AddressFamily == AddressFamily.InterNetwork
                             select ip;
           return selectedIPs.First();
      }

      private bool Bind()
      {
           try
           {
                myEndPoint = new IPEndPoint(MY_IP, MY_PORT);
                me.Bind(myEndPoint);
                return true;
           }
           catch (Exception ex)
           {
                MessageBox.Show(ex.Message);
           }

           return false;
      }

      private void Form1_Load(object sender, EventArgs e)
      {
           try
           {
                MY_IP = GetCurrentIPAddress();
                this.Text = MY_IP.ToString()+":"+MY_PORT;

                me = new Socket
                (
                     AddressFamily.InterNetwork,
                     SocketType.Dgram,
                     ProtocolType.Udp
                );


                if (!Bind())
                     Task.Run(()=> MessageBox.Show("Bind() error."));
                else
                     Task.Run(() => MessageBox.Show("Bind success."));
           }
           catch (Exception ex)
           {
                MessageBox.Show(ex.Message);
           }
      }

      //private void AddToListBox(String msg)
      //{
      //     this.Invoke((Action)delegate() { this.listBox1.Items.Add((this.listBox1.Items.Count+1)+" : "+msg); });
      //}

      private void buttonStart_Click(object sender, EventArgs e)
      {
           serverEndPoint = new IPEndPoint(IPAddress.Parse(textBoxmyIP.Text), int.Parse(textBoxmyPort.Text));
           Receiver = new Thread(new ThreadStart(Receive));
           Receiver.Start();
      }

      private Image ByteToImage(byte[] bytes)
      {
           MemoryStream ms = new MemoryStream(bytes);
           return Image.FromStream(ms);
      }

      private void Receive()
      {
           while (true)
           {
                buffer = new byte[100];
                int nobs = me.ReceiveFrom(buffer, ref serverEndPoint);
                if (nobs>0)
                {
                     Task.Run(() => MessageBox.Show("Bytes received"));
                     //AddToListBox(Encoding.Default.GetString(buffer));
                     //AddToPictureBox(buffer);
                }
                Thread.Sleep(100);
           }
      }

      private void AddToPictureBox(byte[] buffer)
      {
           this.BeginInvoke
           (
                (Action)
                delegate()
                {
                     pictureBox1.Image = ByteToImage(buffer);
                }
           );
      }
 }

0 个答案:

没有答案