2020年6月

PHP 8 发布首个 Alpha 版本

PHP 8 将于今年 11 月 26 日发布,而原定于 6 月 18 日发布的第一个 Alpha 版本跳票到了今天发布。PHP 8 是一个新的主要版本,它引入了一些重大变更:JIT 即时编译;联合类型;注解;弱映射等。

来源:开源中国

拍一拍:PHP 自从跳到 PHP 7 以后,各种性能和先进特性就发展的很快,和之前的 PHP 5.x 时代已经不可同日而语了。

APU 能效 6 年提升 31.7 倍

2014 年 6 月,AMD 提出了一个所谓的“25X20”目标 —— 到 2020 年的时候,APU 处理器的能效(性能功耗比)将会提高 25 倍!根据 AMD 给出的数据,以 2014 年初发布的 Kaveri APU 为基准,今年最新的 Renoir APU 的能效比已经是其 31.77 倍,远超当初设定的 25 倍目标!

来源:快科技

拍一拍:AMD 现在的发展也很不错啊!

高盛发布了一套免费新字体,但你不能用它来批评高盛

投资银行高盛发布了自己的字体:一套被称为 Goldman Sans的无衬线字体。Twitter 用户 Matt Round 发现在他们的许可证中规定:你可以自由地使用 Goldman Sans 来做任何你喜欢的事情,只要你不使用它来批评高盛。只要下载字体包,就等同于同意这些条款和条件,而且虽然 Goldman San 名义上是免费字体,但高盛保留了对授权的完全控制权,允许它以任何理由终止使用。

来源:cnBeta.COM

拍一拍:果然是银行家暗搓搓的习惯。

GIMP( GNU 图像处理程序 GNU Image Manipulation Program )是一个一流的开源自由的图像处理程序。加州大学伯克利分校的 Peter Mattis 和 Spencer Kimball 早在 1995 年的时候开始了该程序的开发。到了 1997 年,该程序成为了 GNU 项目 官方组成部分,并正式更名为 GIMP。时至今日,GIMP 已经成为了最好的图像编辑器之一,并有经常有 “GIMP vs Photoshop” 之争。

GIMP 不仅仅有 Linux 版本,在 Windows 和 macOS 平台上,也一直有大量专业用户。它被很多人认为是 Photoshop 的最佳替代品之一。不过,由于 GIMP 采用了和 PhotoShop 不同的用户界面和交互逻辑,因此那些从 Photoshop 迁移过来的用户需要一段时间的适应。

Photo GIMP 补丁

现在,有人开发了一个新的补丁,可以将你的 GIMP “打扮” 得像 Photoshop 一样。这个补丁就是 PhotoGIMP,它所做的就是调整 GIMP,使其模仿 Photoshop 的界面,同时还增加了一堆额外的功能。

该补丁是针对 GIMP 2.10 的,主要提供的特性有:

  • 对工具箱进行组织,以模仿 Adobe Photoshop
  • 默认安装数百种新字体
  • 默认安装新的 Python 滤镜,如 heal selection
  • 新的启动闪屏
  • 新的默认设置,以最大化画布空间
  • 按照 Adobe 文档为 Photoshop 上的相似功能设置快捷键
  • 自定义的 .desktop 文件添加了新的图标和名称
  • 新的默认语言是英语(如果你想的话,仍然可以在设置中更改)

安装该补丁后,GIMP 的外观看起来如下:

如何安装

这里是以 flatpak 做示例介绍的,但这个补丁其实“只是文件”而已,所以,你可以在以任何打包方式安装的 GIMP 上使用(.deb、.rpm、Snap、AppImage、Windows、macOS),只需检查每个系统/包中 GIMP 文件的本地化。

准备 Flatpak 环境

首先,你需要使用 Flatpak 在系统上安装最新的 GIMP。

通过 AppCenter/Package Manager 或终端安装 GIMP Flatpak:

flatpak install flathub org.gimp.GIMP

安装此补丁

在发布页面的 .zip 文件中,你会发现三个隐藏的文件夹(在 Linux 上,使用名字前的 . 来隐藏文件)。所有这些文件夹都必须解压到你的 /home/$USER 文件夹中,如果你在之前的安装中已经有了相同的文件,那么就会覆盖所有内容。

