Untiy中如何嵌入前端页面,从而播放推流视频?

news2025/1/11 12:53:27

最近工作中频繁用到unity,虽然楼主之前也搞过一些UNTY游戏开发项目,但对于视频这块还是不太了解,所以我们采用的方案是在Unity里寻找一个插件来播放推流视频。经过我的一番寻找,发现了这款Vuplex 3D WebView,它可以完美的打通Unity和前端js。

具体步骤如下:

下载资源包,如果觉得收费,可以找楼主要资源哈。这里就不挂链接了。

在资源包里包含了很多个例子,其中有一个叫做SimplewebvidwDemo的例子,大家可以参照这个例子来实现自己需求。

这个插件本身也带有很多的说明文档,如果觉得不太懂怎么用,可以看看文档,只不过文档是英文的。

新建一个预制体,添加脚本,这个预制体也是例子里的, 我们可以改动尺寸调整大小哈。

接着就是写一个自己的类,来执行视频加载的逻辑。具体可以看看我下面的写法

public class SimpleView : MonoBehaviour
{
   public  WebViewPrefab _webViewPrefab;
    // Start is called before the first frame update
    void Awake()
    {
        Web.SetUserAgent(false);
    }

    // Update is called once per frame
    async void Start()
    {

        // The WebViewPrefab's InitialUrl property is set via the editor, so it
        // automatically loads that URL when it initializes.
        _webViewPrefab = GameObject.Find("WebViewPrefab").GetComponent<WebViewPrefab>();
        //  _setUpKeyboards();

        // Wait for the WebViewPrefab to initialize, because the WebViewPrefab.WebView property
        // is null until the prefab has initialized.
        await _webViewPrefab.WaitUntilInitialized();
        _webViewPrefab.WebView.LoadUrl("streaming-assets://index.html");
        // The WebViewPrefab has initialized, so now we can use the IWebView APIs
        // using its WebViewPrefab.WebView property.
        // https://developer.vuplex.com/webview/IWebView
        _webViewPrefab.WebView.UrlChanged += (sender, eventArgs) => {
            Debug.Log("[SimpleWebViewDemo] URL changed: " + eventArgs.Url);
        };
        await _webViewPrefab.WebView.WaitForNextPageLoadToFinish();
        // _webViewPrefab.WebView.PostMessage("{\"type\": \"greeting\", \"message\": \"Hello from C#!\"}");
        /* await _webViewPrefab.WebView.ExecuteJavaScript(@"
startPlay('webrtc://148.70.213.246:21985/rtmplive/15-43-48-0C-11-1F-1E-41-4D-64-30-00-00-C0-D5-88-AF-02-3F', sdkList.sdk2, setSrcObjectCallback2)
");*/
      //  await _webViewPrefab.WebView.ExecuteJavaScript(@"androidToJs_back('webrtc://148.70.213.246:21985/rtmplive/15-43-48-0C-11-1F-1E-41-4D-64-30-00-00-C0-D5-88-AF-02-3F')");
        //
    }

    public void PlayTwoVideoUrl(string url)
    {
       // url = "webrtc://148.70.213.246:21985/rtmplive/15-43-48-0C-11-1F-1E-41-4D-64-30-00-00-C0-D5-88-AF-02-3F";// webrtc://148.70.213.246:21985/rtmplive/15-43-48-0C-11-1F-1E-41-4D-64-30-00-00-C0-D5-88-AF-02-3F;
        var value = string.Format(@"androidToJs_layoutTwo('{0}')", url);
        Debug.Log(@value);
        _webViewPrefab.WebView.ExecuteJavaScript(@value);
        //  _webViewPrefab.WebView.ExecuteJavaScript(@"androidToJs_back('webrtc://148.70.213.246:21985/rtmplive/15-43-48-0C-11-1F-1E-41-4D-64-30-00-00-C0-D5-88-AF-02-3F')");
    }

