Загрузить видеофайл с Unity на Python - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь загрузить видеофайл с клиента Unity на сервер python, но когда я пытаюсь это сделать, файл, который я получаю на сервере, не является допустимым видеофайлом. Возможно, проблема в том, что в Unity и Python я пытаюсь использовать разные кодировки, но на самом деле я не знаю.

Это мой код в Unity:

IEnumerator StartUploadCoroutine()
{
    // Show a load file dialog and wait for a response from user
    yield return FileBrowser.WaitForLoadDialog(false, null, "Load File", "Load");

    isOpen = false;
    // Upload File to movie server
    if (FileBrowser.Success)
    {
        StreamReader reader = new StreamReader(FileBrowser.Result);
        StartCoroutine(UploadCoroutine(reader)); // upload file to server;
    }
}

/* Upload the chosen video file to the movie server */
IEnumerator UploadCoroutine(StreamReader reader)
{
    UnityWebRequest www = UnityWebRequest.Post(videoPlayerManager.GetServerIp() + ":" + port.ToString(), reader.ReadToEnd());
    yield return www.SendWebRequest();

    if (www.isNetworkError || www.isHttpError)
    {
        Debug.Log(www.error);
    }
    else
    {
        Debug.Log("Form upload complete!");
    }
}

А это мой Python код:

from http.server import BaseHTTPRequestHandler, HTTPServer

class HandleRequests(BaseHTTPRequestHandler):

    def do_POST(self):
        '''Reads post request body'''
        content_length = int(self.headers['Content-Length'])
        body = self.rfile.read(content_length)
        self.send_response(200)
        self.end_headers()
        outF = open("myOutFile.mp4", "wb")
        outF.write(body)


host = "127.0.0.1"
port = 9999

HTTPServer((host, port), HandleRequests).serve_forever()



РЕДАКТИРОВАТЬ:

Моя проблема отправлял файл из Unity в виде строки вместо массива байтов. Я изменил свой python код на Flask сервер, чтобы я мог легко получить файл из почтового запроса.

Окончательный код:

Это мой код в Unity :

IEnumerator StartUploadCoroutine()
{
    // Show a load file dialog and wait for a response from user
    yield return FileBrowser.WaitForLoadDialog(false, null, "Load File", "Load");

    isOpen = false;
    // Upload File to movie server
    if (FileBrowser.Success)
    {
        StartCoroutine(UploadCoroutine(FileBrowser.Result)); // upload file to server;
    }
}

/* Upload the chosen video file to the movie server */
IEnumerator UploadCoroutine(string filePath)
{
    WWWForm form = new WWWForm();
    form.AddBinaryData("vidFile", File.ReadAllBytes(filePath));
    UnityWebRequest www = UnityWebRequest.Post(videoPlayerManager.GetServerUrl(), form);
    yield return www.SendWebRequest();

    if (www.isNetworkError || www.isHttpError)
    {
        Debug.Log(www.error);
    }
    else
    {
        Debug.Log("Form upload complete!");
    }
}

А это мой Python код:

import os
from flask import Flask, request, send_from_directory
from gevent.pywsgi import WSGIServer

IP = "127.0.0.1"
PORT = 9999

# set the project root directory as the static folder
app = Flask(__name__)

@app.route('/', methods=['POST'])
def DownloadFile():
    # request.form to get form parameter
    vidFile = request.files["vidFile"].read()
    outF = open("myOutFile.mp4", "wb")
    outF.write(vidFile)

    return ''

if __name__ == "__main__":
    http_server = WSGIServer((IP, PORT), app)
    http_server.serve_forever()

1 Ответ

1 голос
/ 17 апреля 2020

Я думаю, что при загрузке файла (с любым расширением) на сервер кодировки не важны.

Ищите две вещи:

  1. Убедитесь, что ваш локальный видеофайл и загружен видеофайлы имеют одинаковый размер. если они не совпадают, это означает, что у вас есть проблема с загрузкой прогресса. ( Проверьте здесь )
  2. Вы используете метод POST для загрузки видео. Это означает, что весь файл будет загружен на ваш сервер, и тогда ваш скрипт python сможет использовать его в переменной body. Если размер файла совпадает, я могу предложить вам использовать фреймворк, такой как Flask в качестве сценария python на стороне сервера.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...