该文件有以下目录。

  • .icons(这里有一个新的 PhotoGIMP 图标)
  • .local(其中包含个性化的 .desktop 文件)
  • .var (其中包含 GIMP 2.10+ 的 flatpak 补丁定制)

如果你只是想要自定义 PhotoGIMP,而不改变原来的 GIMP 图标和名称,只需解压 .var 文件夹到你的主目录。

想在 Windows、macOS 或 Ubuntu(Snap)上使用?

由于这个补丁只是文件,你唯一需要做的就是将软件仓库中的 /.var/app/org.gimp.GIMP/config/GIMP/2.10 中的所有文件复制到每个特定系统的 GIMP 文件夹中,覆盖现有的文件。

  • Windows:C:/Users/YOUR_USER/AppData/Roaming/GIMP/2.10
  • macOS:/Users/Library/Application Support/GIMP/2.10/
  • Ubuntu(Snap):/home/$USER/snap/gimp/47/.config/GIMP/2.10/
  • 常规 Linux 安装(.deb、.rpm):/home/$USER/.config/GIMP/2.10/

GIMP 在 macOS 上的发布时间有点延迟,这样一来,这个补丁仍然可以工作,特别是在快捷键方面,但有些东西,比如工具箱的组织,至少要等到 macOS 版本达到 2.10.20 版本。

新的图标只有通过 Linux 环境下的补丁提取才能使用,但你可以在你的系统上手动设置它。

总结

好了,你是不是从 PhotoShop 转移过来的 GIMP 用户,你有没有试过这个补丁?你觉得这个补丁有用吗?欢迎留言。

Go 编译器的 SSA 后端包含一种工具,可以生成编译阶段的 HTML 调试输出。这篇文章介绍了如何为函数和方法打印 SSA 输出。

让我们从一个包含函数、值方法和指针方法的示例程序开始:

package main

import (
    "fmt"
)

type Numbers struct {
    vals []int
}

func (n *Numbers) Add(v int) {
    n.vals = append(n.vals, v)
}

func (n Numbers) Average() float64 {
    sum := 0.0
    for _, num := range n.vals {
        sum += float64(num)
    }
    return sum / float64(len(n.vals))
}


func main() {
    var numbers Numbers
    numbers.Add(200)
    numbers.Add(43)
    numbers.Add(-6)
    fmt.Println(numbers.Average())
}

通过 GOSSAFUNC 环境变量控制 SSA 调试输出。此变量含有要转储的函数的名称。这不是函数的完全限定名。对于上面的 func main,函数名称为 main 而不是 main.main。

% env GOSSAFUNC=main go build
runtime
dumped SSA to ../../go/src/runtime/ssa.html
t
dumped SSA to ./ssa.html

在这个例子中,GOSSAFUNC=main 同时匹配了 main.main 和一个名为 runtime.main 的函数。 [1] 这有点不走运,但是实际上可能没什么大不了的,因为如果你要对代码进行性能调整,它就不会出现在 func main 中的巨大的意大利面块中。

你的代码更有可能在方法中,你可能已经看到这篇文章,并寻找能够转储方法的 SSA 输出。

要为指针方法 func (n *Numbers) Add 打印 SSA 调试,等效函数名为 (*Numbers).Add: [2]

% env "GOSSAFUNC=(*Numbers).Add" go build
t
dumped SSA to ./ssa.html

要为值方法 func (n Numbers) Average 打印 SSA 调试,等效函数名为 (*Numbers).Average,即使这是一个值方法:

% env "GOSSAFUNC=(*Numbers).Average" go build
t
dumped SSA to ./ssa.html

  1. 如果你没有从源码构建 Go,那么 runtime 软件包的路径可能是只读的,并且可能会收到错误消息。请不要使用 sudo 来解决此问题。 ↩︎
  2. 请注意 shell 引用 ↩︎

via: https://dave.cheney.net/2020/06/19/how-to-dump-the-gossafunc-graph-for-a-method

