使用新的 Unity VideoPlayer 和 VideoClip API 播放视频

2023-11-23

电影纹理Unity 5.6.0b1 发布后最终被弃用,现在发布了在桌面和移动设备上播放视频的新 API。

视频播放器 and 录像片段如果需要,可用于播放视频并检索每帧的纹理。

我已经设法使视频正常工作,但无法从 Windows 10 上的编辑器中播放音频。有人知道为什么音频无法播放吗?

//Raw Image to Show Video Images [Assign from the Editor]
public RawImage image;
//Video To Play [Assign from the Editor]
public VideoClip videoToPlay;

private VideoPlayer videoPlayer;
private VideoSource videoSource;

//Audio
private AudioSource audioSource;

// Use this for initialization
void Start()
{
    Application.runInBackground = true;
    StartCoroutine(playVideo());
}

IEnumerator playVideo()
{
    //Add VideoPlayer to the GameObject
    videoPlayer = gameObject.AddComponent<VideoPlayer>();

    //Add AudioSource
    audioSource = gameObject.AddComponent<AudioSource>();

    //Disable Play on Awake for both Video and Audio
    videoPlayer.playOnAwake = false;
    audioSource.playOnAwake = false;

    //We want to play from video clip not from url
    videoPlayer.source = VideoSource.VideoClip;

    //Set video To Play then prepare Audio to prevent Buffering
    videoPlayer.clip = videoToPlay;
    videoPlayer.Prepare();

    //Wait until video is prepared
    while (!videoPlayer.isPrepared)
    {
        Debug.Log("Preparing Video");
        yield return null;
    }

    Debug.Log("Done Preparing Video");

    //Set Audio Output to AudioSource
    videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;

    //Assign the Audio from Video to AudioSource to be played
    videoPlayer.EnableAudioTrack(0, true);
    videoPlayer.SetTargetAudioSource(0, audioSource);

    //Assign the Texture from Video to RawImage to be displayed
    image.texture = videoPlayer.texture;

    //Play Video
    videoPlayer.Play();

    //Play Sound
    audioSource.Play();

    Debug.Log("Playing Video");
    while (videoPlayer.isPlaying)
    {
        Debug.LogWarning("Video Time: " + Mathf.FloorToInt((float)videoPlayer.time));
        yield return null;
    }

    Debug.Log("Done Playing Video");
}

发现问题了。下面是FIXED播放视频和音频的代码:

//Raw Image to Show Video Images [Assign from the Editor]
public RawImage image;
//Video To Play [Assign from the Editor]
public VideoClip videoToPlay;

private VideoPlayer videoPlayer;
private VideoSource videoSource;

//Audio
private AudioSource audioSource;

// Use this for initialization
void Start()
{
    Application.runInBackground = true;
    StartCoroutine(playVideo());
}

IEnumerator playVideo()
{
    //Add VideoPlayer to the GameObject
    videoPlayer = gameObject.AddComponent<VideoPlayer>();

    //Add AudioSource
    audioSource = gameObject.AddComponent<AudioSource>();

    //Disable Play on Awake for both Video and Audio
    videoPlayer.playOnAwake = false;
    audioSource.playOnAwake = false;

    //We want to play from video clip not from url
    videoPlayer.source = VideoSource.VideoClip;

    //Set Audio Output to AudioSource
    videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;

    //Assign the Audio from Video to AudioSource to be played
    videoPlayer.EnableAudioTrack(0, true);
    videoPlayer.SetTargetAudioSource(0, audioSource);

    //Set video To Play then prepare Audio to prevent Buffering
    videoPlayer.clip = videoToPlay;
    videoPlayer.Prepare();

    //Wait until video is prepared
    while (!videoPlayer.isPrepared)
    {
        Debug.Log("Preparing Video");
        yield return null;
    }

    Debug.Log("Done Preparing Video");

    //Assign the Texture from Video to RawImage to be displayed
    image.texture = videoPlayer.texture;

    //Play Video
    videoPlayer.Play();

    //Play Sound
    audioSource.Play();

    Debug.Log("Playing Video");
    while (videoPlayer.isPlaying)
    {
        Debug.LogWarning("Video Time: " + Mathf.FloorToInt((float)videoPlayer.time));
        yield return null;
    }

    Debug.Log("Done Playing Video");
}

为什么音频未播放:

//Set Audio Output to AudioSource
videoPlayer.audioOutputMode = VideoAudioOutputMode.AudioSource;

