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

まえがき


少し前までは、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ドキュメントのソースへのリンク

Source: https://habr.com/ru/post/J177793/


All Articles