我正在开发一个简单的应用程序,它使用UDP Multicast将摄像机字节流发送到c#wpf应用程序。我能够使用UDP广播实现这一目标。
但我想要的是使用UDP多播连接它,但只有当我使用注册的多播IP(如“224.0.0.1”)时才能为我工作。
关于我的Android代码: 我已经为udp连接编写了一个服务,我可以从任何活动/片段调用它。本服务具有发送图像和文本的功能。
在Camera PreviewCallback上
private PreviewCallback previewCb = new PreviewCallback() {
public void onPreviewFrame(byte[] frame, Camera c) {
mService.initSocket();
mService.sendImages(frame);
c.addCallbackBuffer(frame);
}
};
相机设置:
Camera.Parameters p = camera_.getParameters();
p.setPreviewSize(procSize_.width, procSize_.height);
//p.setPreviewFormat(ImageFormat.NV21);
p.setPreviewFpsRange(targetMaxFrameRate, targetMinFrameRate);
camera_.setParameters(p);
PixelFormat pixelFormat = new PixelFormat();
PixelFormat.getPixelFormatInfo(ImageFormat.RGB_565, pixelFormat);
int bufSize = procSize_.width * procSize_.height * pixelFormat.bitsPerPixel / 8;
byte[] buffer = null;
for(int i = 0; i < bufNumber; i++) {
buffer = new byte[ bufSize ];
camera_.addCallbackBuffer(buffer);
}
camera_.setPreviewCallbackWithBuffer(cb);
发送图片功能
while(bRunning) {
int sessionNumber = 0;
byte[] buff = msg;
int packets = (int) Math.ceil(buff.length / (float) DATAGRAM_MAX_SIZE);
for (int i = 0; i < packets; i++) {
DatagramPacket packet = new DatagramPacket(data, data.length, localaddress, 11000);
sessionNumber = sessionNumber < MAX_SESSION_NUMBER ? ++sessionNumber : 0;
if(sessionNumber == packets){
bRunning = false;
}
}
}
关于我的C#代码: 我创建了一个UDPMulticast监听器:
IPAddress multicastIP= IPAddress.Parse("224.0.0.1");
UdpClient udpClient = new UdpClient();
IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, port);
udpClient.MulticastLoopback = true;
udpClient.Client.Bind(remoteEndPoint);
udpClient.JoinMulticastGroup(multicastIP);
byte[] finalBuffer = new byte[80000];
while (true)
{
byte[] buffer = new byte[1048];
buffer = mUDPClient.Receive(ref ipEndPoint);
if (buffer[5].Equals(0))
{
MemoryStream stream = new MemoryStream(finalBuffer);
imgPreview.Source = GetImage(stream);
finalBuffer = new byte[25000];
Array.Copy(buffer, finalBuffer, buffer[4]);
}
else
{
Array.Copy(buffer, finalBuffer, buffer[4]);
}
}
public BitmapImage GetImage(Stream iconStream)
{
var imgbrush = new BitmapImage();
imgbrush.BeginInit();
imgbrush.StreamSource = iconStream;
imgbrush.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
imgbrush.EndInit();
var ib = new ImageBrush(imgbrush);
return imgbrush;
}
即使我连接了,我在imgbrosh.EndIt()收到一个错误,说图像格式不正确,因为即使我的第一张图片也没有被创建。
感谢任何帮助,谢谢。