Silverlight+WCF 实战-网络象棋最终篇之对战视频-上篇[客户端开启视频/注册编号/接收视频](五)...
前言:
是一些代码修改,会比较枯燥,所以没接着写,不过有昨天有网页表示对象棋在线演示中的 对战视频 感兴趣,希望可以提前看到代码,所以本次就提前写里面的对战视频这一块。
由于对战视频采用控制台程序,并没有在服务器运行,所以在线演示版本里一进入显示是显示“未链接”的提示。
一:对战视频 简单原理:
2:视频的传输是图片字节,因此压缩图片是相当必要的。
3:中间的服务选什么?一开始我是在尝试使用WCF的tcp方式,后来折腾配置文件太痛苦,直接转使用Socket通讯,一来有性能优势,二来减少折腾。
二:对战视频 步骤解析:
2:客户端向远端Socket注册[按规则定好的]编号[服务端根据编号查要转发的对象]
3:服务端接收编号并注册,收集一系列编号列表。
4:客户端发送视频
5:服务端接收视频,并根据规则查找另一个编号,将视频字节转发
6:另一个客户端接收视频并显示
三:对战视频 具体实施
1:如何打开视频
代码如下:
{
VideoCaptureDevice device = CaptureDeviceConfiguration.GetDefaultVideoCaptureDevice();//获取系统默认视频设备
if (device == null)
{
MessageBox.Show("没有检测到设备!");
return;
}
if (CaptureDeviceConfiguration.RequestDeviceAccess())//请求设备
{
CaptureSource source = new CaptureSource()//数据源
{
VideoCaptureDevice = device//设置属性,将数据源绑定到视频
};
VideoBrush brush = new VideoBrush();//视频刷子
brush.SetSource(source);//视频刷子从视频源获取视频
source.Start();
myVideo.Fill = brush;//最后填充Rectangle [myVideo只是一个普通Rectangle]
}
}
界面Rectangle代码:
<Rectangle Height="160" Name="myVideo" Stroke="Black" StrokeThickness="1" Width="160" Canvas.Left="0" Canvas.Top="0" />
</Canvas>
运行后我们看下效果,[这里用了本地的虚拟视频,开了3个浏览器并排截了图,第4张是不一样的哦],中间提示确认是否打开视频就不截图了:
2:Silverlight如何使用Socket进行通讯
下面进行代码解析:以下代码将一步扣一步,具体的连环扣如下:建立链接-》注册编号-》开新线程待接收视频-》收到视频处理显示。
2.1:与远程建立链接:
private void btnSocketConn_Click(object sender, RoutedEventArgs e)
{
if (videoSocket == null)//实例化Socket
{
videoSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
SocketAsyncEventArgs socketEvent=new SocketAsyncEventArgs()//通讯参数
{
RemoteEndPoint=new IPEndPoint(IPAddress.Parse("192.168.0.48"),4505),//设置连接的IP与端口
};
socketEvent.Completed += new EventHandler<SocketAsyncEventArgs>(socketEvent_Completed);
videoSocket.ConnectAsync(socketEvent);//异步链接到远程
}
void socketEvent_Completed(object sender, SocketAsyncEventArgs e)//链接完成后
{
//这里要写点什么呢?
}
2.2:注册编号[这里的规则是“房间号+棋手颜色值”]
{
if (e.SocketError == SocketError.Success)
{
byte[] buffer = System.Text.Encoding.UTF8.GetBytes("11");//我的编号,11=1房间+红色玩家1,对应的就是12=1房间+黑色玩家2
SocketAsyncEventArgs dataEvent = new SocketAsyncEventArgs();
dataEvent.SetBuffer(buffer, 0, buffer.Length);
dataEvent.Completed += new EventHandler<SocketAsyncEventArgs>(dataEvent_Completed);
videoSocket.SendAsync(dataEvent);//发送号码到服务端注册
}
}
void dataEvent_Completed(object sender, SocketAsyncEventArgs e)
{
//号码发送过去了,接下这里干点什么呢?
}
2.3:开新线程,等待接收对方视频
{
System.Threading.Thread thread = new System.Threading.Thread(new System.Threading.ThreadStart(Receive));//开启线程
thread.Start();
}
void Receive()//接收视频处理
{
byte[] buffer = new byte[1024 * 1024];
while (true)
{
SocketAsyncEventArgs receiveEvent = new SocketAsyncEventArgs();
receiveEvent.SetBuffer(buffer, 0, buffer.Length);
receiveEvent.Completed += new EventHandler<SocketAsyncEventArgs>(receiveEvent_Completed);
videoSocket.ReceiveAsync(receiveEvent);
System.Threading.Thread.Sleep(50);//小小休眠一下,不要干活太累
}
}
void receiveEvent_Completed(object sender, SocketAsyncEventArgs e)
{
//如果收到视频,我们要怎么处理呢?
}
2.4:将视频显示出来,需要用主线程来操作
void receiveEvent_Completed(object sender, SocketAsyncEventArgs e)
{
byte[] data=e.Buffer;
if (data[0]>0)
{
syn.Post(SetVideo, data);//由于新线程无法对控件进行操作,需要主线程来调用
}
}
void SetVideo(object data)//设置视频
{
MemoryStream stream=null;
WriteableBitmap img=null;
try
{
stream = new MemoryStream(data as byte[]);
img = new WriteableBitmap(160, 160);
img.SetSource(stream);
imgVideo.Source = img;//直接赋下值,就设置好了。
}
catch
{
return;
}
finally
{
if (stream != null)
{
stream.Close();
}
if (img != null)
{
img = null;
}
}
}
上面的imgVideo为:
下面再顺路看一下开启的服务端中转Socket的运行:
OK,本节就先到此,下节我们再讲“视频图片的压缩与发送”+服务端处理中转流程
最后:谢谢大家对本系列的喜欢,谢谢支持~
PS:传说点一下推荐会有10个园豆,喜欢麻烦点一下“推荐”,thank you very much!!
转载于:https://www.cnblogs.com/cyq1162/archive/2010/12/01/1893583.html
Silverlight+WCF 实战-网络象棋最终篇之对战视频-上篇[客户端开启视频/注册编号/接收视频](五)...相关推荐
- Silverlight+WCF 实战-网络象棋最终篇之对战视频-下篇[客户端发送与服务端中转](六)...
本篇继上一篇:Silverlight+WCF 实战-网络象棋最终篇之对战视频-上篇[客户端开启视频/注册编号/接收视频](五) 一:对战视频 简单原理 略,内容见上篇. 二:对战视频 步骤解析: 略 ...
- Silverlight+WCF 实战-网络象棋最终篇之非线程阻塞倒计时窗口(四)
前言: 在前面的系列中,我们虽然完成了其大部分功能,但是,离正真运行,还是有一大段距离 当你F5运行时,在弹出对话框之后,如果你不即时点确定,或者上个WC回来之后,你会发现已经提示出错了 这节开始,我 ...
- Silverlight+WCF 实战-网络象棋最终篇之解决重复的消息提示(八)
前言: 最近有网友经常会问,在跟着做象棋对战的通讯中,在重复退出进入的时候,消息会重复出现,本节就这问题进行解说与优化. 一:分析问题产生的原因? 1:首先看App.xaml,里面定义了一个全局客户端 ...
- Silverlight+WCF 新手实例 象棋 主界面-事件区-求和认输(三十二)
在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 事隔几篇,我们又回到事件区,继续其它两个按钮事件,来张图吧: 在Silverlight+WCF 新手实例 象棋 主界面-事件区- ...
- Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放-结局(四十)
在线演示地址: Silverlight+WCF 新手实例 象棋 在线演示 在Silverlight+WCF 新手实例 象棋 主界面-棋谱-回放(三十九)中,我们实现了用户的棋谱回放,在文章的下面,我们 ...
- Silverlight+WCF 新手实例 象棋 主界面-棋谱-获取列表(三十八)
2019独角兽企业重金招聘Python工程师标准>>> 在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 在Silverlight+WCF 新手实例 象棋 主界 ...
- Silverlight+WCF 新手实例 象棋 主界面-实时聊天区(二十五)
在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 演示已更新到此节介绍:Silverlight+WCF 新手实例 象棋 介绍III(二十三) 本节连着Silverlight+WC ...
- Silverlight+WCF 新手实例 象棋 该谁下棋-B下A停(三十)
2019独角兽企业重金招聘Python工程师标准>>> 在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 上上一节,就是二十八节:Silverlight+WCF ...
- Silverlight+WCF 新手实例 象棋 主界面-事件区-返回退出(三十三)
在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 还是那张图: 本节实现返回大厅和退出系统: 一:返回大厅,其实很简单的说,就是转向房间列表了. 可是,转向前也有很多事情要处理的 ...
最新文章
- 前端要懂mysql_【灵魂拷问】你真的懂得Mysql的管理和使用吗?
- Django DTL模板语法中的循环
- [Java基础]Lambda表达式的格式与使用前提
- 752. Open the Lock
- 【2019牛客暑期多校训练营(第三场)- A】Graph Games(思维,对边分块)
- cad转shp格式带属性_Excel、Word、PPT、CAD办公格式怎么转?方法汇总,可批量
- OpenGL基础54:点光源阴影
- verilog 中if....else语句以及case语句详细理解
- java core 之 IO流
- 20180810 突然发现自己不小心跑到了数据分析呈现岗位
- 热烈庆贺本博客9级及排名138
- 老韩思考:一个卖豆腐的能转行IT吗? 你的卖点在哪里?
- java pdfreader 用法_使用 iText 进行 Acroform 编辑的 Pdf
- USB3.0 HUB方案之GL3520
- 字符串统计(2017)
- 工业相机和镜头选型技巧
- android kitkat(4.4以上)各个版本的特性解析
- Eplan-中断点(3)
- Hbase的安装与shell操作介绍
- 夏季晒黑如何变白?店湾妹教你几招,皮肤回归白嫩