如何实现Web应用程序的屏幕共享? [关闭]

2024-01-29

Prologue。我想问,如何创建在网络上共享桌面屏幕的解决方案,但后来发现有很多这样的问题。这个任务非常复杂,无法用几个字符串来回答。所以我花了一些时间试图找到合适的解决方案。看来我找到了一个——只是想分享一下。

初始任务:我们有一个网络应用程序。我们需要找到一种方法让用户与任何其他用户共享他的屏幕。实现于:Win 7 x64、Java、Wowza-3.5.0。

我们怎样才能做到这一点?


整个过程简单说一下:在 JavaWebStart (jlnp) 的帮助下,通过网页上的链接,用户启动用 Java 编写的 Swing 应用程序,该应用程序每秒都会截取桌面的屏幕截图。之后,它将其编码为视频流并将该流发送到 Wowza 服务器。 Wowza 能够将此流重新传输给任意数量的用户,这些用户可以通过 flash 播放器访问该流。

详细步骤:

1.安装Wowza(强制)。

  • 从这里获取适当的安装程序(在我的例子中是 Win):http://www.wowza.com/pricing/installer http://www.wowza.com/pricing/installer
  • 从这里获取免费的开发者许可证:http://www.wowza.com/pricing/Trial http://www.wowza.com/pricing/trial(您需要提供电子邮件,180 天有效的密钥将发送到那里)。
  • 请关注有关流程的精彩视频:http://www.wowza.com/forums/content.php?288-入门-(视频教程) http://www.wowza.com/forums/content.php?288-Getting-Started-(Video-Tutorial)

此外,我将把 wowza 安装目录称为 [wowza-root]

步骤检查:安装完成后-开始-所有应用程序-Wowza Media Server 3.5.0-Wowza启动。当服务器启动时,您会看到消息

“Wowza Media Server is started!”

打开浏览器并输入:

http://localhost:1935/

你应该看到这样的东西:

Wowza Media Server 3 Developer Edition (Expires: авг 03, 2013) 3.5.0 build2989

如果是这样——我们就完成了第一步。


2. 在 Wowza 上启动示例电影(可选)。

下一步 – 实际传输一些内容,[wowza-root] 拥有所需的一切。

  • 输入目录[wowza-root]\示例
  • 鼠标右键单击安装程序并选择“以管理员身份启动”以安装所有必需的播放器。
  • 输入目录[wowza-root]\examples\VideoOnDemandStreaming\FlashHTTPPlayer** 并单击 **player.html在浏览器中启动此文件。单击连接。步骤检查:你应该看一下关于兔子的有趣电影。您可以在这里提交这部电影:[wowza-root]\content\sample.mp4

3. 用于共享桌面的 SWING 应用程序(强制)。