//Assign the Audio from Video to AudioSource to be played
videoPlayer.EnableAudioTrack(0, true);
videoPlayer.SetTargetAudioSource(0, audioSource);

必须之前调用videoPlayer.Prepare();不是在它之后。经过几个小时的实验才发现这就是我遇到的问题。


停留在“准备视频”?

等待5秒后videoPlayer.Prepare();被调用然后退出 while 循环。

Replace:

while (!videoPlayer.isPrepared)
{
    Debug.Log("Preparing Video");
    yield return null;
}

with:

//Wait until video is prepared
WaitForSeconds waitTime = new WaitForSeconds(5);
while (!videoPlayer.isPrepared)
{
    Debug.Log("Preparing Video");
    //Prepare/Wait for 5 sceonds only
    yield return waitTime;
    //Break out of the while loop after 5 seconds wait
    break;
}

这应该可行,但当视频开始播放时您可能会遇到缓冲。在使用此临时修复程序时,我的建议是提交标题为“videoPlayer.isPrepared 始终为真”的错误,因为这是一个错误。

Some people还通过更改修复了它:

videoPlayer.playOnAwake = false; 
audioSource.playOnAwake = false;

to

videoPlayer.playOnAwake = true; 
audioSource.playOnAwake = true;

从 URL 播放视频:

Replace:

//We want to play from video clip not from url
videoPlayer.source = VideoSource.VideoClip;

with:

//We want to play from url
videoPlayer.source = VideoSource.Url;
videoPlayer.url = "http://www.quirksmode.org/html5/videos/big_buck_bunny.mp4";

然后删除:

public VideoClip videoToPlay; and videoPlayer.clip = videoToPlay;因为不再需要这些了。

从 StreamingAssets 文件夹播放视频:

string url = "file://" + Application.streamingAssetsPath + "/" + "VideoName.mp4";

if !UNITY_EDITOR && UNITY_ANDROID
    url = Application.streamingAssetsPath + "/" + "VideoName.mp4";
#endif

//We want to play from url
videoPlayer.source = VideoSource.Url;
videoPlayer.url = url;

所有支持的视频格式:

  • ogv
  • vp8
  • webm
  • mov
  • dv
  • mp4
  • m4v
  • mpg
  • mpeg

Windows 上额外支持的视频格式:

  • avi
  • asf
  • wmf

