- Home /
How to send an Image(Texture2D) through the network using NetworkTransport?
Hi guys
I'm trying to make a simple client app which streams a video to the server by taking screenshots on the client, encoding each screenshot to JPG data (texture.EncodeToJPG(8)) and sending the byte[] data to the server via NetworkTransport.Send(). I manage to receive the byte[] data on the server, However, when I'm trying to decode it back to a Texture2D with texture2D.LoadImage() and trying to display it I get only a red question mark... The same decoding method works fine when I'm testing it on the client with the same byte[] data So I guess something happening to the data during the transmitting.
Here are the relevant functions:
//On the client:
public IEnumerator StartVideo(){
cameraTexture = new WebCamTexture ();
cameraRawImage.texture = cameraTexture;
cameraTexture.Play ();
screenTexture = new Texture2D (Screen.width, Screen.height, TextureFormat.RGB24, true);
yield return waitEndFrame;
screenTexture.ReadPixels (new Rect(0, 0, Screen.width, Screen.height), 0, 0);
screenTexture.Apply ();
// Encode:
cameraData = screenTexture.EncodeToJPG(8);
NetworkTransport.Send (networkManager.hostId, networkManager.connectionId, networkManager.myVideoChannelId, cameraData , cameraData.Length , out error);
}
And on the server side:
void Update () {
if (serverStarted) {
int recHostId;
int connectionId;
int channelId;
byte[] recBuffer = new byte[1024];
int bufferSize = 1024;
int dataSize;
byte error;
NetworkEventType recData = NetworkTransport.Receive (out recHostId, out connectionId, out channelId, recBuffer, bufferSize, out dataSize, out error);
switch (recData) {
case NetworkEventType.ConnectEvent:
Debug.Log ("Server Receive - Player " + connectionId + " has connected");
OnClientConnected (connectionId);
break;
case NetworkEventType.DataEvent:
try{ // Not image
string msg = Encoding.Unicode.GetString (recBuffer, 0, dataSize);
string[] splitedMsg = msg.Split ('|');
switch (splitedMsg [0]) {
case "NAMEIS":
Debug.Log ("NAMEIS dataSize = " + dataSize + "!!! - recBuffer.length = " + recBuffer.Length);
GetClientName (connectionId, splitedMsg [1]);
break;
default:
Debug.Log ("Server Invalid message: " + msg);
UIDebugLog.VisableLog ("Server Invalid message: " + msg);
break;
}
}
catch{ // Image
DisplayImage (recBuffer);
}
break;
case NetworkEventType.DisconnectEvent: //4
Debug.Log ("Server Receive - Player " + connectionId + " has disconnected");
break;
}
}
}
void DisplayImage(byte[] imageData){
resultTexture.LoadImage (imageData);
resultTexture.Apply ();
serverRawImage.texture = resultTexture;
}
Any help will be appreciated!
If anyone knows a better way for streaming Video/Images through a local network it'll be appreciated to :)
Thanks
Your answer
![](https://koobas.hobune.stream/wayback/20220612134837im_/https://answers.unity.com/themes/thub/images/avi.jpg)