termux转发X桌面和音频

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了termux转发X桌面和音频相关的知识,希望对你有一定的参考价值。

参考技术A 大部分内容引自网络,感谢相关作者。

这是最简单的方法,效率略低于adb转发。

手机proot安装系统完毕后,在容器系统中启动ssh服务器,PC端不能通过密码验证的原因是用户PAM验证,在 /etc/sshd_config 的配置文件中简单禁用PAM即可。同时保证 /dev/pts 目录的写入权限,sshd需要它。同时要知道termux只能自由使用8000以上端口,默认ssh端口是8022,登录同时转发X:

在较早时候,ssh转发音频很简单,只需要执行下列命令:

本质上,就是将音频输入设备(REMOTE)连接到音频输出设备(LOCAL),流块大小为1Kb。

当我们使用alsamixer命令时,按下F6键,我们可以看到系统拥有的所有声卡。

还可以使用下列命令:

如果还要获得其它设备的连接,就需要重新启动一个ssh会话:

或者使用ffmpeg:

hw:3 指要录音的设备(可以使用 arecord -l 命令得到,也可以使用设备名,使用 arecord -L 获得,获得系统默认设备 arecord -L | grep sysdefault )。

如果没有alsa支持,那么这么做:

plughw:3 同样由 arecord 找出来的。

mplayer也木有可以使用ffplay(只是ffmpeg的一部份):

现代发行版基本都使用PulseAudio来控制硬件设备,因此,当PulseAudio运行时,使用 plughw:2 会失败。一般情况下,使用PulseAudio默认的就可以了,可以采用 pavucontrol 命令选择输入源。

PC端配置Pulseaudio服务器,首先安装paprefs工具来配置网络音频访问,然后在服务端 /etc/pulse/default.pa 文件中插入一行语句:

有些情况下,pulseaudio不读取默认文件,则需要手动载入模块。

可能需要打开防火墙相应(默认4713)端口。

可以通过以下命令查看运行的X Server桌面号:

传统上,X Server监听TCP 6000端口,可能需要再防火墙打开该端口,现在系统启动时加了 -nolisten tcp ,需要去掉这个选项。在使用gdm3的系统中,可以修改 /etc/gdm3/daemon.conf 文件:
DisallowTCP=false ,然后重启gdm3。

客户端需要设置 $DISPLAY 变量,指向服务器的地址,例如:

出于一般的安全考虑,默认不允许直接访问X,需要使用 xhost 命令添加客户端,例如:

由于上层存在不同的窗口管理器,可能还需要修改相应的配置方式。

Xauth是半安全连接,远程服务器直接访问本地X Server会被阻止。因此需要设置Xauth。

Xauth显示规范采用了一种称为"magic cookie"的证书方式,客户端需要提交这个"cookie"给服务端。

Xauth默认配置使用环境变量 $XAUTHORITY 指向的文件或者用户目录下的 .Xauthority 文件。

如果要编辑指定Xauthority文件,则执行 xauth -f xxx 命令。

另外一种ssh方式混合秘钥:

检查是否能显示于本地机器:
xclock -display IP:桌面号

默认情况下,XServer关闭tcp端口,因此需要重开一个Xorg。

linuxmint mate下:

按ctrl+alt+f1打开一个tty,启动一个Xorg:

X其实是一个Xorg命令的封装脚本。

按ctrl+alt+f7回已登录桌面,虚拟终端下启动一个mate-session:

这里要使用dbus作为进程间通信服务,否则无法正常启动mate桌面。

如果没有错误,按ctrl+alt+f8就可以看到mate桌面已经启动了。

打开新开桌面的虚拟终端,基于IP验证登录:

如需重启后仍然生效,需要写入/etc/X[n].hosts文件,其中n为桌面号。

查看是否监听了6001端口,如果桌面号是2,XServer会在6002端口监听。以此类推。

可以看到XServer对6001端口监听了。

最后在防火墙打开6001端口,允许数据进入。

最后在客户机正常设置$DISPLAY变量即可。

如果不新开X,那么需要确定使用的桌面管理器,比如lightdm和gdm,如果是lightdm,修改 /etc/lightdm 下X启动相关配置文件,其中加入字段:

查看使用什么窗口管理器,可以查看下X服务器的进程:

gdm则添加如下字段:

然后可能还要修改 /etc/X11/xinit/xserverrc :

默认情况下监听6000端口。

还有一种xhost关闭安全验证的简写方法:

即默认允许所有客户机访问。

X-Server与X-Client之间的远程通信使用TCP方式, 在实际测试中发现X-Server和X-Client在同一个局域网内才能连接成功, X-Client连接NAT后的X-Server的话是不能成功的. 看来这协议是’NAT敏感’的. 解决方法通常是使用SSH隧道。

还有一个内容, 那就是XDM(X-Display-Manager), 他使用的是XDMCP协议, 走UDP177端口. 以后有机会再补充这块内容。

为解决刚说的’NAT敏感’问题. 我们常常使用SSH隧道上的端口转发功能来绕过问题。

远端上的X-Client应用程序访问其本地SSH-Server开启的转发监听端口PORT1, SSH-Server将其在Port1在监听接入的数据通过已经建立好连接的SSH隧道转发到我们本地的SSH-Client, SSH-Client再将数据转发到本地X-Server所监听的TCP端口PORT2。

以PORT1为6010, PORT2为6002为例, 其SSH隧道建立及开启转发功能的连接命令为:

ssh有个简洁的-X参数能自动根据环境配置以上转发参数及远端SSH终端的DISPLAY环境变量. 可以自行翻阅文档查看详情,这功能需要在SSH-Server开启’X11 Forwarding’选项,
这样一来就避开了’NAT敏感’的问题, 从X-Client看来他只是访问本地的X-Server, 从X-Server看来他只是接入本地的X-Client, 所有X层面上看到的IP都是127.0.0.1。

同时这个做法避开了X-Security的xauth远程主机验证,因为都认为是本地主机的访问,只需允许本地访问即可。

大概是速度最快的方式。

所谓UDS,即“Unix domain socket”,即IPC,socket原本用于网络通讯,后来在其框架构建了一种IPC(inter-process communication),即称UDS。

NAMESPACE_RESERVED :就是init.c中/dev/socket/下建立的socket文件。

NAMESPACE_FILESYSTEM:普通命名空间。

NAMESPACE_ABSTRACT:虚拟命名空间。

adb reverse 使用方法查阅帮助文档即可。

显示端执行:

然后远程端设置好 DISPLAY 的桌面号,即可正常显示:

有疑问可参考前面描述的内容。

效率最高,整个手机都可以镜像投屏,树莓派可以使用lazycast,延迟可控制在300毫秒。pc端scrcpy(非miracast),低传输率下100毫米延迟。其它实现没有使用过。

以上是关于termux转发X桌面和音频的主要内容,如果未能解决你的问题,请参考以下文章

web音频流转发之AudioNode

web音频流转发之AudioNode

web音频流转发之音视频直播

播放实时音频流 - html5

在 Java 中创建音频(麦克风)和视频(桌面)流

是啥导致桌面 Safari html 音频 currentTime 不准确?