其中一些格式不适用于某些平台。看this发布有关支持的视频格式的更多信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用新的 Unity VideoPlayer 和 VideoClip API 播放视频 的相关文章

  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • C++ 使用 Boost.asio 和 Beast 库在正文中发送数据

    我必须使用 C 库将数据发送到我们公司的 REST Web 服务 我从 Boost 开始 Beast并给出示例hereUbuntu 16 04 环境中的 Code Blocks 下 该文档对我解决以下问题没有帮助 我的代码或多或少与示例相同
  • Pandas 数据框总行数

    我有一个数据框 类似于 foo bar qux 0 a 1 3 14 1 b 3 2 72 2 c 2 1 62 3 d 9 1 41 4 e 3 0 58 我想在数据框的末尾添加一个 总计 行 foo bar qux 0 a 1 3 14
  • 如何在 EF Core 中显示底层 SQL 查询?

    本次结束后 3 点 15 分 NET Core 2 0 发布 视频中 Diego Vega 展示了 Entity Framework Core 2 0 中新功能的演示 其中显示了底层 SQL 的转储在控制台应用程序中 我在 Stack Ov
  • 使用Matlab检测十字中心点

    你好 我有一张如上图所示的图片 我可以使用Matlab检测十字的中心点并输出结果吗 谢谢 干得好 我假设您有图像工具箱 因为如果没有 那么您可能不应该尝试做这类事情 然而 我相信所有这些功能都可以通过卷积来实现 我对上面显示的图像进行了此处
  • 执行 LeScan 时“蓝牙共享已停止工作”

    我面前有一堆不同的 Android 手机 它们都运行 4 3 4 4 它们似乎都遇到了蓝牙方面的一些错误 我正在运行的应用程序只是使用此回调扫描周围的其他蓝牙设备 http developer android com reference a
  • 使用 pandas read_csv 和 nrows 读取约 13000 行 CSV 文件的部分内容

    我正在尝试将 CSV 文件的片段读入 pandas DataFrame 当我将 nrows 设置为超过某个点时 我遇到了麻烦 我的 CSV 文件被分成具有不同标题 数据类型的不同段 因此我浏览了该文件并找到了不同段的行号 并保存了行号 当我
  • 如何加密 ASP.NET 网站中的查询字符串参数? [复制]

    这个问题在这里已经有答案了 在我的一个 ASP Net 网站中 我必须向用户提供一个链接 其中所有查询字符串参数都应加密 我的想法是使用命令 aspnet regiis 用于加密web configdata 将输出作为查询字符串传递到已发布
  • 可以从(完整)git-svn 克隆重新创建 svn 存储库吗?

    如标题所示 有没有办法使用 git svn 从完整克隆重建 svn 存储库 包含从 r1 开始的每个提交 Edit 我可能应该补充一点 我正在寻找一种实用的方法来做到这一点 近乎完美的副本是可以的 只要它仍然像原始 svn 存储库一样可用
  • xls 文档打开后 Apache POI 设置选定的单元格

    我们有下一种情况 我们的系统有 xls 格式的数据导出 这是一个包含许多行和列的巨大文件 用户下载并打开文档后 他会看到文档滚动到最后一列和最后一个电子表格选项卡 这非常烦人 最好将焦点设置在第一个选项卡和第一个单元格上 我做了简单的测试代
  • 通过 Parallel.ForEach 使用多线程依赖

    我使用 Simple Injector 作为我的 IoC 容器 SimpleInjector 使用这种简单的技术可以处理每个线程和每个 Web 请求的混合生活方式 container RegisterPerWebRequest
  • Laravel 5.2 登录会话不持久

    我一直在使用 Laravel 5 2 实现一个简单的身份验证系统Sentinel Route login success Sentinel authenticate array email gt email password gt pass
  • 如何加速 .NET winforms 渲染

    我有一系列表格并在它们之间导航 每个表单都有一组控件 我从 SQLite 数据库加载属性 这是一个很长 大约 1 秒 的操作 不会给用户最好的感觉 因为表单是逐渐绘制的 我不太介意延迟 但我希望在加载所有数据时绘制表单 我想避免新线程 因为
  • Oracle SQL如何编写一条sql语句来验证用户是否在我的网络中(即朋友或朋友的朋友)

    我有这个问题 给定一个users由社交网络中用户的用户名组成的表friends包含用户名和用户朋友名的表 如下所示 username friendname John Thomas Chris James 我正在尝试编写一条 SQL 语句 如
  • firebase 重定向到 URL 的云函数

    我正在尝试为我的移动应用程序创建下载端点 该应用程序可在应用程序商店和游戏商店中使用 我想要一个可供用户在 iOS 设备或 Android 设备上下载应用程序的 URL 我试图找出是否可以为此目的为 firebase 创建一个云函数 我正在
  • Rollup 是否可以保留文件和文件夹结构?

    我正在使用 ES6 导入并使用 Rollup 对其进行转译 输出是单个捆绑文件 Rollup 可以配置为生成文件到文件的转译结果吗 这是我正在使用的当前配置 它显然会输出一个文件 gulp task rollup function cons
  • Rails 4 授权 gem [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在寻找 Rails 4 的授权 gem 以前我用康康舞 但现在看起来已经过时了 我在这里找到了 the rolehttps github com
  • 如何选择字符串多行?

    我在尝试着Select String在多行文本上 Example This is line1
  • 解析非常大的 XML 文件并编组为 Java 对象

    我有以下问题 我有非常大的 XML 文件 例如 300 Megs 我需要解析它们以便将它们的一些值添加到数据库中 这些文件的结构也非常复杂 我想使用 Stax Parser 因为它提供了一次仅拉解析 从而处理 XML 文件的一部分的良好可能
  • 为什么可以像数组一样查询 jQuery('div') ?

    我还有一个关于 jQuery 架构的问题 div 构造一个新的jQuery object div instanceof jQuery true 我想知道为什么可以像数组一样查询它 尽管它不是数组 div 0 returns the firs
  • 使用新的 Unity VideoPlayer 和 VideoClip API 播放视频

    电影纹理Unity 5 6 0b1 发布后最终被弃用 现在发布了在桌面和移动设备上播放视频的新 API 视频播放器 and 录像片段如果需要 可用于播放视频并检索每帧的纹理 我已经设法使视频正常工作 但无法从 Windows 10 上的编辑