    public void PlayOneVideoUrl(string url)
    {
        // url = "webrtc://148.70.213.246:21985/rtmplive/15-43-48-0C-11-1F-1E-41-4D-64-30-00-00-C0-D5-88-AF-02-3F";// webrtc://148.70.213.246:21985/rtmplive/15-43-48-0C-11-1F-1E-41-4D-64-30-00-00-C0-D5-88-AF-02-3F;
        var value = string.Format(@"androidToJs_layoutOne('{0}')", url);
        Debug.Log(@value);
        _webViewPrefab.WebView.ExecuteJavaScript(@value);
        //  _webViewPrefab.WebView.ExecuteJavaScript(@"androidToJs_back('webrtc://148.70.213.246:21985/rtmplive/15-43-48-0C-11-1F-1E-41-4D-64-30-00-00-C0-D5-88-AF-02-3F')");
    }

    public void PlayThreeVideoUrl(string url)
    {
        // url = "webrtc://148.70.213.246:21985/rtmplive/15-43-48-0C-11-1F-1E-41-4D-64-30-00-00-C0-D5-88-AF-02-3F";// webrtc://148.70.213.246:21985/rtmplive/15-43-48-0C-11-1F-1E-41-4D-64-30-00-00-C0-D5-88-AF-02-3F;
        var value = string.Format(@"androidToJs_layoutThree('{0}')", url);
        Debug.Log(@value);
        _webViewPrefab.WebView.ExecuteJavaScript(@value);
        //  _webViewPrefab.WebView.ExecuteJavaScript(@"androidToJs_back('webrtc://148.70.213.246:21985/rtmplive/15-43-48-0C-11-1F-1E-41-4D-64-30-00-00-C0-D5-88-AF-02-3F')");
    }

    public void PlayFourVideoUrl(string url)
    {
        // url = "webrtc://148.70.213.246:21985/rtmplive/15-43-48-0C-11-1F-1E-41-4D-64-30-00-00-C0-D5-88-AF-02-3F";// webrtc://148.70.213.246:21985/rtmplive/15-43-48-0C-11-1F-1E-41-4D-64-30-00-00-C0-D5-88-AF-02-3F;
        var value = string.Format(@"androidToJs_layoutFour('{0}')", url);
        //Debug.Log(@value);
        _webViewPrefab.WebView.ExecuteJavaScript(@value);
        //  _webViewPrefab.WebView.ExecuteJavaScript(@"androidToJs_back('webrtc://148.70.213.246:21985/rtmplive/15-43-48-0C-11-1F-1E-41-4D-64-30-00-00-C0-D5-88-AF-02-3F')");
    }

    public void PlayFiveVideoUrl(string url)
    {
        // url = "webrtc://148.70.213.246:21985/rtmplive/15-43-48-0C-11-1F-1E-41-4D-64-30-00-00-C0-D5-88-AF-02-3F";// webrtc://148.70.213.246:21985/rtmplive/15-43-48-0C-11-1F-1E-41-4D-64-30-00-00-C0-D5-88-AF-02-3F;
        var value = string.Format(@"androidToJs_layoutFive('{0}')", url);
        Debug.Log(@value);
        _webViewPrefab.WebView.ExecuteJavaScript(@value);
        //  _webViewPrefab.WebView.ExecuteJavaScript(@"androidToJs_back('webrtc://148.70.213.246:21985/rtmplive/15-43-48-0C-11-1F-1E-41-4D-64-30-00-00-C0-D5-88-AF-02-3F')");
    }



    public  void  InitVideo()
    {
        _webViewPrefab.WebView.ExecuteJavaScript(@"androidToJs_close()");
    }

    public void SetVideoLayout(string layout ="1")
    {
        var value = string.Format(@"changeLayout('{0}')", layout);
        _webViewPrefab.WebView.ExecuteJavaScript(@value);
    }
}

像里面的androidToJs_layoutThree是我们跟前端页面的通讯函数,可以问前端取得,上层只需要调用这个类封装好的函数,就能实现视频的播放和暂停功能 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2274911.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

rabbitmq的三个交换机及简单使用

