【问题标题】:Download and play video with Handheld.PlayFullScreenMovie on Android in Unity在 Unity 中的 Android 上使用 Handheld.PlayFullScreenMovie 下载和播放视频
【发布时间】:2017-05-19 02:34:15
【问题描述】:

我正在开发一款使用 Unity 制作的 Android 游戏。您可以在游戏内下载视频,它们将存储在以下路径中:

Android/data/com.mycompany.mygame/files/Movies/myvideo.mp4

更准确的说,我是用下面的方式下载的:

FileStream stream = new FileStream (folder + "/" + fileName, FileMode.Create);
stream.Write(BytesDownload, 0, BytesDownload.Length); 

其中BytesDownload 是从UnityWebRequest 获得的。 folder + "/" + fileName 就是上面提到的路径。

我正在致电Handheld.PlayFullScreenMovie 阅读此视频:

Handheld.PlayFullScreenMovie(videoPath, Color.black, FullScreenMovieControlMode.Hidden);

在本例中,videoPath 采用值Movies/myvideo.mp4。但是,这不起作用(我的 Android 平板电脑上出现黑屏,而不是视频播放)。

我在文档中读到视频需要存储在 StreamingAssets 文件夹中,这确实在 Unity 编辑器中工作。但是由于Android上没有StreamingAssets文件夹,所以我尝试将视频放在上面提到的路径中。

如何下​​载视频并在 Android 上播放?

EDIT - 用于下载视频的代码:

webRequest = UnityWebRequest.Get(serverURL + "/" + serverFolder + "/" + fileName);
DownloadHandler receiveBundle = new DownloadHandlerBuffer();
webRequest.downloadHandler = receiveBundle;
webRequest.Send();

do {
    yield return null;
} while (!webRequest.downloadHandler.isDone);

byte[] BytesDownload = receiveBundle.data;
FileStream stream = new FileStream (folder + "/" + fileName, FileMode.Create);
stream.Write(BytesDownload, 0, BytesDownload.Length); 
stream.Close(); 

【问题讨论】:

  • 贴出你用来下载视频的代码
  • 我编辑了我的问题以包含代码。
  • 我留下了答案。检查一下。
  • 我今天检查一下,告诉你进展如何。

标签: c# android video unity3d


【解决方案1】:

您使用了UnityWebRequest 错误。如果您使用 new 关键字创建了 UnityWebRequest 的新实例,则只需创建 DownloadHandler 的新实例。

如果您使用 UnityWebRequest.GetUnityWebRequest.Post 等静态函数创建新的 UnityWebRequest 实例,则不必这样做。


为回答您的问题,以下是使用Handheld.PlayFullScreenMovie 下载和播放视频的步骤。

1.使用UnityWebRequest下载视频。

2.将视频字节从UnityWebRequest.downloadHandler.data保存到Application.persistentDataPath。你错过了Application.persistentDataPath 部分。

3.播放视频:

安卓:

使用Application.persistentDataPath/videoName.mp4 作为Handheld.PlayFullScreenMovie 函数的路径。

iOS:

使用"file://" + Application.persistentDataPath/videoName.mp4; 作为Handheld.PlayFullScreenMovie 函数的路径。

请注意,这在编辑器中不起作用。没关系。 Handheld.PlayFullScreenMovie 是为 Android 和 iOS 设计的,而不是为台式机设计的。 只需为 Android/iOS 构建它来测试它。

以下是完整的移动设备下载和播放示例:

用法

void Start()
{
    string url = "http://techslides.com/demos/sample-videos/small.mp4";

    StartCoroutine(downloadAndPlayVideo(url, "myvideo.mp4", true));
}

示例