作者:Dave Cheney 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

近日召开的 Perl 大会是在云端举办的,在会上 Sawyer X 宣布 Perl 有了新的前进计划。Perl 7 的开发工作已经在进行中,但不会有代码或语法上的巨大变化。它是默认带有现代行为的 Perl 5,将为以后更大的变化奠定基础。

硬核老王:在经历了 Perl 6 失败的巨大痛苦之后,Perl 社区终于从阴霾的心情中走出了。但是失去的黄金 20 年却是挽回不了了,否则别说 PHP,都不会有 Python 什么事。我认为,Perl 7 是一条自我救赎之路,应该,或许,会有新的 Perl 7、Perl 8 吧……

Perl 7 基本上是 Perl 5.32

Perl 7.0 将会是 Perl 5 系列的 5.32,但会有不同的、更合理的、更现代的默认行为。你不需要启用大多数你已经设置过的默认行为,因为这些已经为你启用了。这个大版本跳跃为我们一直以来的工作方式和未来可以做的事情之间设定了一个界限。

硬核老王:可以理解为,Perl 是一个 Perl 5 兄弟们亲手打下的家族企业,而 Perl 6 是外面请来的职业经理人,结果经理人要对家族企业采用现代化管理,差点鸡飞蛋打。现在好了,Perl 6 分家出去单过了,亲儿子 Perl 7 准备重振家业。

请记住,Perl 是一门“按我的意思做”的语言,其默认行为可能就是你想要的。在 Perl 4 和 Perl 5 的早期,这很容易。但是,几十年过去了,现在的世界更加复杂了。我们不断地往其中添加编译指令,但由于 Perl 对向后兼容的承诺,我们不能改变其默认行为。现在,我们又回到了 C 语言的旧时代,在开始做一些事情之前,我们必须包含大量的例行模板:

use utf8;
use strict;
use warnings;
use open qw(:std :utf8);
no feature qw(indirect);
use feature qw(signatures);
no warnings qw(experimental::signatures);

这一点在 v5.12 及以后的版本中稍有好转,因为我们可以通过使用设置最低版本来免去设置 strict 指令:

use v5.32;
use utf8;
use warnings;
use open qw(:std :utf8);
no feature qw(indirect);
use feature qw(signatures);
no warnings qw(experimental::signatures);
硬核老王:不可否认,Perl 二十年前如日中天,那个时候,不说终端运行的脚本,就是互联网上主要的互动程序(CGI),也几乎全是用 Perl 写的。但是在风口时代它的主要精力都在折腾 Perl 6,而 Perl 5 系列不但很多地方显得老旧,历史包袱也过重。向前不能保持原有的精巧习惯,向后不能跟上现代的软工理念。

Perl 7 是一个新的机会,即使不指定版本,也可以把其中的一些行为变成默认行为。Perl 5 仍然有它的极度向后兼容的行为,但 Perl 7 将以最小的历史包袱获得现代实践的新生。我个人希望 签名 ( signatures ) 功能能够入选到新的版本,但要让 Unicode 成为默认行为还有很多工作要做,所以你可能需要保留其中的一些编译指令:

use utf8;
use open qw(:std :utf8);

你可能会丢掉一些你肯定不应该使用的垃圾功能,比如间接对象表示方式。Larry Wall 说他必须为 C++ 程序员做点什么。

my $cgi = new CGI;  # 间接对象,但在 Perl 7 不这样用了
my $cgi = CGI->new; # 直接对象

但是,这个功能在 Perl 7 中并没有真正消失。它在 v5.32 中已经可以通过设置关闭了,但现在有了不同的默认行为。

Perl 5 怎么了?

没有人要把 Perl 5 从你身边夺走,它将进入长期维护模式 —— 比最新用户版本的两年滚动支持时间的两倍都要长得多。这可能要从现在支持到十年后了(或者说 Perl 5 已经人过中年了)。

硬核老王:这样挺好,旧时代的继续留在旧时代,新生代的轻装前行。

什么时候开始?

这项工作现在就在进行,但你不需要担心,大约六个月后,才会出现第一个候选版本。我们的目标是在明年发布 Perl 7.0 的用户版本,并在这期间发布一些候选版本。