提前说一下&#xff0c;创建队列&#xff0c;交换机&#xff0c;绑定交换机和队列都是在生产者。消费者只负责监听就行了&#xff0c;不用配其他的。 完成这个场景需要两个服务哦。 1直连交换机-生产者的代码。 在配置类中创建队列&#xff0c;交换机&#xff0c;绑定交换机…

Excel 技巧07 - 如何计算到两个日期之间的工作日数?(★)如何排除节假日计算两个日期之间的工作日数?

本文讲了如何在Excel中计算两个日期之间的工作日数&#xff0c;以及如何排除节假日计算两个日期之间的工作日数。 1&#xff0c;如何计算到两个日期之间的工作日数&#xff1f; 其实就是利用 NETWORKDAYS.INTL 函数 - weekend: 1 - 星期六&#xff0c;星期日 2&#xff0c;如…

初学stm32 --- DAC模数转换器工作原理

目录 什么是DAC&#xff1f; DAC的特性参数 STM32各系列DAC的主要特性 DAC框图简介&#xff08;F1/F4/F7&#xff09; 参考电压/模拟部分电压 触发源 关闭触发时(TEN0)的转换时序图 DMA请求 DAC输出电压 什么是DAC&#xff1f; DAC&#xff0c;全称&#xff1a;Digital…

从预训练的BERT中提取Embedding

文章目录 背景前置准备思路利用Transformer 库实现 背景 假设要执行一项情感分析任务&#xff0c;样本数据如下 可以看到几个句子及其对应的标签&#xff0c;其中1表示正面情绪&#xff0c;0表示负面情绪。我们可以利用给定的数据集训练一个分类器&#xff0c;对句子所表达的…

从CentOS到龙蜥:企业级Linux迁移实践记录(系统安装)

引言&#xff1a; 随着CentOS项目宣布停止维护CentOS 8并转向CentOS Stream&#xff0c;许多企业和组织面临着寻找可靠替代方案的挑战。在这个背景下&#xff0c;龙蜥操作系统&#xff08;OpenAnolis&#xff09;作为一个稳定、高性能且完全兼容的企业级Linux发行版&#xff0…

车联网安全--TLS握手过程详解

目录 1. TLS协议概述 2. 为什么要握手 2.1 Hello 2.2 协商 2.3 同意 3.总共握了几次手&#xff1f; 1. TLS协议概述 车内各ECU间基于CAN的安全通讯--SecOC&#xff0c;想必现目前多数通信工程师们都已经搞的差不多了&#xff08;不要再问FvM了&#xff09;&#xff1b;…

iOS实际开发中使用Alamofire实现多文件上传(以个人相册为例)

引言 在移动应用中&#xff0c;图片上传是一个常见的功能&#xff0c;尤其是在个人中心或社交平台场景中&#xff0c;用户经常需要上传图片到服务器&#xff0c;用以展示个人风采或记录美好瞬间。然而&#xff0c;实现多图片上传的过程中&#xff0c;如何设计高效的上传逻辑并…

基于phpstudy快速搭建本地php环境(Windows)

好好生活&#xff0c;别睡太晚&#xff0c;别爱太满&#xff0c;别想太多。 2025.1.07 声明 仅作为个人学习使用&#xff0c;仅供参考 对于CTF-Web手而言&#xff0c;本地PHP环境必不可少&#xff0c;但对于新手来说从下载PHP安装包到配置PHP环境是个非常繁琐的事情&#xff0…

ffmpeg 编译遇到的坑

makeinfo: error parsing ./doc/t2h.pm: Undefined subroutine &Texinfo::Config::set_from_init_file called at ./doc/t2h.pm line 24. 编译选项添加&#xff1a; --disable-htmlpages

Git:merge合并、冲突解决、强行回退的终极解决方案

首先还是得避免冲突的发生&#xff0c;无法避免时再去解决冲突&#xff0c;避免冲突方法&#xff1a; 时常做pull、fatch操作&#xff0c;不要让自己本地仓库落后太多版本&#xff1b;在分支操作&#xff0c;如切换分支、合并分支、拉取分支前&#xff0c;及时清理Change&#…

国内外网络安全政策动态(2024年12月)

