我将图像从远程视频源以大约每秒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 回答
我很久以前(3 - 4年前)做过MJPEG,我正在试图记住细节,但我根本无法做到 . 但是,如果它可能的话,我会建议找到某种网站来传播MJPEG内容并启动wireshark / ethereal,看看你通过网络获得了什么 . 我的猜测是你错过了一些必需的HTTP Headers ,firefox对此更加宽容 .
如果您无法通过互联网找到MJPEG示例流,那么很多网络摄像头都会提供可以为您提供MJPEG流的软件 . 我使用的应用程序是一个多个安全摄像头的控制台,所以我知道这是所有类型的凸轮的常见实现(如果他们支持Web界面) .
我不是MJPEG流媒体的专家,但是在sourcefourge上查看mjpg-streamer的来源我认为你应该分别发送每个帧,在每个帧之前和之后写边界 . 您当然不应该在结束边界中写入内容类型 .
首先,将mjpeg帧写入单独的文件 . 然后,您应该能够在Phototshop中打开它们(这将独立验证您正在正确解析流) . 如果失败,请注意您的图像数据中嵌入了HTTP标头 .
您是否看过网上存在的各种网络摄像头设置?他们中的很多人都做了某种低分辨率更新而没有闪烁 . 您应该能够对这些类型的站点进行反向工程,以获得有关问题的其他线索 .
有些网站会创建一个GIF动画,也许这是一个选项,以便用户可以看到过去一分钟左右 .
关于您的编辑:Firefox和Safari支持MJPEG . 但是,其他应用程序不会像Explorer或Silverlight那样取决于您正在使用它做什么 .