这也是一个容易实现的承诺,因为 Perl 7 基本上就是 v5.32,默认行为不同而已。没有大的重写,也没新的功能,尽管目前一些实验性的功能可能会稳定下来(请把“签名”功能选入!)。

CPAN 怎么办?

CPAN( 综合 Perl 档案网 ( Comprehensive Perl Archive Network ) )有近 20 万个模块。人们正在使用的处于维护状态的模块应该还能用,对于其它的模块会有一个兼容模式。记住 Perl 7 主要是 v5.32,所以你应该不需要修改太多。

你可能不知道 Perl5 Porters 几乎会针对所有的 CPAN 模块测试其新版本。这个用于检查更改可能对 Perl 社区产生影响的工具已有很长的历史了。作为一个模块的作者,我经常会收到来自不同人的消息,主要是 Andreas Koenig 或 Slaven Rezić,他们说我的模块中的一些奇怪的东西可能会在新的 Perl 版本中出问题。通常,我总是需要更新一些东西来解决这些问题。追踪现有代码中的问题已经不是问题了。修复代码应该不会那么繁琐,因为它仍然是 Perl 5,但有更好的实践。

硬核老王:知道当年 Perl 为什么强悍吗?有一个主要的原因是,Perl 有个无所不包的 CPAN 仓库。

会不会有一个单独的 Perl 7 的 CPAN?没有人说不能有,但是在跳转到 Perl 7 的过程中,开发人员不希望重做已经可以工作的东西。这个变化应该是可以控制的,尽量减少副作用。

另外,PAUSE( Perl 作者上载服务器 ( Perl Authors Upload Server ) )在过去的几年里得到了不少人的喜爱。这使他们可以更容易适应未来的需要。从事这方面工作的人都是经验丰富、才华横溢的人,他们让代码库变得更加容易管理。

为什么要跳到大版本?

一个主要版本可以与用户订立不同的契约。跳转到一个主要版本可以用新的默认行为来改变这个契约,即使这与过去有冲突。如果你愿意的话,总会有办法将所有这些设置都重置为旧的 Perl 5 默认行为。不过在语法和行为上,Perl 7 的代码(大部分)仍然是 v5.32 的代码。

Sawyer 谈到了 Perl 用户的三个主要细分市场:

  • 绝不会改变他们的代码的人
  • 使用新功能的人
  • 从零开始的人

Perl 5 的社会契约是 极度后向兼容 ( extreme backward compatibility ) ,并且在这方面取得了惊人的成功。问题是,极度后向兼容对那些不会更新代码的人有效,但对另外两部分人没有帮助。要使用新功能的人不得不在每个程序中加入挺长的例行模板部分,而从零开始的人们则想知道为什么他们创建一个程序就必须包含这么多,才能不让 StackOverflow 上的人因为少了那些编译指令而呵斥他们。

硬核老王:迎合新血才是最重要的,让旧代码和旧人们自己过吧。

为什么是 7,而不是 6?

这个答案分为两部分。 首先,“Perl 6” 已经被现在称为 Raku 的产品所采用。很久以前,我们认为这件非常雄心勃勃的重写工作将取代 v5.8。但最后,这件事并没有发生,Perl 语言依旧继续过着自己的生活。

因此,下一个可用数字为 7。如此而已。这只是序列中的下一个基数。版本跳跃这事情并不稀奇:PHP 直接从 5 升到了 7 —— 难道是我们从 PHP 社区偷学到的跳跃技能?看看一下历史上的其他奇怪的版本变化:

  • 从 Solaris 2.6 到 Solaris 7
  • 从 Java 1.4 至 Java 5
  • 从以 Postgres 9.x 为主要版本变成了以 Postgres 10 为主要版本
  • Windows 3.1 至 Windows 95(98、ME、2000、XP、Vista、7、8、10)
  • TeX(每个新版本都更趋近于圆周率 π )

至少我们没跳到 Perl 34!

硬核老王:言外之意,你们跳得,我也跳得~而且,你们不觉得版本 6 这个数字有点不吉利么,而版本 7 这个数字就好多了。

