0

如果我想在我个人计算机上的虚拟终端中嵌入的文本编辑器上直播一些工作,我可以在网络上流式传输包含它的窗口的视频。

但由于信息主要由一堆字符组成,可能带有一些颜色和格式,我认为视频是对资源、带宽和技术的浪费。

您对此有何建议,是否有一些服务器在某处实施该解决方案?

要求是:

  • 流必须几乎是实时的(每秒至少更新 1 次,延迟不超过 1 秒)
  • 观众只能使用网络浏览器访问流媒体(他们身边没有其他软件),只读(不与流媒体或我的终端交互)
  • xterm或被urxvt支持的功能
  • 所有必要的软件(流媒体客户端和潜在的服务器端)都是开源的

欢迎就此类工具与视频流相比的技术优势发表评论。

4

1 回答 1

1

我终于花时间实现了一个完整的解决方案,在一个简单的 NodeJS 服务器中使用 socket.io 进行广播。

在客户端,使用 Xterm.js 终端提供简单的 HTML

<script src='/socket.io/socket.io.js'></script>
<script src="xterm/xterm.js"></script>
...
<div class="terminal" id="terminal"></div>

并按照以下方式编写同步脚本

var socket = io();
term.open(document.getElementById('terminal'));
var updateTerminal = socket.on("updateTerminal", function(data) {
    term.write(data);
});

现在data可以传递给term.writeXterm.js 的可以是原始终端数据。几个 UNIX 实用程序可以从终端监视这些原始数据,例如 tmux 由 jerch 在评论或脚本中提出。

要将这些数据传递给服务器进行广播,最简单的方法是使用命名管道;所以在服务器端

mkfifo server_pipe
script -f server_pipe

(发出最后一条命令的终端将是一个广播;如果一个人没有对服务器的物理访问权限,则可以使用额外的管道和隧道连接

mkfifo local_pipe
cat local_pipe | ssh <server> 'cat > path/to/server_pipe'&
script -f local_pipe

)

最后,NodeJS 服务器必须监听命名管道并广播任何新数据

/* create server */
const http = require('http');
const server = http.createServer(function (request, response) {
    ...
});

/* open named pipe for reading */
const fs = require('fs');
const fd = fs.openSync("path/to/server_pipe", 'r+')
const termStream = fs.createReadStream(null, {fd});
termStream.setEncoding('utf8');

/* broadcast any new data with socket.io */
const iolib = require("socket.io");
io = iolib(server);
termStream.on('data', function(data) {
    io.emit("updateTerminal", data)
});

所有这些机制都在我的软件远程讲座中实现。


至于与视频广播的对比,我并没有花时间去实际量化差异,但是对于同等的分辨率和延迟,上述机制应该比捕获图形终端输出并与视频共享要少得多的网络和计算资源。

于 2021-06-10T14:22:14.167 回答