Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将android的摄像头馈送流到基于java的服务器_Java_Android_Video Streaming - Fatal编程技术网

将android的摄像头馈送流到基于java的服务器

将android的摄像头馈送流到基于java的服务器,java,android,video-streaming,Java,Android,Video Streaming,我正在制作一个简单的android应用程序,将摄像头的视频流传输到一个定制的基于java的服务器,我正在使用tcp发送帧(基本上是字节[]),我知道tcp不是视频流的好方法,但对我来说没问题,android是客户端,java应用程序是服务器,我已经成功地实现了客户端,但是我在实现java应用程序时遇到了问题,服务器必须接收字节[],将其转换为图像并显示在某个图像容器中,这是服务器的源代码: package dummyserver; import java.awt.Im

我正在制作一个简单的android应用程序,将摄像头的视频流传输到一个定制的基于java的服务器,我正在使用tcp发送帧(基本上是字节[]),我知道tcp不是视频流的好方法,但对我来说没问题,android是客户端,java应用程序是服务器,我已经成功地实现了客户端,但是我在实现java应用程序时遇到了问题,服务器必须接收字节[],将其转换为图像并显示在某个图像容器中,这是服务器的源代码:

      package dummyserver;

       import java.awt.Image;
       import java.awt.image.BufferedImage;
       import java.io.ByteArrayInputStream;
       import java.io.DataInputStream;
       import java.io.IOException;
       import java.io.InputStream;
       import java.net.ServerSocket;
       import java.net.Socket;
       import javax.imageio.ImageIO;
       import javax.media.jai.PlanarImage;


     /**
         *
       * @author usama
     */
  public class ServerListen implements Runnable{


    CameraFeed camera_feed_ui;
    ServerSocket server_socket=null;
    Socket client_socket=null;
    InputStream in=null;
    int port=9000;
    DataInputStream dis=null;

public ServerListen() {}

public ServerListen(CameraFeed camera_feed_ui)
{
    this.camera_feed_ui = camera_feed_ui;
}



public void run() {

        int len = 0;
        byte[] data;

            while(true)
    {
    try {
        System.out.println("Waiting");
        server_socket = new ServerSocket(port);
        client_socket=server_socket.accept();
        System.out.println("Client arrived");
        System.out.println("Reading Image");
       in=client_socket.getInputStream();

       data=new byte[client_socket.getReceiveBufferSize()];

       in.read(data, 0, client_socket.getReceiveBufferSize());

        Image image = getImageFromByteArray(data);

        BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);

        PlanarImage planar_image=PlanarImage.wrapRenderedImage(bufferedImage);
        System.out.println("Converting byte[] to Image completed");
        camera_feed_ui.displayImage(planar_image);


//        client_socket.close();
        server_socket.close();



        }
 catch(Exception ex)
    {
        System.out.println("error: "  + ex.toString());
    }

    }
}




public static Image getImageFromByteArray(byte[] byteArray) {
    InputStream is = new ByteArrayInputStream(byteArray);
    try {
        return ImageIO.read(is);
    } catch (IOException ex) {
        System.out.println("Unable to converet byte[] into image.");
        return null;

    }


  }
 }
代码说明: CameraFeed是我的JFrame的对象,它基本上包含要显示视频的图像容器(用于显示我正在使用[java advance imaging]的视频)。displayImage(PlanarImage)方法只是获取要在容器中显示的图像。我认为问题在于将字节[]转换为图像,或者我没有正确地从套接字中提取字节[],现在在输出中我得到了一个黑色图像

还有一件事,在客户端,我为每个帧建立tcp连接,这段代码也很清楚,我在接收帧后关闭连接(server_socket.close()),这是一种好方法吗?如何使此流媒体高效?如果你能描述一下从android手机到服务器的视频流的合适方法(我问的是算法)

提前谢谢

问候

乌萨马

编辑:

C#代码:


基本上,问题在于java中的等价物是什么,如果java中有任何这样的方法,它只获取一个流并转换为图像,同时抽象转换的低级细节,那么这个任务也可以为java完成。因此,任何想法???

视频流不仅仅是一个图像流(例如JPEG)。根据编解码器的不同,它是一个编码帧流,其中一些只是部分(帧内)帧。因此,您不能只获取视频流并简单地使用图像编解码器对其进行解码。你需要一个视频流编解码器

看看这两个开源项目,看看它们是如何实现的:


感谢您的回复,我会关注这些项目,我同意视频流不仅仅是一个图像流(如JPEG),我所使用的方法应该有效,因为我已经用上面的方法实现了C#中的服务器,它工作得很好,但是我在用Java实现时遇到了问题。你能发布你的C#实现吗?我也有同样的问题,你成功了吗
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;

namespace VideoServer
{
    public partial class Form1 : Form
   { 

    TcpListener server_socket;
    Socket client_socket;
    Thread video_thread;
    NetworkStream ns;

    public Form1()
    {
        InitializeComponent();
        server_socket = null;
        client_socket = null;
    }

    private void startVideoConferencing()
    {
        try
        {
            server_socket = new TcpListener(System.Net.IPAddress.Parse("192.168.15.153"),9000);
            server_socket.Start();
            client_socket = server_socket.AcceptSocket();
            ns = new NetworkStream(client_socket);
            pictureBoxVideo.Image = Image.FromStream(ns);
            server_socket.Stop();

            if (client_socket.Connected == true)
            {
                while (true)
                {
                    startVideoConferencing();
                }
                ns.Flush();
            }
        }
        catch (Exception ex)
        {
            button1.Enabled = true;
            video_thread.Abort();
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        button1.Enabled = false;
        video_thread = new Thread(new ThreadStart(startVideoConferencing));
        video_thread.Start();
    }

}
}