1

IP カメラを C# アプリに接続しているときに、Aforge/Samples/Player でシンプルなプレーヤーを見つけました。ip 文字列を変更する必要があったので、私のadmin:admin@192.168.1.239:81/videostream.cgi?rate=11を追加して、MJPEG ビデオ ストリームを取得しました。コンパイル時に、リモート サーバーがエラー (401) Unauthorized を返したため、エラーが発生しました。MJPEGstream.cs ファイルで Andre Kirillow が言及されている 一部のカメラは、標準に厳密に準拠していない HTTP ヘッダーを生成し、.NET 例外を引き起こします。この例外を回避するには、アプリケーション構成ファイルを使用して、httpWebRequest の useUnsafeHeaderParsing 構成オプションを設定する必要があります

<configuration>
    <system.net>
        <settings>
            <httpWebRequest useUnsafeHeaderParsing="true" />
        </settings>
    </system.net>
</configuration>

Dinis Cruzが提案しているように、これを行うには2つの方法があります。上記のコードで .config ファイルを追加し、プログラムでも実行しましたが、同じエラーが続きます。Player プログラムのコーディングは

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;

using AForge.Video;
using AForge.Video.DirectShow;

using System.Reflection;
using System.Net.Configuration;
using System.Net;

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://admin@192.168.1.239:81/videostream.cgi?rate=11",
                "mjpegSource by mobby"
            };

        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( );
            }
        }
    }

    public static bool SetAllowUnsafeHeaderParsing20()
    {
        //Get the assembly that contains the internal class
        Assembly aNetAssembly = Assembly.GetAssembly(typeof(System.Net.Configuration.SettingsSection));
        if (aNetAssembly != null)
        {
            //Use the assembly in order to get the internal type for the internal class
            Type aSettingsType = aNetAssembly.GetType("System.Net.Configuration.SettingsSectionInternal");
            if (aSettingsType != null)
            {
                //Use the internal static property to get an instance of the internal settings class.
                //If the static instance isn't created allready the property will create it for us.
                object anInstance = aSettingsType.InvokeMember("Section",
                BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.NonPublic, null, null, new object[] { });
                if (anInstance != null)
                {
                    //Locate the private bool field that tells the framework is unsafe header parsing should be allowed or not
                    FieldInfo aUseUnsafeHeaderParsing = aSettingsType.GetField("useUnsafeHeaderParsing", BindingFlags.NonPublic | BindingFlags.Instance);
                    if (aUseUnsafeHeaderParsing != null)
                    {
                        aUseUnsafeHeaderParsing.SetValue(anInstance, true);
                        return true;
                    }
                }
            }
        }
        return false;
    }
  }
}

Google からいくつかのオープン IP カメラを追加したところ、ビデオ ストリームがキャプチャされ、正常に動作しましたが、カメラはエラー 401 を返しました。次に、Sean Tearneyによって最近作成された、同じ Aforge ライブラリを使用して構築された ISPY ソフトウェアを使用し、カメラのビデオ ストリームをキャプチャしました。 p。単純なプレーヤーのコーディングの何が問題なのかわかりません。カメラからビデオストリームを取得するのを手伝ってくれる人がいれば、親切に教えてください。ありがとうございました

4

1 に答える 1

1

おそらく、カメラがパスワードで保護されているためです。ストリームを表示できるようにするには、アクセスしようとしているカメラのユーザー名とパスワードを入力してください。jpeg ストリームの場合:

jpegSource.Login = "your username";
jpegSource.Password = "your password";

mjpeg ストリームの場合:

mjpegSource.Login = "your username"; 
mjpegSource.Password = "your password";
于 2012-09-27T03:01:46.823 に答える