来自 C# 的 IP Cam 实时提要
Posted
技术标签:
【中文标题】来自 C# 的 IP Cam 实时提要【英文标题】:IP Cam live feed from C# 【发布时间】:2013-03-14 11:48:29 【问题描述】:我正在尝试从 C# 应用程序中的 TPLink TL-SC3171G IP cam 获取实时信息。我试过使用 AForge.NET 库,但没有运气。 AForge.NET 的示例代码对我不起作用。我收到“远程服务器返回错误:(401) 未经授权的访问。”
我可以通过具有基本 IP 地址的浏览器访问 cam:"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】:现在我是这样做的:
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 毫秒调用一次。
【讨论】:
那么这段代码只是每 x 秒检索一个 jpeg 图像吗?实际上没有播放实时视频流? @Zapnologica 完全正确 - 但效果是一样的。如果你不需要很多帧,这就足够了。否则请正确执行。 哦,好的,太好了。它是一个很好的选择。请问有什么方法可以正常做吗?以上是关于来自 C# 的 IP Cam 实时提要的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 上获取 IP Cam 视频流 (MJPEG)
esp32-cam拍照上传,app inventor 制作安卓app实时显示
Android Studio + Esp32Cam 实现手机APP实时传输监控视频