//Downloads, Saves and Plays the Video
IEnumerator downloadAndPlayVideo(string videoUrl, string saveFileName, bool overwriteVideo)
{
    //Where to Save the Video
    string saveDir = Path.Combine(Application.persistentDataPath, saveFileName);

    //Play back Directory
    string playbackDir = saveDir;
#if UNITY_IPHONE
        playbackDir = "file://" + saveDir;
#endif

    bool downloadSuccess = false;
    byte[] vidData = null;

    /*Check if the video file exist before downloading it again. 
     Requires(using System.Linq)
    */
    string[] persistantData = Directory.GetFiles(Application.persistentDataPath);
    if (persistantData.Contains(playbackDir) && !overwriteVideo)
    {
        Debug.Log("Video already exist. Playing it now");
        //Play Video
        playVideo(playbackDir);
        //EXIT
        yield break;
    }
    else if (persistantData.Contains(playbackDir) && overwriteVideo)
    {
        Debug.Log("Video already exist [but] we are [Re-downloading] it");
        yield return downloadData(videoUrl, (status, dowloadData) =>
        {
            downloadSuccess = status;
            vidData = dowloadData;
        });
    }
    else
    {
        Debug.Log("Video Does not exist. Downloading video");
        yield return downloadData(videoUrl, (status, dowloadData) =>
        {
            downloadSuccess = status;
            vidData = dowloadData;
        });
    }

    //Save then Play if there was no download error
    if (downloadSuccess)
    {
        //Save Video
        saveVideoFile(saveDir, vidData);

        //Play Video
        playVideo(playbackDir);
    }
}

//Downloads the Video
IEnumerator downloadData(string videoUrl, Action<bool, byte[]> result)
{
    //Download Video
    UnityWebRequest webRequest = UnityWebRequest.Get(videoUrl);
    webRequest.Send();

    //Wait until download is done
    while (!webRequest.isDone)
    {
        Debug.Log("Downloading: " + webRequest.downloadProgress);
        yield return null;
    }

    //Exit if we encountered error
    if (webRequest.isError)
    {
        Debug.Log("Error while downloading Video: " + webRequest.error);
        yield break; //EXIT
    }

    Debug.Log("Video Downloaded");
    //Retrieve downloaded Data
    result(!webRequest.isError, webRequest.downloadHandler.data);
}

//Saves the video
bool saveVideoFile(string saveDir, byte[] vidData)
{
    try
    {
        FileStream stream = new FileStream(saveDir, FileMode.Create);
        stream.Write(vidData, 0, vidData.Length);
        stream.Close();
        Debug.Log("Video Downloaded to: " + saveDir.Replace("/", "\\"));
        return true;
    }
    catch (Exception e)
    {
        Debug.Log("Error while saving Video File: " + e.Message);
    }
    return false;
}

//Plays the video
void playVideo(string path)
{
    Handheld.PlayFullScreenMovie(path, Color.black,
        FullScreenMovieControlMode.Full, FullScreenMovieScalingMode.AspectFill);
}

此答案仅用于帮助使用 Unity 5.5 及以下版本的人。如果您使用上述任何内容,则有一个新的 API 可以播放视频,它适用于移动和台式计算机。您可以找到示例here

【讨论】:

    【解决方案2】:

    不要将视频放在您的路径上。

    StreamingAssets 是一个特殊的文件夹,不管是android平台还是ios,都必须放视频。其次,不需要给出流媒体资源的路径,它隐含地理解为引用路径是流媒体资源文件夹。所以将 myvideo.mp4 放在流媒体资源文件夹中并像这样使用它:

    Handheld.PlayFullScreenMovie("myvideo.mp4", Color.black, FullScreenMovieControlMode.Hidden);
    

    here。根据这个,你需要检查mp4是否真的有正确的配置、编解码器、分辨率等。

    我最好的猜测是你有一个错字。文件名和扩展名区分大小写!

    【讨论】:

    • 我没有错字,因为这是在编辑器中工作的。 Android 上的问题是我无法将文件下载到StreamingAssets 文件夹(或者如果可能,我不知道该怎么做)。来自docs.unity3d.com/ScriptReference/…Note that on some platforms it is not possible to directly access the StreamingAssets folder because there is no file system access in the web platforms, and because it is compressed into the .apk file on Android.
    • 下载是什么意思?您似乎已经在磁盘上有视频。只需将视频放在文件夹中即可。您的编辑器可以从您的计算机中检索路径,但不能从 android 中检索。
    • 似乎有些误会,我会编辑我的问题。
    • Handheld.PlayFullScreenMovie(urlToMp4, Color.black, FullScreenMovieControlMode.Hidden); ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    相关资源
    最近更新 更多