背景
我编写的代码记录了来自网络摄像头的视频片段,将它们写入内存流,然后通过Socket连接传输数据,然后将其重新组合成视频并在媒体元素上播放.
最终目标是创建一个婴儿监视器系统,服务器/摄像头运行在Windows IOT Raspberry Pi上,以及我的女朋友和我可以在我们的手机或笔记本电脑上查看的UWP应用程序.除了从房子的另一部分观看摄像机外,我们还能够在我们其中一个人离家时登录,并且我还会及时连接PIR运动传感器和警报系统,但首先是第一.
整个系统工作得相当好,视频中有5秒的延迟,这是我可以接受的(现在),并且使用MediaPlaybackList,视频以相当恒定的速率无缝流式传输(尽可能无缝连接)现在)视频之间的转换.MediaPlaybackList在播放时删除项目,使内存占用保持相对恒定.
问题
当视频在客户端播放时,它会频繁出现但是随机的部分是破碎的图片.它没有任何模式,也不是我能找到的模式,我能描述的唯一方法是将图片的一部分水平分割成两半,两半交换,图片的右侧显示在左边,反之亦然.它就像一个闪烁,因为在破碎的位中只显示了几分之一秒,因为另一个在图片的其他地方出现了大约一秒左右.
这是一个例子:
1)在我开始使用MediaPlaybackList排队数据流之前,我使用的方法是从传入的套接字流中提取每个视频,将其作为StorageFile保存到本地磁盘,然后排队这些StorageFiles,按顺序播放它们然后删除它们(我仍然有源代码控制中的这个代码的版本,我可以挖掘出来,但我不喜欢创建和销毁StorageFiles的想法,因为它看起来非常低效).然而,使用这种方法并没有导致我现在看到的破碎的图片...这让我相信视频本身很好,并且这可能是它被重新组合并流式传输的方式的问题媒体元素?
2)我的女朋友的猫把网络摄像头(微软Lifecam HD-3000)撞到了一边,没有我意识到,我没有意识到,直到我运行服务器并注意到图片是90度角...有趣(和这令人费解的是,传递给客户的图片没有像我上面描述的那样分解.我能看到的唯一不同之处在于图片的尺寸是480 x 640(来自相机坐在它的侧面),而不是标准的640 x 480.这意味着什么,我不确定......
关于这个问题的想法
资源
这里有一些我认为可能相关的代码片段,完整的解决方案源可以在GitHub上找到,这里是: Video Socket Server .
服务器
while (true)
{
try
{
//record a 5 second video to stream
Debug.WriteLine($"Recording started");
var memoryStream = new InMemoryRandomAccessStream();
await _mediaCap.StartRecordToStreamAsync(MediaEncodingProfile.CreateMp4(VideoEncodingQuality.Vga), memoryStream);
await Task.Delay(TimeSpan.FromSeconds(5));
await _mediaCap.StopRecordAsync();
Debug.WriteLine($"Recording finished, {memoryStream.Size} bytes");
//create a CurrentVideo object to hold stream data and give it a unique id
//which the client app can use …Run Code Online (Sandbox Code Playgroud)