0

我正在尝试从我的“Json”文件中获取视频,我将其上传到 azure 服务器上的统一原始图像组件,但看起来像这样: 在此处输入图像描述

要获得一张效果很好的图片,但对于视频 mp4 却不行,这是代码:

using UnityEngine ;
using UnityEngine.Networking ;
using UnityEngine.UI ;
using System.Collections ;

// Json data format
/*
      {
        "Name"     : "..." ,
        "VideoURL" : "..."
      }
*/
public struct Data {
   public string Name ;
   public string VideoURL ;
}

public class Demo : MonoBehaviour {
   [SerializeField] Text uiNameText ;
   [SerializeField] RawImage uiRawImage ;

   string jsonURL = "https://myserver..." ;

   void Start () {
      StartCoroutine (GetData (jsonURL)) ;
   }

   IEnumerator GetData (string url) {
      UnityWebRequest request = UnityWebRequest.Get (url) ;

      yield return request.SendWebRequest() ;

      if (request.isNetworkError || request.isHttpError) {
         // error ...

      } else {
         // success...
         Data data = JsonUtility.FromJson<Data> (request.downloadHandler.text) ;

         // print data in UI
         uiNameText.text = data.Name ;

         // Load video:
         StartCoroutine (GetVideo (data.VideoURL)) ;
      }
      
      // Clean up any resources it is using.
      request.Dispose () ;
   }

   IEnumerator GetVideo (string url) {
      UnityWebRequest request = UnityWebRequest.GetTexture (url) ;

      yield return request.SendWebRequest() ;

      if (request.isNetworkError || request.isHttpError) {
         // error ...

      } else {
         //success...
         uiRawImage.texture = ((DownloadHandlerTexture)request.downloadHandler).texture ;
      }

      // Clean up any resources it is using.
      request.Dispose () ;
   }

}

所以这段代码很好地将图像加载到我的统一中,但对于视频却没有,我试图获得统一支持但同样内容的所有类型的视频。因此,在原始图像组件中,我添加了视频播放器组件,我为其添加了渲染纹理,并为原始图像添加了相同的东西。我的统一版本是 2019.4.26f1。可能是因为统一的版本?我希望有人能真正帮助我。

4

1 回答 1

0

那么原因很简单:

  • 图像 == 纹理 -> 是的
  • 视频 == 纹理 ->不!

您不能直接将视频分配给RawImage用于Texture

您也不能UnityWebRequest.GetTexture首先使用下载视频。

顺便说一句,API 来自 Unity 5.6 .. 这是几年前的事了,我强烈建议您将项目移植到最新版本。

如果您真的按照您所说的那样使用 Unity 2019.4,那么它会UnityWevRequestTexture.GetTexture改为使用 Unity 2019.4。


你基本上说你自己必须做什么:

您已经可以在编辑模式下执行这些步骤。您也可以在启动时执行一次,例如

[SerializeField] private VideoPlayer _videoPlayer;
[SerializeField] private RenderTexture _renderTexture;
[SerializeField] private RawImage _rawImage;

private void Awake ()
{
    _rawImage.texture = _renderTexture;
    _videoPlayer.targetTexture = _renderTexture;
}

然后在运行时

所以在运行时做例如

// Yes, if you make Start return IEnumerator then Unity automatically runs it as a Coroutine
IEnumerator Start () 
{
    // Use "using" instead of manually calling "Dispose"
    using(var request = UnityWebRequest.Get(jsonUrl))
    {
        yield return request.SendWebRequest();

        if (request.isNetworkError || request.isHttpError)
        {
            // error ...
        } 
        else
        {
            // success...
            Data data = JsonUtility.FromJson<Data> (request.downloadHandler.text);

            // print data in UI
            uiNameText.text = data.Name ;

            // The video player will take care of loading the video clip all by itself!
            videoPlayer.url = data.VideoURL;
            videoPlayer.Play();
        }
    }
}
于 2021-05-19T14:13:58.620 回答