在c#中创建MJPEG视频流

时间:2008-10-19 16:58:39

标签: c# video video-streaming mjpeg

我将图像从远程视频源以每秒约5帧的速度发送到我的数据库作为JPEG图像。我试图找出如何将这些图像转换为视频格式,以便将实时视频源流式传输到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,媒体播放器 - 没什么。

5 个答案:

答案 0 :(得分:2)

我很久以前(3 - 4年前)做过MJPEG,我正在试图记住细节,但我根本不能。但是,如果它可能的话,我会建议找到某种网站来传播MJPEG内容并启动wireshark / ethereal,看看你通过网络获得了什么。我的猜测是你错过了一些必需的HTTP标题,而firefox对此更加宽容。

如果您无法通过互联网找到样本MJPEG流,那么很多网络摄像头都会有软件为您提供MJPEG流。我使用的应用程序是多个安全摄像头的控制台,所以我知道这是所有类型的凸轮的常见实现(如果它们支持Web界面)。

答案 1 :(得分:1)

我远不是MJPEG流媒体的专家,但是在sourcefourge上查看mjpg-streamer的来源我认为你应该分别发送每个帧,在每个帧之前和之后写入边界。当然,您不应该在结束边界中写入内容类型。

答案 2 :(得分:0)

首先,将mjpeg帧写入单独的文件。然后,您应该能够在Phototshop中打开它们(这将独立验证您正在正确解析流)。如果失败,请注意您的图像数据中嵌入了HTTP标头。

答案 3 :(得分:0)

您是否看过网上存在的各种网络摄像头设置?他们中的很多人都做了某种低分辨率更新而没有闪烁。您应该能够对这些类型的站点进行反向工程,以获得有关问题的其他线索。

有些网站会创建一个GIF动画,也许这是一个选项,以便用户可以看到过去一分钟左右。

答案 4 :(得分:0)

关于您的编辑:Firefox和Safari支持MJPEG。但是其他应用程序不会像Explorer或Silverlight那样取决于你正在使用它做什么。