9

防犯カメラからのビデオフィードを表示する必要があるASP.NETアプリケーションがあります。ビデオフィードのコンテンツタイプは'multipart/x-mixed-replace;です。border=-myboundary'と境界間の画像データ。カメラのWebインターフェイスを直接参照した場合と同じように、クライアント側のプラグインがストリームを使用できるように、そのデータストリームをページに渡すための支援が必要です。次のコードは機能しません。

//Get response data
byte[] data = HtmlParser.GetByteArrayFromStream(response.GetResponseStream());
if (data != null)
{
 HttpContext.Current.Response.OutputStream.Write(data, 0, data.Length);
}
return;
4

3 に答える 3

16

クライアントに mjpeg ストリームを表示させたい場合は、http 応答全体を送信する必要があります。ブラウザのような HTTP クライアントや VLC のようなメディア プレーヤーには、次のような mjpeg ストリームが必要です。

HTTP/1.1 200 OK
Content-Type: multipart/x-mixed-replace; boundary=myboundary

--myboundary
Content-Type: image/jpeg
Content-length: 12345

[image 1 encoded jpeg data]


--myboundary
Content-Type: image/jpeg
Content-length: 45678

[image 2 encoded jpeg data]

...

注: Ergousha が回答で述べたように、Content-length フィールドの後に空の行が必要です。

ところで、クライアントを直接 mjpeg ストリームにリダイレクトしてみませんか?

たとえば、 http://ipcam/mjpg/video.mjpg AXIS IP カメラを使用できます。

HTTP 経由で画像が必要な場合は、正しいヘッダーと MIME content-type image/jpeg を設定する必要があります。画像をデコードするには、バイトデータを取得する必要があり、jpeg エンコーディングを取得します。次に、jpeg をデコードして、特定の形式 (yuv420p のようなもの) の画像を取得する必要があります。IP カメラを確認しましたが、そのストリームは base64 でエンコードされていないと思います。

あなたのニーズを正確に、私はもっと助けようとします。

my2c

編集:

さて、私はあなたが次のようなことをすると思います:

client    : connect to proxy, 
            get example.com/camera1.mjpg,
            while not the end
                recv


yourproxy : wait connection
            connect to camera,
            get 10.0.0.123/camera1.mjpg
            while not the end
                recv buffer
                copy buffer
                send buffer to client

つまり、正しいヘッダーをクライアントに送信する必要があります。Wireshark のようなツールを使用してパケットをスパイし、クライアントが HTTP GET を発行した後、正しい MJPEG ストリームをクライアントに送信するようにします (投稿の冒頭で説明したようなものです ...)。

m2c

于 2010-02-09T14:28:09.820 に答える
6

mjpeg ストリームがどのように見えるかについての適切な説明。ヒントを追加したいと思います。実際のデータの前には常に 2 つの改行文字があります。1行にするとうまくいきません。

        string header =
            "--myboundary\r\n" +
            "Content-Type:image/jpeg\r\n" +
            "Content-Length:" + length.ToString() + "\r\n\r\n";
于 2010-05-14T07:50:01.120 に答える
1

画像データのエンコードは何ですか?Base64ですか?

基本的に、応答から画像データを解析し、Base64 でバイトにデコードしてから、画像をクライアントに送信する必要があります。

于 2010-01-14T21:31:23.207 に答える