在c#中创建MJPEG视频流

本文关键字:视频 MJPEG 创建 | 更新日期: 2023-09-27 17:47:49

我有一些图像从远程视频源以每秒5帧左右的JPEG图像的速度发送到我的数据库。我正试图弄清楚如何将这些图像转换为视频格式,以便将实时视频流传输到Silverlight。

创建MJPEG流似乎是有意义的,但我遇到了一些问题。首先,我试图通过HTTP请求进行流式传输,所以我没有处理套接字,但这可能会破坏我的代码。

如果我尝试从QT浏览我的流,我会收到一个视频错误,Media player会显示第一帧图像,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,媒体播放器-什么都没有。

在c#中创建MJPEG视频流

我很久以前(3-4年前)做过MJPEG,我一直在挠头,试图记住细节,但我就是记不住。但是,如果可能的话,我建议找一个网站来播放MJPEG的内容,并启动wireshark/ethereal,看看你能从网络上得到什么。我的猜测是,您缺少了一些firefox稍微宽容一点的必需HTTP标头。

如果你在互联网上找不到MJPEG流的样本,很多网络摄像头都有软件可以为你提供MJPEG流。我使用的应用程序是一个用于多个安全摄像头的控制台,所以我知道这是所有类型摄像头的常见实现(如果它们支持web界面的话)。

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

首先,将mjpeg帧写入单独的文件。然后,您应该能够在Phototshop中打开这些文件(这将独立验证您是否正确解析了流)。如果失败,那么您的图像数据中一定嵌入了HTTP头。

你看过网络上存在的各种网络摄像头设置吗?他们中的许多人在没有闪烁的情况下进行某种低分辨率的更新。你应该能够对这些类型的网站进行逆向工程,为你的问题提供更多线索。

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

关于您的编辑:Firefox和Safari支持MJPEG。然而,其他应用程序则不然,比如Explorer或Silverlight,这取决于您使用它的操作。