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