web-dev-qa-db-ja.com

C#でMJPEGビデオストリームを作成する

リモートビデオソースからJPEG画像として毎秒約5フレームでデータベースに送信されている画像があります。ライブビデオフィードをSilverlightにストリーミングできるように、これらの画像をビデオ形式にする方法を見つけようとしています。

MJPEGストリームを作成することは理にかなっているようですが、いくつか問題があります。最初はHTTPリクエストを介してストリーミングしようとしていたので、ソケットを扱う必要はありませんでしたが、コードが壊れている可能性があります。

QTからストリームにサーフしようとすると、ビデオエラーが発生し、メディアプレーヤーに最初のフレーム画像が表示され、Silverlightがクラッシュします:)

ストリーミングするコードは次のとおりです。この方法で使用されるコンテンツタイプは、理想的ではなく、根本的な原因である可能性があることがわかった場合にのみ送信できます。すべての画像は、LINQ2SQLオブジェクトを介して受信されます。

Silverlightでイメージコントロールのイメージソースを更新しようとしましたが、ちらつきは許容されません。 SilverlightがMJPEGをサポートしていない場合は、続行しても意味がありませんが、サポートしているように見えます。入ってくるh.264フレームにアクセスできますが、MP4経由ではもっと複雑に見えました。

    Response.Clear();
    Response.ContentType = "multipart/x-mixed-replace; boundary=--myboundary";
    ASCIIEncoding ae = new ASCIIEncoding();
    HCData data = new HCData();
    var videos = (from v in data.Videos
                 select v).Take(50); // sample the first 50 frames
    foreach (Video frame in videos)
    {
        byte[] boundary = ae.GetBytes("\r\n--myboundary\r\nContent-Type: image/jpeg\r\nContent-Length:" + frame.VideoData.ToArray().Length + "\r\n\r\n");
        var mem = new MemoryStream(boundary);
        mem.WriteTo(Response.OutputStream);
        mem = new MemoryStream(frame.VideoData.ToArray());
        mem.WriteTo(Response.OutputStream);
        Response.Flush();
        Thread.Sleep(200);
    }

ありがとう!

編集:私はFirefoxでストリームを動作させているので、ページにサーフィンするとビデオが表示されます!しかし、他に何もフォーマットを受け入れません。 IE、SL、メディアプレーヤーではありません-何もありません。

26
typemismatch

私はずっと前(3〜4年前)にMJPEGを実行しましたが、詳細を思い出そうとして頭をかいていて、どうしても思い出せません。ただし、可能であれば、MJPEGコンテンツをストリーミングしてwireshark/Etherealを起動し、ネットワークを介して何が得られるかを確認するためのWebサイトを見つけることをお勧めします。私の推測では、Firefoxがもう少し寛容であるいくつかの必要なHTTPヘッダーが欠落しています。

インターネット上でサンプルのMJPEGストリームが見つからない場合、多くのWebカメラにはMJPEGストリームを提供するソフトウェアがあります。私が使用したアプリは複数の防犯カメラ用のコンソールだったので、これはすべてのタイプのカムに共通の実装であることがわかっています(Webインターフェイスをサポートしている場合)。

2
dviljoen

私はMJPEGストリーミングの専門家ではありませんが、sourcefourgeで mjpg-streamer のソースを見ると、各フレームを個別に送信し、各フレームの前後に境界を書き込む必要があると思います。もちろん、終了境界にcontent-typeを記述しないでください。

1
csgero

まず、mjpegフレームを別々のファイルに書き出します。その後、Phototshopでこれらを開くことができるはずです(これにより、ストリームを正しく解析していることが個別に確認されます)。これが失敗した場合は、間違いなく、画像データにHTTPヘッダーが埋め込まれています。

0
dicroce

ネット上に存在するさまざまなウェブカメラのセットアップを見たことがありますか?それらの多くは、ちらつきなしにある種の低解像度の更新を行います。これらのタイプのサイトをリバースエンジニアリングして、問題の手がかりを追加できるはずです。

一部のサイトはGIFアニメーションを作成しますが、これはユーザーが過去1分ほどを見ることができるようにするためのオプションかもしれません。

0
John Dyer

編集について:MJPEGはFirefoxとSafariでサポートされています。ただし、ExplorerやSilverlightのように、使用している内容に応じて、他のアプリケーションはそうではありません。

0
QueueHammer