有什么消失了么?

消失的东西不多。有些东西在默认情况下会被禁用,但同样,这本质上是调整旋钮和拨盘指向不同地方的 Perl 5.32。即使在 Perl 5 的土地上,有些东西你也应该学会不需要。以下这些都是第一轮变化的可能目标:

  • 间接对象符号
  • 裸词文件柄(标准文件柄除外)
  • 伪多维数组和哈希值(老的 Perl 4 花招)
  • Perl 4 风格的原型定义(使用 :prototype() 代替)
硬核老王:是该学会放弃了,又不是区块链,什么旧的都不能丢下。

增加了什么?

增加的也不多。Perl 7 主要是 Perl v5.32,但默认启用了所有的功能。你不需要做任何事情就可以获得大多数新功能,比如postfix 解引用,新的 isa 操作符,或者其他一些功能。这就是一个主要版本可以提供的新社会契约的好处。这是一个硬边界,新功能可以在一边默认存在,而不干扰另一边。

硬核老王:多增加点新的编程语言技能吧!哪怕是语法糖。

那我现在应该做什么?

如果你需要一个旧版的 Perl 来运行你的代码,你继续好了。那些旧版本是不会消失的。就像 Perl 5.6 到现在仍然可以使用,如果那是你希望运行的版本的话。

如果你的代码在那些约束和警告下运行没有问题,而且你使用的是现代 Perl 风格,可能你大部分代码都不用动。如果你有一些裸词的文件柄,就开始转换这些,间接对象符号也一样。

如果你的代码比较凌乱,你也不是没有机会。在从 Perl 5 到 7 的过渡过程中,会有兼容模式来帮助你(但不是 Perl 5 到 8)。一个编译指令可以把那些旋钮和拨盘设置回旧的设置(但这最多也就是一个版本的事情)。

use compat::perl5;  # 行为类似 Perl 5 的默认行为

对于模块来说,还有一些问题需要解决,但也会有一个兼容机制来解决这些问题。

硬核老王:代码实在写的烂(辩解:我这不是烂,是 Perl 的古怪传统),那没办法,只能给你一次机会。

好消息是,这些东西已经被主要的 Perl 利益相关者在生产环境中进行了测试。这不是纸上谈兵:我们已经在做了,一些粗陋的地方正在调整打磨。

而且,v5.32 中已经有了一些这些旋钮和拨盘,比如,你可以这样关闭间接对象表示:

no feature qw(indirect);

预期会有更多的旋钮或拨盘,或许像这样:

no multidimensional;
no bareword::filehandle;

我在《为 Perl 7 做准备》一书中收集了所有这些信息,这是我通过 Perl School 和 LeanPub 提供的最新产品。

硬核老王:本文作者 brian d foy 也是《 精通 Perl ( Mastering Perl ) 》 的作者,我是这本书是中文译者之一。

一句话总结

Perl 7 是 v5.32,设置不同而已。你的代码如果不是乱七八糟的,应该可以用。预计一年内会有用户发布。

硬核老王:作为一个老 Perl 程序员,这个消息让我又动心了,认真考虑是不是再投回 Perl 的怀抱,哦不,是 Perl 7 的怀抱。

适用于 Linux 的微软反病毒软件 Microsoft Defender ATP 正式上线

微软今天宣布了适用于 Android 的 Microsoft Defender ATP 首个预览版,同时还宣布适用于 Linux 的 Microsoft Defender ATP 正式上线。微软还承诺,将在未来几个月内为它带来多项新功能。

来源:cnBeta.COM

拍一拍:不知道 ATP 能防范多少“Linux 病毒”?

Red Hat 报告了一个可导致拒绝服务的安全问题

根据描述,Red Hat 内核在“ 关联数据的身份验证加密 uthenticated Encryption with Associated Data ”(AEAD)中存在缺陷,这是一种加密技术。该问题在 17 个月前也就是 19 年 1 月的 Linux LTS 内核上游中已经修复过了,此次发现这一特定下游问题,应当是 LTP 测试未通过导致的。因此,邮件中提醒:“大多数 Linux 内核已经修复了这一错误,而没有在 LTP 中添加回归测试,这意味着挑选特定内核补丁来修复 LTP 问题不如合并所有 LTS 内核修复程序来得稳妥。”