很好,我们的服务器已启动并正在运行(WOWZA 正在运行)。现在是时候启动应用程序来制作我们的桌面屏幕截图了。幸运的是,它已经是德勒·奥拉吉德写的,上帝保佑这个人。检查此链接了解详细信息(http://code.google.com/p/red5-screenshare/ http://code.google.com/p/red5-screenshare/),这个可供下载(http://code.google.com/p/red5-screenshare/downloads/list http://code.google.com/p/red5-screenshare/downloads/list) – 您需要下载 screenshare.zip 文件。

将其解压到任意目录。我们将首先从 bat 文件启动这个应用程序。解压后的目录中已经有两个bat文件 -do_run1.bat and do_run2.bat。我刚刚复制了其中一个文件并将其命名为do_run_my.bat它的内容应该如下所示:

"C:\Program Files\Java\jdk1.6.0_26\bin\java" -classpath screenshare.jar org.redfire.screen.ScreenShare  localhost screenshare 1935 ss1 flashsv1
pause

where

  • “C:\Program Files\Java\jdk1.6.0_26\bin\java” – java 的正确路径
  • screenshare.jar – 我们应该使用什么jar(可以在解压文件夹中找到)。
  • org.redfire.screen.ScreenShare – 主类
  • localhost – Wowza 的主机
  • 屏幕共享 – 应用程序名称(重要)
  • 1935 年 – 沃扎港
  • ss1 – 流名称(重要)
  • flashsv1 – 视频流的编码。

您唯一需要更改的就是设置 java.util.concurrent.java 的正确路径。您现在就可以启动它!

步骤检查:您应该看到应用程序屏幕。巨大的成功!但是,如果您单击“开始共享”按钮,您将在控制台中收到错误消息,Wowza 中缺少该屏幕共享应用程序文件夹。没关系,这意味着我们现在正走在正确的轨道上。退出 SWING 应用程序。

[ERROR] [New I/O client worker #2-1] org.redfire.screen.ScreenClientHandler - closing channel, server resonded with error: [0 COMMAND_AMF0 c3 #0 t0 (0) s207] name: _error, transactionId: 1, object: null, args: [{level=error, code=NetConnection.Connect.Rejected, description=Connection failed: Application folder ([install-location]/applications/screenshare) is missing., clientid=8.87236417E8}]

4. 配置 WOWZA 以接受来自我们的 SWING APP 的流(强制)。

  • Enter [wowza-root]\应用程序并创建文件夹名称屏幕共享那里(注意 – 这与我们的 SWING 应用程序中的应用程序名称完全相同)
  • Enter [wowza_root]\conf并再次创建文件夹屏幕共享.
  • In [wowza_root]\conf你可以找到一个名为应用程序.xml。将此文件复制到[wowza_root]\conf\screenshare您刚刚创建的文件夹。
  • 更改一些属性应用程序.xml。设置该值:

    流类型=直播 HTTPStreamers=cupertinostreaming、smoothstreaming、sanjosestreaming LiveStreamPacketizers=cupertinostreamingpacketizer、smoothstreamingpacketizer、sanjosestreamingpacketizer 播放方法=无

  • 现在重新启动Wowza。

步骤检查:通过 bat 文件再次启动 SWING-APP。现在您应该看到类似这样的内容,而不是错误,这意味着与服务器的连接已建立:

[INFO] [New I/O client worker #1-1] org.redfire.screen.ScreenClientHandler - onStatus code: NetStream.Publish.Start
+++ [0 VIDEO c5 #1 t166 (0) s255355]
+++ [1 VIDEO c5 #1 t1169 (1003) s116522]
+++ [1 VIDEO c5 #1 t2171 (1002) s53049]
+++ [1 VIDEO c5 #1 t3178 (1007) s53667]

5. 观看您的直播(可选)。现在是最令人愉快的部分——看看所有这些员工如何一起工作。 - 进入[wowza-root]\examples\LiveVideoStreaming\FlashRTMPPlayer** 并启动 **player.html。请注意,下面的两个参数都使用了应用程序名称和流名称,它们与我们在 SWING-APP 中配置的完全相同。

Server: rtmp://localhost/screenshare
Stream: ss1

然后单击“连接”按钮。

步骤检查:您将看到您的共享桌面!所以任务已经完成——至少是初始阶段。


6. 在网页上启动 flash-player(可选)伟大的!现在我们有了可行的解决方案,只有一件事尚未完成 - 我们正在从 Windows 目录启动播放器,并且网络上的其他人无法访问它。那么,有什么问题,让我们部署一个吧。

  • 首先您需要阅读以下内容:http://www.wowza.com/forums/content.php?49 http://www.wowza.com/forums/content.php?49
  • 接下来前往http://www.osmf.org/configurator/fmp/# http://www.osmf.org/configurator/fmp/#
  • 在“Videosource”字段中插入指向您的流的链接(当然,SWING-APP 应该在共享模式下工作):rtmp://localhost:1935/screenshare/ss1
  • 单击预览。你应该看到你的直播。
  • 现在,只需将“预览嵌入代码”中的整个代码复制到实际部署在应用程序服务器上的任何网页 - 仅此而已。您可以向任何用户提供此页面的链接,他将能够看到您的直播。

7. 使用动态流名称而不是静态(可选)

您可能已经注意到,现在我们的屏幕共享正在运行,但由于我们通过配置向 SWING-APP 提供流名称,因此无法同时为多个用户使用它。我不会详细描述如何处理,只是简单说明一下。

如果你检查屏幕共享.jar你会发现这个jar实际上包含了SWING应用程序的所有编译和源代码。可以根据您的需要修改源代码并重新设计初始应用程序。就我而言,我只是将当前时间(以毫秒为单位)添加到提供的流名称和消息窗口中,在单击“开始流”按钮后显示类似以下内容:

Send this link to any person you want to share you screen with:
http://localhost:8080/player.htm?src=rtmp%3A%2F%2Flocalhost%3A1935%2Fscreenshare%2Fss1360243745881

正如您在链接中看到的 - 我只是将流地址作为查询字符串添加到嵌入播放器代码的 html 页面所在的 URL。我还想提供此页面的代码。它非常简单 - 在 javascript 的帮助下,我从请求字符串中提取了参数,并将提取的参数放在我的 html 页面上应该位于的位置,并嵌入了 p.6 中的代码

<html>
<head></head>
<body>

<SCRIPT LANGUAGE="JavaScript">

    var myQueryString = document.location.search;

    // remove the '?' sign if exists
    if (myQueryString[0] = '?') {
        myQueryString = myQueryString.substr(1, myQueryString.length - 1);
    }


    document.write(
        '<object width="600" height="409">\n' +
            '<param name="movie" value="http://fpdownload.adobe.com/strobe/FlashMediaPlayback.swf" />\n' +
            '</param>\n' +
            '<param name="flashvars" value="' + myQueryString +'" />\n' +
            '</param>\n' +
            '<param name="allowFullScreen" value="true" />\n' +
            '</param>\n' +
            '<param name="allowscriptaccess" value="always" />\n' +
            '</param>\n' +
            '<embed src="http://fpdownload.adobe.com/strobe/FlashMediaPlayback.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="600" height="409" flashvars="' + myQueryString +'"></embed>\n' +
            '</object>'
    );

</SCRIPT>

</body>
</html>

就这些。我希望它能为某人节省一些时间。祝你好运

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

如何实现Web应用程序的屏幕共享? [关闭] 的相关文章

  • 如何向 OkHttp 请求拦截器添加标头?

    我将这个拦截器添加到我的 OkHttp 客户端 public class RequestTokenInterceptor implements Interceptor Override public Response intercept C
  • 通过 JDBC 与 CLI 使用 MIT Kerberos 连接到 PostgreSQL 9.4 时出错

    我已经使用 MIT Kerberos 5 设置了 PostgreSQL 9 4 并且可以使用 psql 在 CLI 上连接 提交指纹后 我的委托人是 bgiles postgres REALM pg hba conf 有 host all
  • Spring MVC 中的 CSRF(跨站请求伪造)保护

    我对春季的 CSRF 跨站请求伪造 保护有点困惑 不 我有我的 jsp 我的控制器和一个 Web 服务 我想要做的是在 Web 服务级别验证令牌 如果令牌匹配 则运行 Web 服务 在我的例子中执行数据库插入 JSP file
  • 如何加载椭圆曲线 PEM 编码的私钥? [复制]

    这个问题在这里已经有答案了 我使用 OpenSSL 生成了椭圆曲线私钥 公钥对 私钥和公钥均采用 PEM 编码 我已经弄清楚如何加载公钥 感谢this https stackoverflow com a 40439081但是 我无法弄清楚如
  • 从 Java 启动外部进程:stdout 和 stderr

    我正在使用标准从 java 启动一个外部进程java lang Process 我试图弄清楚该过程的输出是什么 但是采用结合了两者的格式stdout and stderr 目前 我有Process getInputStream它提供了访问s
  • BigDecimal 中 Divide 方法的 Scale()

    new BigDecimal 37146555 53880000 divide new BigDecimal 1000000 scale 这返回10 但根据API divide method 返回一个 BigDecimal 其值为 这个 除
  • 带有 @Scheduled Spring 注释的方法的切入点

    我想要一个带有注释的方法的 AspectJ 切入点 Scheduled 尝试了不同的方法但没有任何效果 1 Pointcut execution org springframework scheduling annotation Sched
  • IntelliJ 建议错误的 @NotNull 注释

    IntelliJ 建议导入com sun istack internal NotNull以下程序中的 NotNull 注释 这是错误的 public class Test implements Comparable
  • 从另一个类添加 Swing 组件

    我正在学习java 我正在尝试从另一个类向我的框架添加一个菜单栏 练习将代码划分为多个类以更好地组织程序 这是我的代码示例 public class MainApp public static void main String args C
  • Knuth-Morris-Pratt 算法

    解决方案是Knuth Morris Pratt 算法 https en wikipedia org wiki Knuth E2 80 93Morris E2 80 93Pratt algorithm 干草堆 AAAAAAAAA 针 AAA
  • Android Google 地图:隐藏整个地图的多边形或形状

    我试图隐藏除一个区域之外的整个地图 因为我使用的多边形在我想要显示的区域中有一个洞 问题在于 根据缩放的不同 空白区域会被多边形的颜色覆盖 或者多边形会失去其颜色 这是代码 polygon hide all world map float
  • Android 上的自定义视图和窗口属性

    我想要做的是在我的应用程序顶部添加一个视图 该视图类似于过滤器视图 我想操纵屏幕的颜色 并且我还希望能够同时更改屏幕的亮度时间 这两件事似乎是分开起作用的 但不能一起起作用 这是我的代码 添加视图 colourView new Layer
  • 基于Java模式分割字符串

    您好 我有以下模式的日志文件 2014 03 06 03 21 45 432 ERROR mfs pool 3 thread 19 dispatcher StatusNotification Error processing notific
  • 未从线程接收位置数据

    我尝试使用计时器经常发送包含用户位置的短信 最初 我遇到了空指针异常 这是由于我犯了一个简单的错误 一旦解决了这个问题 一切似乎都运行良好 但是 它永远不会获取我的位置 因此 不断发送的文本显示 无法接收位置 我想问的是为什么它无法获取我的
  • 不想保留一对一的实体

    假设我有两节课Employee and Department In Employee我已经写了 OneToOne fetch FetchType EAGER cascade CascadeType ALL JoinColumn name d
  • 如何使 RSACryptoServiceProvider 在没有填充(nopadding)的情况下工作?

    我需要使 C 应用程序与 Java 应用程序兼容 Java 应用程序使用Cipher getInstance RSA ECB nopadding 初始化器使密码 ECB 和无填充 但是 在 C 中 您有 2 个填充选项 OAEP 填充或 P
  • JavaFX 8 默认消息图标

    随着 JavaFX 的最近几次更新 我们收到了警报 我想获取消息的默认图标 错误 警告 在Swing中 我可以通过一些方式获取L F消息图标UIManager的属性 如何在 JavaFX 中获取消息的默认图标 它们是包含在属性中 还是由 C
  • 用什么? MVC、MVP 或 MVVM 还是……?

    我将启动一个 Java 项目来开发桌面应用程序 使用什么作为表示层模式 MVC MVP MVVM 或 如果可能的话 举一些可行的小例子 Actually the ultimate post you re looking for is thi
  • Java分数计算器

    我对 Java 编程还很陌生 我的 AP 计算机编程课程有作业要完成 所以请耐心等待 我必须弄清楚如何将两个分数相乘 我想知道是否有任何方法可以在方法内部声明变量并在该方法外部使用它 我在介绍方法中的 while 循环 谢谢您 希望这不会令
  • Java:如何检测(并更改?)System.console 的编码?

    我有一个在控制台上运行的程序 其变音符号和其他特殊字符在 Mac 上以 的形式输出 这是一个简单的测试程序 public static void main String args System out println h h System

随机推荐

  • 从 sqlplus 调用存储过程

    如何从sqlplus调用存储过程 我有一个程序 Create or replace procedure testproc parameter1 in varachar2 parameter2 out varchar2 begin Do so
  • 如何将 mypy 与派生类和方法调用一起使用?

    我正在与 mypy 作斗争 不明白我想要传递一个派生类 其中代码接受基类或任何派生类的实例 并在该传递的实例上调用方法 My code from typing import Type import abc class Base abc AB
  • 当从另一个线程修改对象属性时引发 OnPropertyChanged

    所以我有这个对象 public class SomeObject INotifyPropertyChanged public decimal AlertLevel get return alertLevel set if alertLeve
  • jquery中如何获取的值?

    您好 我正在尝试从 jquery 获取 p selectOneMenu 的值 但我还没有得到 我使用 JSF 和 primefaces 作为我的 UI 组件
  • 阿拉伯文本在 web 应用程序中显示,无需更改数据库

    当用户输入阿拉伯语名称和密码时 我应该检索该用户的数据 在java中 我使用utf 8编码 我应该从数据库中以阿拉伯文本的形式检索数据 我使用的数据库是 sql server 2005 并且该列设置为 varchar 而不是 nvarcha
  • 如何使 StdIn.isEmpty() 返回 true?

    我正在使用算法 Coursera 算法课程中提供的普林斯顿库中的 StdIn isEmpty 方法 但对其工作原理感到困惑 我有声明 while StdIn isEmpty 附带一些读取用户输入的代码 但我似乎无法跳出循环 根据我的理解 如
  • python sqlite 插入命名参数或 null

    我正在尝试使用命名参数将字典中的数据插入到数据库中 我用一个简单的 SQL 语句来完成这个工作 例如 SQL INSERT INTO status location arrival departure VALUES location arr
  • 处理大型数组而不会出现运行时错误

    当我使用大小为 10 5 10 5 的数组 例如int a 100000 100000 由于该数组消耗更多内存 这可能是运行时错误的原因之一 我应该如何声明这个数组 二维数组 例如int a 100000 100000 这样我就可以应对问题
  • 使用“git filter-branch”来更正最后 N 次提交中的提交者日期?

    我最近需要使用 git am 向我的存储库应用 16 个补丁 并且我小心翼翼地为每个补丁使用 committer date is author date 然而 我还需要调整每个 amd 补丁的提交消息 并且在完成所有 16 个补丁之后 我发
  • MPI - 异步广播/收集

    我有一个项目 需要 n 个进程才能工作 直到问题得到解决 每个从属进程执行相同的代码 当某种情况出现时 该进程需要以非阻塞的方式通知所有其他进程 其他进程也需要以非阻塞的方式接收这个消息 有没有办法不用线程单独的循环 我已经有一段时间没有使
  • 如何在 Drools 中参数化后时间约束?

    我有一个与以下示例非常相似的规则 rule correlate orders when bo BuyOrderEvent id id ae AckEvent id id this after 0 10s bo then do somethi
  • 为什么 PHP Composer 这么慢?

    Why is PHP 作曲家 https en wikipedia org wiki Composer software 当我所做的只是初始化一个零依赖项的项目时 速度这么慢 以下是我运行的命令 composer init composer
  • 为什么闭包比全局变量更能保存变量?

    我了解闭包在 JavaScript 中的工作原理 但我的问题是为什么要费尽心思创建闭包来保存变量 不能把变量设为全局吗 或者这会扰乱全局范围并使您的代码容易出错 这是一个范围界定问题 全局变量就是这样 Global toeveryone 使
  • 我应该如何安装keras-bert才能在R端正确使用?

    我正在尝试按照解释安装 keras berthere https blogs rstudio com ai posts 2019 09 30 bert r 虽然它已成功安装在环境 as 上 但我在 R 端看不到 keras bert ber
  • Kafka 事务失败但仍提交偏移量

    我正在尝试了解 Kafka 事务和一次性事务 我创建了一个事务消费者 我想确保我读取并处理某个主题的所有消息 如果事务失败并且消息因此丢失 Kafka 仍会提交偏移量 更正式地说 如果流处理应用程序消费消息 A 并生成消息 B 使得 B F
  • 如何将重音字符与 PHP preg 匹配?

    我想让我的用户不仅可以选择填写字母和数字 还可以选择 特殊 字母 例如 等 但是 我不希望他们能够使用符号如 等 有没有办法编写正则表达式来完成此任务 最好不要指定每个特殊字母 我现在有 reg w 你可以使用Unicode 字符属性 ht
  • networkx 有向图属性错误 self._succ

    Context 我正在尝试运行另一位研究人员的代码 它描述了湾区道路网络的交通模型 该模型容易受到地震灾害的影响 我是 Python 新手 因此非常感谢您帮助调试以下错误 Issue 当我尝试按照文件中提供的示例数据运行代码时 按照自述文件
  • Membership.DeleteUser 未删除用户的所有相关行

    Membership DeleteUser 设法删除我要删除的用户的用户配置文件 为什么它不删除它存储在的信息webpages membership 我目前没有使用角色 因此请记住这一点以获取答案 我进行了测试并验证了这一点SimpleMe
  • 可重用预处理器 __COUNTER__

    我正在做一些模板元编程 主要是编写我自己的编译时间列表 但我也有一些预处理器魔法 我想用它们来使事情变得更容易 如果可能的话 我想做的是创建一个函子的编译时列表 该部分已完成 但用于简化创建 并添加到列表中 的宏尚未完成 简单举个例子 te
  • 如何实现Web应用程序的屏幕共享? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Prologue 我想问 如何创建在网络上共享桌面屏幕的解决方案 但后来发现有很多这样的问题 这个任务非常复杂 无法用几个字符串来回答