Я борюсь за большой проект, и мне нужна помощь.
Чтобы дать вам контекст.У меня есть видеопоток, поступающий в UWP (из DJI SDK), и я пытаюсь получить это видео в Unity.Я действительно много чего перепробовал (симуляция веб-камеры, NamedPipes, UDP), и в настоящее время я думаю, что лучшим решением является TCP.
Поэтому я построил TCP-сервер в своем UWP и пытаюсь отправить байт [] извидео для клиента TCP в Unity.
Но я не могу установить соединение между двумя приложениями.Через минуту я только что получил SocketException, говорящий о том, что сервер никогда не отвечает
Вот код UWP:
private Parser vp;
private const string PORT = "1337";
private StreamWriter TCP_client_stream = null;
public MainPage() {
this.InitializeComponent();
this.StartServer();
DJISDKManager.Instance.SDKRegistrationStateChanged += Instance_SDKRegistrationEvent;
DJISDKManager.Instance.RegisterApp("29f7d391513c4052daef008d");
}
//######### DJI #########
private async void Instance_SDKRegistrationEvent(SDKRegistrationState state, SDKError resultCode) {
if (resultCode == SDKError.NO_ERROR) {
System.Diagnostics.Debug.WriteLine("Register app successfully");
if (vp == null) {
vp = new Parser();
vp.Initialize(delegate (byte[] data) {
return DJISDKManager.Instance.VideoFeeder.ParseAssitantDecodingInfo(0, data);
});
vp.SetSurfaceAndVideoCallback(0, 0, null, ReceiveDeocodedData);
DJISDKManager.Instance.VideoFeeder.GetPrimaryVideoFeed(0).VideoDataUpdated += OnVideoPush;
}
//DJISDKManager.Instance.ComponentManager.GetFlightControllerHandler(0, 0).AttitudeChanged += OnAttitudUpdate;
DJISDKManager.Instance.ComponentManager.GetCameraHandler(0, 0).CameraTypeChanged += OnCameraTypeChanged;//On ajoute nos fonctions a ce qui se fait deja
var type = await DJISDKManager.Instance.ComponentManager.GetCameraHandler(0, 0).GetCameraTypeAsync();
OnCameraTypeChanged(this, type.value);
} else {
System.Diagnostics.Debug.WriteLine("Register SDK failed : ");
System.Diagnostics.Debug.WriteLine(resultCode.ToString());
}
}
//######### TCP #########
private void StartServer() {
try {
var streamSocketListener = new Windows.Networking.Sockets.StreamSocketListener();
streamSocketListener.ConnectionReceived += this.StreamSocketListener_ConnectionReceived;
streamSocketListener.BindServiceNameAsync(PORT);
System.Diagnostics.Debug.WriteLine("server is listening...");
} catch(Exception e) {
Windows.Networking.Sockets.SocketErrorStatus webErrorStatus = Windows.Networking.Sockets.SocketError.GetStatus(e.GetBaseException().HResult);
System.Diagnostics.Debug.WriteLine(webErrorStatus.ToString() != "Unknown" ? webErrorStatus.ToString() : e.Message);
}
}
//On va recylcer ca pour que ca devienne un outil pour fermer
private async void StreamSocketListener_ConnectionReceived(Windows.Networking.Sockets.StreamSocketListener sender, Windows.Networking.Sockets.StreamSocketListenerConnectionReceivedEventArgs args) {
string request;
using (var streamReader = new StreamReader(args.Socket.InputStream.AsStreamForRead())) {
request = await streamReader.ReadLineAsync();
}
await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => System.Diagnostics.Debug.WriteLine(string.Format("server received the request: \"{0}\"", request)));
// Echo the request back as the response.
TCP_client_stream = new StreamWriter(args.Socket.OutputStream.AsStreamForWrite());
System.Diagnostics.Debug.WriteLine("TCP connected");
using (Stream outputStream = args.Socket.OutputStream.AsStreamForWrite()) {
using (var streamWriter = new StreamWriter(outputStream)) {
await streamWriter.WriteLineAsync(request);
await streamWriter.FlushAsync();
}
}
await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => System.Diagnostics.Debug.WriteLine(string.Format("server sent back the response: \"{0}\"", request)));
sender.Dispose();
await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => System.Diagnostics.Debug.WriteLine("server closed its socket"));
}
Кажется, ошибка происходит от vp.SetSurfaceAndVideoCallback (0, 0, null, ReceiveDeocodedData);потому что когда я его удаляю, это работает
Я пытался вызвать это у диспетчера, но ничего не изменилось
Код единства:
void Start() {
ConnectToTcpServer();
SendMessage();
}
void Update() {
}
private void ConnectToTcpServer() {
try {
Debug.Log("Start thread");
clientReceiveThread = new Thread(new ThreadStart(ListenForData));
clientReceiveThread.IsBackground = true;
clientReceiveThread.Start();
} catch (Exception e) {
Debug.Log("On client connect exception " + e);
}
}
private void ListenForData() {
try {
Debug.Log("Try to connect");
socketConnection = new TcpClient("192.168.1.27", PORT);
Debug.Log("Connected");
Byte[] bytes = new Byte[videoFrameSize];
while (true) {
// Get a stream object for reading
using (NetworkStream stream = socketConnection.GetStream()) {
int length;
// Read incomming stream into byte arrary.
while ((length = stream.Read(bytes, 0, bytes.Length)) != 0) {
//
}
}
}
} catch (SocketException socketException) {
Debug.Log("Socket exception: " + socketException);
}
}
Если у вас есть идеяРешите тот или иной подход, чтобы отправить это видео, было бы очень мило с вашей стороны.Я схожу с ума от этой проблемы