我尝试使用.NET / C#将我的实时网络摄像头视频通过以太网传输到我网络中的其他计算机。
为了显示网络摄像头视频,我使用了AForge.Controls.VideoSourcePlayer。
对于流式传输,我在服务器端使用以下简化代码:
private void OnTcpClientConnected(TcpClient tcpClient)
{
using (tcpClient)
{
using (NetworkStream stream = tcpClient.GetStream())
{
BinaryFormatter formatter = new BinaryFormatter();
while ( isTcpServerRunning )
{
Bitmap frame = videoSourcePlayer.GetCurrentVideoFrame();
formatter.Serialize(stream, frame );
}
}
}
}
为了阅读流,我在客户端使用以下简化代码:
using( TcpClient client = new TcpClient() )
{
client.Connect( ipAddress, port );
using( NetworkStream stream = client.GetStream() )
{
BinaryFormatter formatter = new BinaryFormatter();
while( isConnected )
{
DisplayPicture((Bitmap) formatter.Deserialize(stream));
}
}
}
嗯,到目前为止,它运作良好,运行顺畅。
现在我有一些问题:
我应该使用UdpClient或TcpClient进行视频流吗?如果是Udp,如何获得Networkstream? (对于TcpClient,它的GetStream()方法。)
AForge提供的单个网络摄像头框架(位图)的分辨率为640x480,大约为540KB。这意味着帧速率20fps在一秒钟内通过网络传输~10,5MB,这对我来说似乎非常重要。如何缩小图像大小或压缩传输的数据?
一般来说:是否有更好的方式来播放视频"通过网络?是否有最佳实践或良好的图书馆?
提前致谢。
答案 0 :(得分:1)
显然流式jpegs比流式位图更轻 在通过线路发送位图之前将位图压缩为jpeg是有意义的 这解决了所有问题。不要强迫自己进入udp或tcp。
AForge还提供了一种通过HTTP传输jpegs的方法。看看MJPEG here