カメラからビデオをキャプチャし、ネットワーク経由で転送する

まえがき



少し前までは、Webカメラからビデオをキャプチャし、.Netを使用してネットワーク経由で送信する必要がありました。

初めてこの問題に直面したので、最初にこの問題に関する情報を探し始めました。

判明したように、クリーンな.Netでは、Webカメラでの作業はサポートされていません。 いくつかの異なるライブラリを調べた後、Aforge.netを選択しました。



Aforge.netは多くの問題を解決するためのフレームワークであり、そこからAForge.Videoライブラリが必要になります。



画像キャプチャ



ビデオ入力デバイスからビデオをキャプチャするために、 AForge.Video.DirectShow.VideoCaptureDevice



クラスがあります。 彼は、キャプチャが発生するデバイスのモニカを設定する必要があります。 NewFrame



イベントNewFrame



を設定することも必要です。 このイベントは、デバイスから新しいフレームが受信されるたびに発生し、既に処理可能なBitmap



オブジェクトとしてハンドラーに送信されます。

 private void VideoSourceNewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs) { var img = (Image) eventArgs.Frame; using (var ms=new MemoryStream()) { img.Save(ms,ImageFormat.Jpeg); //    ,    mjpeg _bufImage = ms.ToArray(); } }
      
      







ビデオキャプチャを開始するには、 Start()



メソッドを呼び出します。



システムにインストールされている使用可能なカメラのリストは、 FilterInfoCollection



クラスを使用して取得でき、必要なデバイスカテゴリをパラメーターとして渡します。

 var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
      
      





このクラスは、2つのフィールドを含むFilterInfo要素のコレクションです。



したがって、デバイスモニカを受け取っVideoCaptureDevice



、それをVideoCaptureDevice



クラスに渡すことができます。



MJPEGビデオストリーム生成



MJPEG(Motion JPEG)は最も単純なビデオ圧縮アルゴリズムなので、私はそれに決めました。

MJPEGビデオストリームは、httpヘッダーが追加されたJPEG形式の連続フレームで構成されます。

 HTTP/1.1 200 OK Cache-Control: no-cache Pragma: no-cache Transfer-Encoding: chunked Content-Type: multipart/x-mixed-replace; boundary=--myboundary Expires: -1 --myboundary Content-Type: image/jpeg Content-Length:96719 .....image....... --myboundary Content-Type: image/jpeg Content-Length:96720 .....next image.......
      
      





実装例:

 public ActionResult Video() { Response.Clear(); //       Response.ContentType = "multipart/x-mixed-replace; boundary=--myboundary"; //  Response.Expires = 0; Response.Cache.SetCacheability(HttpCacheability.NoCache); var ae = new ASCIIEncoding(); //      while (Response.IsClientConnected) { try { //_bufImage - ,        jpeg var buf = _bufImage; //   var boundary = ae.GetBytes("\r\n--myboundary\r\nContent-Type: image/jpeg\r\nContent-Length:" + buf.Length + "\r\n\r\n"); Response.OutputStream.Write(boundary, 0, boundary.Length); Response.OutputStream.Write(buf, 0, buf.Length); Response.Flush(); // ,     20 / Thread.Sleep(50); } catch (Exception) { } } Response.End(); return null; }
      
      





Aforge.net

Mjpeg

Googleドキュメントのソースへのリンク



All Articles