来源:开源中国

拍一拍:内核发行版的碎片化问题也需要重视起来。

欧盟承认 GDPR 实施有难度

欧盟的一份官方报告透露,生效已有两年的数据保护法规 GDPR 正被证明难以实施,而且给中小企业和那些开发新技术的企业带来特别沉重的负担。

来源:solidot

拍一拍:法规跟不上技术发展。

苹果中国应用商店将下架数千未获版号的手游

中国要求付费或提供应用内购买的手游递交进行审查以获得出版发行的版号。中国主要 Android 应用商店从 2016 年起就执行了这一政策,但苹果平台上有大量此类未获版号的手游。

来源:solidot

拍一拍:不是所有没有取得版号的游戏都是坏游戏。

用这些简化了 WebSockets 的开源支持工具来控制你的流媒体。

OBS 是现在视频直播的主流之一。它是直播流媒体到 Twitch 的首选软件,Twitch 是近来最受欢迎的视频直播网站之一。有一些非常好的附加组件,可以让流媒体人从他们的手机或另一个屏幕上进行控制,而不影响正在运行的视频。事实证明,使用 Node-RED 和 obs-websockets 插件来构建自己的控制面板真的很容易。

 title=

我的 OBS 控制仪表盘

我知道你们很多人在想什么 —— “他在同一句话中提到了 WebSockets 和简单?”很多人在设置和使用 WebSockets 时遇到了困难,WebSockets 允许通过 Web 服务器的单一连接进行双向通信。Node-RED 内置了对 WebSockets 的支持,是让这一切变得简单的原因之一,至少与编写自己的客户端/服务器相比是如此。

在开始之前,请确保你已经安装和配置了 OBS。首先下载并安装最新稳定版的 obs-websockets插件。对于本文来说,默认的设置就可以了,但我强烈建议你之后按照说明来保护 obs-websockets 的安全。

接下来,下载并安装 Node-RED,可以在同一个系统上,也可以在不同的系统上(比如树莓派)。同样,默认的安装对我们这篇文章来说是够了,但最好按照他们网站上的指示进行安全安装。

