2012-06-23 4 views
2

내 고객 중 한 명이 IP 카메라 (D-Link S930L)를 교회에 설치했으며 Android 앱을 사용하여 다른 사람들과 동영상을 공유하고 싶습니다.여러 대의 Android 기기에서 원격 IP 카메라 동영상

여러 명의 사용자가 동시에 서비스에 연결되며 네트워크 카메라에서 안드로이드 앱으로 오디오를 스트리밍하기를 원합니다.

어떻게해야합니까? 내가 찾은 다른 모든 주제는 비디오를 몇 명의 사용자에게 직접 스트리밍하는 것과 관련이 있습니다. 스트림을 표시하기 위해 Android 앱에서 어떤 컨트롤을 사용해야하며 몇 백 명의 사용자를 어떻게 지원할 수 있습니까? 어떤 도움이라도 대단히 감사하겠습니다.

http://aaa.bbb.ccc.ddd/mjpeg.cgi (모션 JPEG)

http://aaa.bbb.ccc.ddd/IMAGE.JPG (JPEG)

http://aaa.bbb.ccc.ddd/VIDEO.CGI (비디오)

http://aaa.bbb.ccc.ddd/image/jpeg.cgi (JPEG)

:

다음 링크

카메라와 함께 일하게 밝혀졌다

감사합니다.

+0

귀하의 주요 문제는 Android 및 카메라와 관련된 모든 것과 관련이 없습니다. 이 카메라는 "수백명의"동시 사용자를 지원할 수있는 힘을 갖지 않을 것입니다. 따라서 스트림에서 읽을 수있는 독자적인 서버 솔루션을 찾아내어 고객에게 전달해야합니다. * 문제 *를 파악한 다음 Android에서 결과를 볼 수있는 방법으로 되돌아갑니다. BTW, 실제 제품 번호는 DCS-930L 인 것으로 보입니다. – CommonsWare

+0

실제로 안드로이드와 관련된 한 가지는 서버 솔루션이 안드로이드 내장 (일반적으로 hw 가속) 비디오 엔진에서 지원되는 스트리밍 형식으로 트랜스 코딩되도록 선택한 경우 유용 할 수 있습니다. 시장에 MJPEG와 같은 다른 형식을 볼 수있는 앱이 있지만 소프트웨어 디코딩으로 더 많은 전력을 소비하며 이러한 형식은 대역폭 효율성이 떨어집니다 (대역폭 효율이 아닌 인코더의 단순화를 위해 선택됨) –

답변

0

내 친구는 C#으로 나를 위해 뭔가를했을 :

Form1.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; 
      } 
     } 
    } 
} 

이 양식 및 http://IP/HOSTNAME/now.jpg에서 링크 열기 (호스트) 및 디스플레이 이미지를 열 것, 다른 뭔가로 변경할 수 있습니다. TXT 파일에 호스트를 작성 ... verry 간단한 efective하고 귀여운 응용 프로그램. 내 최적화 후 지금은 0-1 CPU 시간과 최대 70K memmory 필요합니다.

유용한 정보를 찾을 수 있기를 바랍니다 ... .Net 3.5 응용 프로그램입니까?

관련 문제