多个Android设备上的远程IP摄像头视频

多个Android设备上的远程IP摄像头视频,android,stream,camera,ip,Android,Stream,Camera,Ip,我的一个客户在教堂里安装了一个IP摄像头(D-Link S930L),希望使用Android应用程序与他人共享视频 关键在于,多个(几百个)用户将同时连接到该服务,他还希望将音频从网络摄像头传输到android应用程序 我该怎么办?我发现的所有其他主题都涉及直接将视频流传输给少数用户。我需要在Android应用程序中使用哪些控件来显示流,以及如何支持几百个用户?任何帮助都将不胜感激 发现以下链接与相机一起工作: (运动JPEG) (JPEG) (视频) (JPEG) 谢谢我的朋友在C#为我做了一

我的一个客户在教堂里安装了一个IP摄像头(D-Link S930L),希望使用Android应用程序与他人共享视频

关键在于,多个(几百个)用户将同时连接到该服务,他还希望将音频从网络摄像头传输到android应用程序

我该怎么办?我发现的所有其他主题都涉及直接将视频流传输给少数用户。我需要在Android应用程序中使用哪些控件来显示流,以及如何支持几百个用户?任何帮助都将不胜感激

发现以下链接与相机一起工作:

(运动JPEG)

(JPEG)

(视频)

(JPEG)


谢谢

我的朋友在C#为我做了一些事:

表格1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using System.IO;

namespace kamera
{
    public partial class Form1 : Form
    {

        //private static String imageUrl = "http://cam-kk-03/now.jpg";
        private static String imageUrl=null;
        private static Thread t ;  
        private static Image webImage;
        private static List<String> kamere;
        System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
        private static int intervalOsvezevanja=3000; //ms
        public Form1()
        {
            InitializeComponent();
            ////timer k pokliče funkcijo vsake x sekund
            //AutoResetEvent autoEvent = new AutoResetEvent(false);
            //TimerCallback tcb = updatePicture;
            //System.Threading.Timer stateTimer = new System.Threading.Timer(tcb, autoEvent, 0, 200);


            t = new Thread(updatePicture);
            t.IsBackground = true;
            t.Start();

            timer.Tick += new EventHandler(timer_Tick); // Everytime timer ticks, timer_Tick will be called
            timer.Interval = (intervalOsvezevanja) ;             // Timer will tick every 0.05 seconds
            timer.Enabled = true;                       // Enable the timer
            timer.Start();                              // Start the timer

            //skrijemo formo za dodajanje kamer
            panelDodajKamero.Hide();

            //inicializacija
            kamere = new List<String>();
            tbNaslovKamere.Text =  "cam-kk-";
            preberiDatoteko();
        }

        void timer_Tick(object sender, EventArgs e)
        {
            pictureBox1.Image = webImage;
        }

        ~Form1() {
            //t.Join();
            t.Abort();
            timer.Stop();
            timer.Dispose();
        }

