C# 在c中创建MJPEG视频流#
我有图像从远程视频源以大约每秒5帧的速度作为JPEG图像发送到我的数据库。我正试图找出如何将这些图像转换成视频格式,以便将实时视频流传送到Silverlight 创建一个MJPEG流似乎是有道理的,但我有一些问题。首先,我试图通过HTTP请求进行流传输,所以我没有处理套接字,但这可能破坏了我的代码 如果我尝试从QT浏览我的流,我会收到一个视频错误,Media player显示第一帧图像,Silverlight崩溃:) 以下是流式传输的代码——因为我知道这种方式使用的内容类型不理想,可能是根本原因,所以只能在这种情况下发送。所有图像都是通过LINQ2SQL对象输入的 我已经尝试过在Silverlight中简单地更新图像控件的图像源,但是闪烁是不可接受的。如果Silverlight不支持MJPEG,那么即使继续也没有意义,但它看起来确实支持。我确实可以访问即将到来的h.264帧,但通过MP4这似乎更复杂C# 在c中创建MJPEG视频流#,c#,video,video-streaming,mjpeg,C#,Video,Video Streaming,Mjpeg,我有图像从远程视频源以大约每秒5帧的速度作为JPEG图像发送到我的数据库。我正试图找出如何将这些图像转换成视频格式,以便将实时视频流传送到Silverlight 创建一个MJPEG流似乎是有道理的,但我有一些问题。首先,我试图通过HTTP请求进行流传输,所以我没有处理套接字,但这可能破坏了我的代码 如果我尝试从QT浏览我的流,我会收到一个视频错误,Media player显示第一帧图像,Silverlight崩溃:) 以下是流式传输的代码——因为我知道这种方式使用的内容类型不理想,可能是根本原因
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、媒体播放器-什么都没有。首先,将mjpeg帧写入单独的文件。然后,您应该能够在Phototshop中打开这些文件(这将独立验证您是否正确解析流)。如果失败,可以打赌的是,您的图像数据中嵌入了HTTP头。您看过网络上存在的各种网络摄像头设置吗?他们中的很多人都会在不闪烁的情况下进行某种低分辨率的更新。您应该能够对这些类型的站点进行反向工程,以获得问题的其他线索
一些网站创建GIF动画,也许这是一个选项,用户可以看到过去的一分钟左右。我远不是MJPEG流媒体方面的专家,但看看OnSourceFourge的源代码,我认为你应该分别发送每一帧,在每一帧之前和之后写下边界。当然,您不应该在结束边界中写入内容类型。我很久以前(3-4年前)就写过MJPEG了,我正在挠头试图记住细节,但我就是记不住。但是,如果可能的话,我会建议你找一个能流式传输MJPEG内容的网站,启动wireshark/ethereal,看看你能从中得到什么。我猜您缺少了一些firefox更能原谅的必要HTTP头
如果你在互联网上找不到MJPEG流的样本,很多网络摄像头都有软件可以提供MJPEG流。我使用的应用程序是一个用于多个安全摄像头的控制台,因此我知道这是所有类型摄像头的常见实现(如果它们支持web界面)。关于编辑:Firefox和Safari支持MJPEG。但是,其他应用程序不支持,像Explorer或Silverlight,这取决于你用它做什么。是的,我已经这样做了-图像可以独立于视频用于其他事情,因此我可以查看它们,它们看起来很好。这是否意味着你已经在程序处理完帧后查看了它们?是的,我也在Firefox中使用它,我可以看到完美的视频但是,是的,我也将图像作为单个jpg文件写入磁盘,它们很好。你解决过这个问题吗?没有使用这种方法-我只是在浏览器中使用JS加载背景图像,然后在图像到达后尽快将其切换出去。工作正常。你基本上掌握了基础知识,这里有一个实现@