2008-10-19 42 views
25

我有图像从远程视频源发送到我的数据库,每秒约5帧作为JPEG图像。我想弄清楚如何将这些图像转换为视频格式,以便我可以将实时视频源传输到Silverlight。在C#中创建一个MJPEG视频流

创建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,媒体播放器 - 什么也没有。

+0

你有没有得到这个解决? – 2010-06-16 19:43:16

+0

不使用这种方法 - 我只是最终在浏览器中使用JS进行背景图像加载,然后以尽可能快的速度切换图像。工作好的。 – typemismatch 2010-06-20 03:47:21

回答

0

首先,将你的mjpeg帧写出来分开文件。然后,您应该能够在Phototshop中打开这些文件(这将独立验证您是否正确解析流)。如果失败,通过下注就是您的图像数据中嵌入了HTTP标头。

0

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

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

1

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

2

很久以前(3 - 4年前)我做了MJPEG,我正在试图记住细节,我根本做不到。但是,如果可能的话,我会建议找到某种能够传播MJPEG内容的网站,并启动wireshark/ethereal并查看你通过网络获得的内容。我的猜测是你错过了一些必要的HTTP头文件,firefox是一点宽容。

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

0

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