        private void updatePicture(object stateInfo)
        {
            while (true)
            {
                if (imageUrl != null)
                {
                    try
                    {
                        WebRequest requestPic = WebRequest.Create(imageUrl);
                        WebResponse responsePic = requestPic.GetResponse();
                        webImage = Image.FromStream(responsePic.GetResponseStream());
                        //webImage.Save("C:\\Users\\Public\\kamera\\kamera" + fileName + ".jpg");
                    }
                    catch{}
                }
                Thread.Sleep(intervalOsvezevanja);
            }
        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {
            if (menuStrip1.Visible)
            {
                menuStrip1.Hide();
            }
            else
            {
                menuStrip1.Show();
            }
        }

        private void menjajKamero(String camAddr)
        {
            if (camAddr.Contains("http"))
            {
                imageUrl = camAddr;
            }
            else
            {
                imageUrl = "http://" + camAddr + "/now.jpg";
            }
        }

        private void btDodajKamero_Click(object sender, EventArgs e)
        {
            String webAddres;
            if (tbNaslovKamere.Text.Contains("http"))
            {
                webAddres = tbNaslovKamere.Text;
            }
            else
            {
                webAddres = "http://" + tbNaslovKamere.Text + "/now.jpg";
            }
            if (RemoteFileExists(webAddres))
            {
                if (!kamere.Contains(tbNaslovKamere.Text) && !kamere.Contains(webAddres))
                {
                    kamere.Add(tbNaslovKamere.Text);
                    //kamere.Add(webAddres);
                }
                menjajKamero(tbNaslovKamere.Text);
                //menjajKamero(webAddres);
                panelDodajKamero.Hide();
                izpisKamer();
                tbNaslovKamere.Text = "cam-kk-";
            }
            else
            {
                MessageBox.Show("Ne najdem Kamere");
            }
        }

        private void dodajKameroToolStripMenuItem_Click(object sender, EventArgs e)
        {
            panelDodajKamero.Show();
        }

        private void izpisKamer()
        {
            //zanka ki odstrani vse prej dodane kamere
            textBox1.Text = kamereToolStripMenuItem.DropDownItems.Count.ToString();

            foreach (String kamera in kamere)
            {
                kamereToolStripMenuItem.DropDownItems.RemoveByKey(kamera);
            }

            System.IO.StreamWriter file = new System.IO.StreamWriter(System.Environment.CurrentDirectory + "\\kamere.txt");
            foreach (String kamera in kamere)
            {
                ToolStripDropDownButton btTemp = new ToolStripDropDownButton(kamera, null, kameraOnClick, kamera);
                file.WriteLine(kamera);

                //dodamo trenutno kamero, ki je v kamerah.txt
                kamereToolStripMenuItem.DropDownItems.Add(btTemp);
            }
            file.Dispose();
            file.Close();
        }

        private void kameraOnClick(object sender, EventArgs e)
        {
            //tbNaslovKamere.Text+=sender.ToString();
            imageUrl = "http://" + sender.ToString() + "/now.jpg";
        }

        private void izhodToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void preberiDatoteko()
        {
            String vrstica;
            // Read the file as one string.
            if (File.Exists(System.Environment.CurrentDirectory + "\\kamere.txt"))
            {
                kamere = new List<String>();
                StreamReader myFile = new StreamReader(System.Environment.CurrentDirectory + "\\kamere.txt");
                while ((vrstica = myFile.ReadLine()) != null)
                {
                    //zapis v list
                    kamere.Add(vrstica);
                    //doda v meni
                    ToolStripDropDownButton btTemp = new ToolStripDropDownButton(vrstica, null, kameraOnClick, vrstica);
                    kamereToolStripMenuItem.DropDownItems.Add(btTemp);
                }
                myFile.Close();
            }
        }

        private void menuPobrisiKamere()
        {
            foreach (String kamera in kamere)
            {
                kamereToolStripMenuItem.DropDownItems.RemoveByKey(kamera);
            }
            kamere = new List<String>();
        }

        private void odpriToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // Create an instance of the open file dialog box.
            OpenFileDialog openFileDialog1 = new OpenFileDialog();

            // Set filter options and filter index.
            openFileDialog1.Filter = "Text Files (.txt)|*.txt";
            openFileDialog1.FilterIndex = 1;

            //openFileDialog1.Multiselect = true;
            // Call the ShowDialog method to show the dialog box.
            DialogResult userClickedOK = openFileDialog1.ShowDialog();

            //tbNaslovKamere.Text = userClickedOK.ToString();
            // Process input if the user clicked OK.
            if (userClickedOK.ToString().Equals("OK"))
            {
                menuPobrisiKamere();
                String vrstica;

                // Open the selected file to read.
                System.IO.Stream fileStream = openFileDialog1.OpenFile();
                kamere = new List<String>();
                StreamReader myFile = new StreamReader(fileStream);
                while ((vrstica = myFile.ReadLine()) != null)
                {
                    //zapis v list
                    kamere.Add(vrstica);
                    //doda v meni
                    ToolStripDropDownButton btTemp = new ToolStripDropDownButton(vrstica, null, kameraOnClick, vrstica);
                    kamereToolStripMenuItem.DropDownItems.Add(btTemp);
                }
                myFile.Dispose();
                myFile.Close();
                fileStream.Dispose();
                fileStream.Close();
                myFile.Close();
                fileStream.Close();
            }
        }

        private void pobrišiKamereToolStripMenuItem_Click(object sender, EventArgs e)
        {
            menuPobrisiKamere();
        }

        private void zbrišiShranjeneKamereToolStripMenuItem_Click(object sender, EventArgs e)
        {
            menuPobrisiKamere();
            System.IO.StreamWriter file = new System.IO.StreamWriter(System.Environment.CurrentDirectory + "\\kamere.txt");
            file.Dispose();
            file.Close();
        }

        private void pictureBox1_DoubleClick(object sender, EventArgs e)
        {
            Form1 frm1 = new Form1();
            frm1.Size = new Size(100, frm1.Size.Height);
        }

