0

私はこの質問を劇的に変更しましたが、ここに行きます。IPカムからmjpegストリームを読んでいますが、すべてうまくいきます。しかし、受信したすべてのフレーム (stream_NewFrame を参照) で、この画像をクライアントにプッシュしたいと考えています。しかし、HttpContext.Current にアクセスする方法を理解できないようです。その関数内では常に null になります。ProcessRequest 関数内でできるように、HttpContext コンテキストにアクセスする方法を知っている人はいますか? ここで明らかな何かが欠けていると思いますが、何がわかりません! お時間をいただきありがとうございます。

  public class ImageHandler : IHttpHandler, IRequiresSessionState
{

    public void ProcessRequest(HttpContext context)
    {

        //Get parameter
        string Url = context.Request.QueryString["url"];
        string Username = context.Request.QueryString["username"];
        string Password = context.Request.QueryString["password"];

        //Set cache 
        HttpResponse Response = HttpContext.Current.Response;
        Response.Expires = 0;
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.ContentType = "multipart/x-mixed-replace";

        // create MJPEG video source
        MJPEGStream stream = new MJPEGStream(string.Format("{0}/video.cgi?user={1}&pwd={2}", Url, Username, Password));
        stream.NewFrame += new NewFrameEventHandler(stream_NewFrame);
        stream.Start();

    }


    private void stream_NewFrame(object sender, NewFrameEventArgs eventArgs)
    {
        Image img = eventArgs.Frame;
        byte[] b = GetImageBytes(eventArgs.Frame);
        HttpContext.Current.Response.OutputStream.Write(b, 0, b.Length);

    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }

}
4

2 に答える 2

1

HttpContextメソッドからアクセスできるように、どこかに保存してみませんstream_NewFrameか? クラスでメンバー変数を使用することをお勧めします。

それ以上にカプセル化したい場合は、フィードする別のクラスを作成し、代わりにそのクラスにメソッドをHttpContext配置します。stream_NewFrame何かのようなもの:

class Processor

      private HttpContext _context;

      public Processor(HttpContext context) {
           _context = context;
      }

      public void stream_NewFrame(object sender, NewFrameEventArgs eventArgs)
      {
          Image img = eventArgs.Frame;
          byte[] b = GetImageBytes(eventArgs.Frame);
          HttpContext.Current.Response.OutputStream.Write(b, 0, b.Length);
      }
}

そして、ProcessRequestあなたは次のようにします:

public class ImageHandler : IHttpHandler, IRequiresSessionState {

public void ProcessRequest(HttpContext context)
{

    //Get parameter
    string Url = context.Request.QueryString["url"];
    string Username = context.Request.QueryString["username"];
    string Password = context.Request.QueryString["password"];

    //Set cache 
    HttpResponse Response = HttpContext.Current.Response;
    Response.Expires = 0;
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.ContentType = "multipart/x-mixed-replace";

    // create processor
    Processor p = new Processor(context);    

    // create MJPEG video source
    MJPEGStream stream = new MJPEGStream(string.Format("{0}/video.cgi?user={1}&pwd={2}", Url, Username, Password));
    stream.NewFrame += new NewFrameEventHandler(p.stream_NewFrame);
    stream.Start();

}
于 2011-08-14T19:34:01.663 に答える
0

MJPEGStream は、動作するバックグラウンド スレッドを作成します。HTTPContext.Current はスレッド ローカル変数です。つまり、バックグラウンド スレッド (stream_newFrameコールバック関数を呼び出しているスレッド) は別のスレッドにあるため、同じものはありませんHTTPContext(実際には何もありません)。別の方法で提供する必要があります。エリックが提案したように、プロセッサ オブジェクトを作成して参照を保持するというアイデアはうまくいくはずです。

于 2011-08-14T23:07:24.203 に答える