0

私は、ユーザーが IP カメラ (Mobotix カメラ) を使用してビデオを録画できる必要がある Web プロジェクトに取り組んでいます。私はいくつかのアイデアを思いつきましたが、どれも実際にはうまくいきませんでした。クライアント PC にはソフトウェアをインストールできないため、記録をサーバーに保存することを思いつきました。ユーザーがブラウザでページを開くと、サーバーはカメラへのリクエストを開きます (カメラが HTTP 経由で提供する組み込みストリームを使用します: http:///cgi-bin/faststream.jpg? stream=full&fps=1.0 )、次のコードでストリームをサーバーに保存します。

   public ActionResult Index()
   {

        WebClient webClient = new WebClient();
        webClient.Credentials = new NetworkCredential("Username", "Password");

        var url = "http://<ip-camera>/cgi-bin/faststream.jpg?params";

        // Download the file and write it to disk
        using (Stream webStream = webClient.OpenRead(url))
        using (FileStream fileStream = new FileStream(outputFile, FileMode.Create))
        {
            var buffer = new byte[32768];
            int bytesRead;
            Int64 bytesReadComplete = 0;  // Use Int64 for files larger than 2 gb

            // Get the size of the file to download
            Int64 bytesTotal = Convert.ToInt64(webClient.ResponseHeaders["Content-Length"]);

            // Download file in chunks
            while ((bytesRead = webStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                bytesReadComplete += bytesRead;
                fileStream.Write(buffer, 0, bytesRead);                    
            }

        }
 }

カメラからのストリームはエンドレスなので、リクエストもエンドレスです。ユーザーがリクエストを停止すると、記録も停止する必要があります。

上記のセットアップは機能しますが、いくつかの問題があります。ストリームは最初にサーバーのメモリに保存され、リクエストが停止した後にのみ保存されるようです。これにより、大きなビデオで問題が発生すると思います。動画をすぐに保存する方法はありますか?

また、ユーザーがリクエストを停止しても、サーバーがビデオを録画し続けるという問題があるようです。リクエストが停止することを確認する方法はありますか?

私は、このソリューションが理想からかけ離れていることを知っています。最善の解決策を求めて高低を検索しましたが、これまでのところ見つけることができませんでした。これが機能することを願っています。とにかくサンクス。

4

1 に答える 1

1

リクエストはサーバーで同期的に処理されています。これは、要求を処理する Web サーバー スレッドが (Web クライアントを使用して) ビデオ ストリームを取得する別の要求を行い、ストリームが読み取られている間も実行し続けることを意味します。ユーザーがリクエストをキャンセルしても、Web サーバー スレッドは実行を続けます。

レコーディング機能をプレゼンテーション レイヤー (Web ページ) から分離します。Windows サービスでストリームと Web ページを処理し、記録コマンドを Windows サービスに送信します。コマンドを格納するためのキュー (db テーブル、windows azure キューなど) を使用して、Web ページと Windows サービス間の通信を簡単に実装できます。

Windows サービスはループ内で (別のスレッドで) キューを読み取り、ストリームを処理しているスレッドに信号を送って、記録を停止できるようにします。

于 2012-10-01T13:22:03.740 に答える