        private bool RemoteFileExists(string url)
        {
            try
            {
                //Creating the HttpWebRequest
                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                //Setting the Request method HEAD, you can also use GET too.
                request.Method = "HEAD";
                //Getting the Web Response.
                HttpWebResponse response = request.GetResponse() as HttpWebResponse;
                //Returns TRUE if the Status code == 200
                return (response.StatusCode == HttpStatusCode.OK);
            }
            catch
            {
                //Any exception will returns false.
                return false;
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
Net系统;
使用系统文本;
使用系统线程;
使用System.Windows.Forms;
使用System.IO;
名称空间kamera
{
公共部分类Form1:Form
{
//专用静态字符串imageUrl=”http://cam-kk-03/now.jpg";
私有静态字符串imageUrl=null;
私有静态线程t;
私有静态图像;
私有静态列表kamere;
System.Windows.Forms.Timer Timer=新的System.Windows.Forms.Timer();
私有静态int intervalOsvezevanja=3000;//ms
公共表格1()
{
初始化组件();
////计时器k pokliče funkcijo vsake x sekund
//AutoResetEvent autoEvent=新的AutoResetEvent(假);
//TimerCallback tcb=updatePicture;
//System.Threading.Timer stateTimer=新的System.Threading.Timer(tcb,自动事件,0,200);
t=新螺纹(updatePicture);
t、 IsBackground=true;
t、 Start();
timer.Tick+=neweventhandler(timer_Tick);//每次timer Tick,都会调用timer_Tick
timer.Interval=(intervalOsvezevanja);//计时器将每0.05秒滴答一次
timer.Enabled=true;//启用计时器
timer.Start();//启动计时器
//斯克里杰莫·福尔莫·扎·多达扬杰·卡梅尔
panelDodajKamero.Hide();
//inicializacija
kamere=新列表();
tbNaslovKamere.Text=“cam kk-”;
preberiDatoteko();
}
无效计时器勾号(对象发送方,事件参数e)
{
pictureBox1.Image=webImage;
}
~Form1(){
//t、 Join();
t、 中止();
timer.Stop();
timer.Dispose();
}
私有void updatePicture(对象状态信息)
{
while(true)
{
if(imageUrl!=null)
{
尝试
{
WebRequestPic=WebRequest.Create(imageUrl);
WebResponse responsePic=requestPic.GetResponse();
webImage=Image.FromStream(responsePic.GetResponseStream());
//webImage.Save(“C:\\Users\\Public\\kamera\\kamera”+fileName+”.jpg);
}
捕获{}
}
睡眠(间歇期);
}
}
私有无效图片单击(对象发送方,事件参数e)
{
如果(菜单提示1.可见)
{
menuStrip1.Hide();
}
其他的
{
menuStrip1.Show();
}
}
私有void menjajKamero(字符串camAddr)
{
if(camAddr.Contains(“http”))
{
imageUrl=camAddr;
}
其他的
{
imageUrl=“http://“+camAddr+”/now.jpg”;
}
}
私有无效btDodajKamero_单击(对象发送者,事件参数e)
{
字符串网址;
if(tbNaslovKamere.Text.Contains(“http”))
{
webAddres=tbNaslovKamere.Text;
}
其他的
{
webAddres=“http://”+tbNaslovKamere.Text+“/now.jpg”;
}
如果(RemoteFileExists(webAddres))
{
如果(!kamere.Contains(tbNaslovKamere.Text)和&!kamere.Contains(webAddres))
{
添加(tbNaslovKamere.Text);
//kamere.Add(webAddres);
}
menjajKamero(tbNaslovKamere.Text);
//menjajKamero(网络地址);
panelDodajKamero.Hide();
izpisKamer();
tbNaslovKamere.Text=“cam kk-”;
}
其他的
{
MessageBox.Show(“Ne najdem Kamere”);
}
}
私有void dodajKameroToolStripMenuItem\u单击(对象发送方,事件参数e)
{
panelDodajKamero.Show();
}
私有无效izpisKamer()
{
//桑卡·基·奥德斯特兰·佩里·多丹·卡梅尔
textBox1.Text=kamereToolStripMenuItem.DropDownItems.Count.ToString();
foreach(卡迈尔的串卡迈拉)
{
kamereToolStripMenuItem.DropDownItems.RemoveByKey(kamera);
}
System.IO.StreamWriter file=new System.IO.StreamWriter(System.Environment.CurrentDirectory+“\\kamere.txt”);
foreach(卡迈尔的串卡迈拉)
{
ToolStripDropDownButton btTemp=新的ToolStripDropDownButton(kamera,null,KameranClick,kamera);
文件写入线(kamera);
//dodamo trenutno kamero,ki je v kamerah.txt
kamereToolStripMenuItem.DropDownItems.Add(btTemp);