现在是有趣的部分。启动 Node-RED,打开网页界面(默认在 http://localhost:1880),你有了一个空白的画布。打开右边的“汉堡”菜单,选择“ruby管理口味rtManagePalate/rt/ruby”。然后点击“安装”标签,搜索 node-red-contrib-dashboard 和 node-red-contrib-rbe 模块。

安装好这些模块后,点击右侧列表,将以下模块拖拽到画布上。

  • 1 Websocket Out
  • 1 Websocket In
  • 1 Debug
  • 1 Inject
  • 1 Switch
  • 1 Change
  • 2 JSON
  • 1 Catch

以下列顺序连接它们:

Inject->Button->Change->JSON->Websocket Out

Websocket In->JSON->Switch->RBE->Debug

Catch->Debug

 title=

基本流程

当 “Button” 被按下时(或 “Inject” 节点发送一个时间戳),有效载荷通过 “change” 节点发送,从 JSON 对象转换为字符串,然后发送到 “WebSocket Out” 节点。当 “WebSocket In” 节点收到消息后,会将其转换为 JSON 对象,如果不是重复的,则发送到 “Debug” 节点进行输出。而 “Catch” 节点会捕捉到任何错误,并将其放入 “Debug” 面板中。

那有效载荷里有什么呢?让我们设置好一切,一探究竟。

首先,双击 “Button” 打开设置对话框。先使用下拉菜单将有效载荷改为 “JSON”。在该字段中,添加以下内容:

{"request-type":"GetVersion"}

启用 “If msg arrives on input, emulate a button click” 复选框,然后点击 “Done” 关闭 “Button” 配置。当消息从 “Inject” 节点传来时,或者 UI 中的 “Button” 被按下,它将把 JSON 有效载荷发送到下一个节点。

 title=

设置 “Button”

现在打开 “Change” 节点。我们要将 msg.payload.message-id 设置为 msg._msgid,方法是将第一个字段从 payload改为 payload.message-id,然后使用第二个字段的下拉菜单将类型从 String 改为 msg.,然后我们将 _msgid 放入该字段。这样就会把唯一的消息 ID 复制到 JSON 对象的有效载荷中,这样每个请求就有一个唯一的 ID 进行跟踪。

然后将其发送到 “JSON” 节点,以便将 JSON 对象转换为字符串,然后传递给 “Websocket Out” 节点。打开 “Websocket Out” 节点,配置到 OBS 的连接。首先,将 Type 更改为 Connect to,然后单击铅笔图标以创建新的连接 URL。将其设置为 ws://OBSMachine:4444/,然后关闭对话框进行保存。OBSMachine 是 OBS 和 obs-websocket 运行的机器名称。例如,如果 Node-RED 运行在同一台机器上,则为 ws://localhost:4444,如果是在名为 luxuria.local 的机器上,则为 ws://luxuria.local:4444。关闭并更新 “Websocket Out” 节点。这将向 OBS 中的 WebSocket 发送有效载荷文本字符串。

 title=

“Websocket Out” 节点配置

进入 “WebSocket In” 流程!打开 “WebSocket In” 节点,并对其设置 Type 为 Connect to 和我们之前定义的连接的 URL(应自动填充)。接下来是第二个 “JSON” 节点,我们可以不用管它。它接受 OBS 的输出,并将其转换为有效载荷对象。

接下来,我们将从中过滤出常规的心跳和状态更新。打开 “Switch”,将 Property 值设置为 payload["update-type"]。现在从它下面的下拉菜单中选择 Is Not Null。点击 + 添加第二个选项,并从下拉菜单中选择 otherwise。

 title=

“Switch” 节点配置

将 “Switch” 上的新输出直接连接到 “Debug” 节点的输入。

RBE 节点将过滤掉重复的内容,需要告诉它要观察什么字段。由于它应该连接到 “Switch” 的输出,而它只发送状态更新,所以这一点很重要,因为 obs-websocket 每隔几秒钟就会发送更新。默认情况下,RBE 会比较整个有效载荷对象,它将不断变化。打开 RBE 节点,将 Property 从 payload 改为 payload.streaming。如果 payload 的 streaming值发生了变化,那么就把消息传递过去,否则就丢弃。

最后一步是将 “Debug” 节点的输出从 msg.payload 改为完整的 msg 对象。这使我们能够看到整个对象,有时在 payload 之外还有有用的信息。

现在,单击 “Deploy” 以激活更改。希望 WebSocket 节点下面会有绿色的 Connected 消息。如果它们是红色或黄色的,则连接 URL 可能不正确,需要更新,或者连接被阻止。请确保远程机器上的 4444 端口是开放的、可用的,并且 OBS 正在运行!

如果没有 RBE 节点对 streaming 值的过滤,调试面板(点击画布右侧的“虫子”图标)大约现在就会被心跳消息填满。点击 “Inject” 节点左边的按钮,发送一个模拟按钮点击的信号。如果一切顺利,你应该会看到一个对象到达,它有一个 obs-websocket 可以做的所有事情的列表。

 title=

对 “GetVersion” 的回应

现在在另一个标签或窗口中打开 http://localhost:1880/ui。它应该显示一个单一的按钮。按下它! 调试面板应该会显示和之前一样的信息。

恭喜你!你已经发送了你的第一个(希望不是最后一个)WebSocket 消息!

这只是使用 obs-websockets 和 Node-RED 可以做的事情的起步。支持的完整文档记录在 obs-websockets 的 GitHub 仓库的 protocol.md 文件中。通过一点点的实验,你可以创建一个功能齐全的控制面板来启动和停止流媒体、改变场景,以及更多。如果你和我一样,在意识到之前,你就可以设置好各种控件了。

 title=

如此多的能力让我有点疯


via: https://opensource.com/article/20/6/obs-websockets-streaming

作者:Kevin Sonney 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出