代码之家  ›  专栏  ›  技术社区  ›  drago

来自C的IP摄像头实时馈送#

  •  4
  • drago  · 技术社区  · 11 年前

    我正在尝试从C#应用程序中的TPLink TL-SC3171G IP摄像头获取实时反馈。我试过使用AForge.NET库,但没有成功。AForge.NET的示例代码对我不起作用。我得到的是“远程服务器返回错误:(401)未经授权的访问。”

    我可以使用基本的ip地址通过浏览器访问摄像头: "http://192.168.168.20" . 我尝试过的应用内:

    "http://username:password@192.168.168.20"
    "http://username:password@192.168.168.20:port"
    

    你能帮我指明方向吗。它真的不必是AForge.NET库。

    这是代码:

    using AForge.Video;
    using AForge.Video.DirectShow;
    
    namespace Player
    {
        public partial class MainForm : Form
        {
            private Stopwatch stopWatch = null;
    
            // Class constructor
            public MainForm( )
            {
                InitializeComponent( );
            }
    
            private void MainForm_FormClosing( object sender, FormClosingEventArgs e )
            {
                CloseCurrentVideoSource( );
            }
    
            // "Exit" menu item clicked
            private void exitToolStripMenuItem_Click( object sender, EventArgs e )
            {
                this.Close( );
            }
    
            // Open local video capture device
            private void localVideoCaptureDeviceToolStripMenuItem_Click( object sender, EventArgs e )
            {
                VideoCaptureDeviceForm form = new VideoCaptureDeviceForm( );
    
                if ( form.ShowDialog( this ) == DialogResult.OK )
                {
                    // create video source
                    VideoCaptureDevice videoSource = form.VideoDevice;
    
                    // open it
                    OpenVideoSource( videoSource );
                }
            }
    
            // Open video file using DirectShow
            private void openVideofileusingDirectShowToolStripMenuItem_Click( object sender, EventArgs e )
            {
                if ( openFileDialog.ShowDialog( ) == DialogResult.OK )
                {
                    // create video source
                    FileVideoSource fileSource = new FileVideoSource( openFileDialog.FileName );
    
                    // open it
                    OpenVideoSource( fileSource );
                }
            }
    
            // Open JPEG URL
            private void openJPEGURLToolStripMenuItem_Click( object sender, EventArgs e )
            {
                URLForm form = new URLForm( );
    
                form.Description = "Enter URL of an updating JPEG from a web camera:";
                form.URLs = new string[]
                    {
                        "http://195.243.185.195/axis-cgi/jpg/image.cgi?camera=1",
                    };
    
                if ( form.ShowDialog( this ) == DialogResult.OK )
                {
                    // create video source
                    JPEGStream jpegSource = new JPEGStream( form.URL );
    
                    // open it
                    OpenVideoSource( jpegSource );
                }
            }
    
            // Open MJPEG URL
            private void openMJPEGURLToolStripMenuItem_Click( object sender, EventArgs e )
            {
                URLForm form = new URLForm();
    
                form.Description = "Enter URL of an MJPEG video stream:";
                form.URLs = new string[]
                    {
                        "http://195.243.185.195/axis-cgi/mjpg/video.cgi?camera=4",
                        "http://195.243.185.195/axis-cgi/mjpg/video.cgi?camera=3",
                        "http://192.168.168.20:80",
                    };
    
                if ( form.ShowDialog( this ) == DialogResult.OK )
                {
                    // create video source
                    MJPEGStream mjpegSource = new MJPEGStream( form.URL );
    
    
                    // open it
                    OpenVideoSource( mjpegSource );
                }
            }
    
            // Open video source
            private void OpenVideoSource( IVideoSource source )
            {
                // set busy cursor
                this.Cursor = Cursors.WaitCursor;
    
                // stop current video source
                CloseCurrentVideoSource( );
    
                // start new video source
                videoSourcePlayer.VideoSource = source;
                videoSourcePlayer.Start( );
    
                // reset stop watch
                stopWatch = null;
    
                // start timer
                timer.Start( );
    
                this.Cursor = Cursors.Default;
            }
    
            // Close video source if it is running
            private void CloseCurrentVideoSource( )
            {
                if ( videoSourcePlayer.VideoSource != null )
                {
                    videoSourcePlayer.SignalToStop( );
    
                    // wait ~ 3 seconds
                    for ( int i = 0; i < 30; i++ )
                    {
                        if ( !videoSourcePlayer.IsRunning )
                            break;
                        System.Threading.Thread.Sleep( 100 );
                    }
    
                    if ( videoSourcePlayer.IsRunning )
                    {
                        videoSourcePlayer.Stop( );
                    }
    
                    videoSourcePlayer.VideoSource = null;
                }
            }
    
            // New frame received by the player
            private void videoSourcePlayer_NewFrame( object sender, ref Bitmap image )
            {
                DateTime now = DateTime.Now;
                Graphics g = Graphics.FromImage( image );
    
                // paint current time
                SolidBrush brush = new SolidBrush( Color.Red );
                g.DrawString( now.ToString( ), this.Font, brush, new PointF( 5, 5 ) );
                brush.Dispose( );
    
                g.Dispose( );
            }
    
            // On timer event - gather statistics
            private void timer_Tick( object sender, EventArgs e )
            {
                IVideoSource videoSource = videoSourcePlayer.VideoSource;
    
                if ( videoSource != null )
                {
                    // get number of frames since the last timer tick
                    int framesReceived = videoSource.FramesReceived;
    
                    if ( stopWatch == null )
                    {
                        stopWatch = new Stopwatch( );
                        stopWatch.Start( );
                    }
                    else
                    {
                        stopWatch.Stop( );
    
                        float fps = 1000.0f * framesReceived / stopWatch.ElapsedMilliseconds;
                        fpsLabel.Text = fps.ToString( "F2" ) + " fps";
    
                        stopWatch.Reset( );
                        stopWatch.Start( );
                    }
                }
            }
        }
    }
    
    1 回复  |  直到 11 年前
        1
  •  6
  •   drago    11 年前

    现在我是这样做的:

    string sourceURL = "http://ipaddress/jpg/image.jpg";
                byte[] buffer = new byte[100000];
                int read, total = 0;
                // create HTTP request
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sourceURL);
                req.Credentials = new NetworkCredential("username", "pass");
                // get response
                WebResponse resp = req.GetResponse();
                // get response stream
                Stream stream = resp.GetResponseStream();
                // read data from stream
                while ((read = stream.Read(buffer, total, 1000)) != 0)
                {
                    total += read;
                }
                // get bitmap
                Bitmap bmp = (Bitmap)Bitmap.FromStream(
                              new MemoryStream(buffer, 0, total));
    
                pictureBox1.Image = bmp;
    

    当然,我已经把这个代码放在一个线程中,并且每500毫秒调用一次。