▶︎ 1.2项网络安全国家标准获批发布 2024年12月6日&#xff0c;根据2024年11月28日国家市场监督管理总局、国家标准化管理委员会发布的中华人民共和国国家标准公告&#xff08;2024年第29号&#xff09;&#xff0c;全国网络安全标准化技术委员会归口的2项网络安全国家标准正…

新兴的开源 AI Agent 智能体全景技术栈

新兴的开源 AI Agent 智能体全景技术栈 LLMs&#xff1a;开源大模型嵌入模型&#xff1a;开源嵌入模型模型的访问和部署&#xff1a;Ollama数据存储和检索&#xff1a;PostgreSQL, pgvector 和 pgai后端&#xff1a;FastAPI前端&#xff1a;NextJS缺失的一环&#xff1a;评估和…

通过一个含多个包且引用外部jar包的项目实例感受Maven的便利性

目录 1 引言2 手工构建3 基于Maven的构建4 总结 1 引言 最近在阅读一本Java Web的书籍1时&#xff0c;手工实现书上的一个含多个Packages的例子&#xff0c;手工进行编译、运行&#xff0c;最终实现了效果。但感觉到整个构建过程非常繁琐&#xff0c;不仅要手写各个源文件的编…

信息科技伦理与道德3:智能决策

1 概述 1.1 发展历史 1950s-1980s&#xff1a;人工智能的诞生与早期发展热潮 1950年&#xff1a;图灵发表了一篇划时代的论文&#xff0c;并提出了著名的“图灵测试”&#xff1b;1956年&#xff1a;达特茅斯会议首次提出“人工智能”概念&#xff1b;1956年-20世纪70年代&a…

Sql 创建用户

Sql server 创建用户 Sql server 创建用户SQL MI 创建用户修改其他用户密码 Sql server 创建用户 在对应的数据库执行&#xff0c;该用户得到该库的所有权限 test.database.chinacloudapi.cn DB–01 DB–02 创建服务器登录用户 CREATE LOGIN test WITH PASSWORD zDgXI7rsafkak…

【再谈设计模式】观察者模式~对象间依赖关系的信使

一、引言 在软件工程、软件开发的世界里&#xff0c;设计模式如同建筑蓝图中的经典结构&#xff0c;帮助开发者构建更加灵活、可维护和可扩展的软件系统。观察者模式就是其中一种极为重要的行为型设计模式&#xff0c;它在处理对象间的一对多关系时展现出独特的魅力。 二、定义…

如何设计一个注册中心?以Zookeeper为例

这是小卷对分布式系统架构学习的第8篇文章&#xff0c;在写第2篇文章已经讲过服务发现了&#xff0c;现在就从组件工作原理入手&#xff0c;讲讲注册中心 以下是面试题&#xff1a; 某团面试官&#xff1a;你来说说怎么设计一个注册中心&#xff1f; 我&#xff1a;注册中心嘛&…

【Unity3D】导出Android项目以及Java混淆

Android Studio 下载文件归档 | Android Developers Android--混淆配置&#xff08;比较详细的混淆规则&#xff09;_android 混淆规则-CSDN博客 Unity版本&#xff1a;2019.4.0f1 Gradle版本&#xff1a;5.6.4&#xff08;或5.1.1&#xff09; Gradle Plugin版本&#xff…

2024 China Collegiate Programming Contest (CCPC) Zhengzhou Onsite 基础题题解

今天先发布基础题的题解&#xff0c;明天再发布铜牌题和银牌题的题解 L. Z-order Curve 思路&#xff1a;这题目说了&#xff0c;上面那一行&#xff0c;只有在偶数位才有可能存在1&#xff0c;那么一定存在这样的数&#xff0c;0 ,1,100, 10000,那么反之&#xff0c;我们的数…

【FlutterDart】tolyui_feedback组件例子效果(23 /100)

上效果图 有12种位置展示效果&#xff1b;很能满足大部分需要 代码如下&#xff1a; import package:flutter/material.dart; import package:tolyui_feedback/tolyui_feedback.dart;class TolyTooltipDemo extends StatelessWidget {const TolyTooltipDemo({super.key});ove…