如何解析Apple Terminal或Applescript的响应?

时间:2019-02-20 19:14:06

标签: applescript

我正在教堂使用视频制作设备进行项目开发,我认为,如果能够顺利完成并取得成功,那么无论是在低级广播,演播室还是在房屋中使用此类设备的人,都将获得极大帮助崇拜。

这是我的情况。我有2个机器人PTZ摄像机,这些摄像机通过软件通过IP命令通过CGI进行控制(支持预设位置的Rocosoft PTZ Joy Sutd。根据人们在舞台上的位置,我可以轻松保存和调取其位置。我拥有Blackmagic设计ATEM视频切换器,它将这两个摄像头输入并设置为我们的程序输出。

这是问题所在:在ATEM程序输出为BAD时,人们可能会意外地单击预设的其他位置。当PTZ从一个位置跳到另一个位置时,这会导致类似过山车的运动。

这里是我认为的解决方案是:我需要监视ATEM切换器的状态并创建一个applescript或其他东西,以便首先检查ATEM切换器的状态,查看PTZ凸轮是否在程序输出中处于活动状态,并阻止如果该摄像机是实时摄像机,则软件会提供预设命令。

我可以使用称为OSCchief(开放声音控制协议)的终端中的命令行工具接收ATEM的状态,该工具将监听ATEM并提供所有程序/预览值的状态。该软件还将发送OSC命令。

不确定这是否有帮助,但是我认为该OSCchief命令行工具必须基于Blackmagic ATEM的原始协议UDP,该协议已由Skaarhoj反向工程,并记录在其github页面上。

https://www.skaarhoj.com/fileadmin/BMDPROTOCOL.html

已通过Wireshark确认的UDP数据包。

那么我该如何制作一个脚本,该脚本使用OSCchief(或者最好是原始UDP协议)的输入并解析该文本或查找特定字符。这是OSCchief的样子

最后一次登录:ttys000上的2月20日星期三09:16:51 Video-Booth-Mac-Pro:〜macpro2 $ oscchief听4444 开始在端口“ 4444”上侦听传入的OSC消息...

/atem/program/0 f 0.000000
/atem/program/1 f 0.000000
/atem/program/2 f 0.000000
/atem/program/3 f 0.000000
/atem/program/4 f 1.000000
/atem/program/5 f 0.000000
/atem/program/6 f 0.000000
/atem/program/7 f 0.000000
/atem/program/8 f 0.000000
/atem/program/9 f 0.000000
/atem/program/10 f 0.000000
/atem/program/11 f 0.000000
/atem/program/12 f 0.000000

字母f后面的数字发生变化。 1.00 ...表示输出有效,0无效。

如果造成任何混乱,我深表歉意。因为,好吧,其中有些使我感到困惑。我愿意做更多的研究!我不希望被人喂饱。非常感谢任何正确方向的指点。

谢谢!

-扎克

1 个答案:

答案 0 :(得分:0)

这是一个仅使用文件系统在两个进程之间进行通信的非常简单的想法。还可以使用其他方法,但这很简单...

连续监视oscchief的输出,如果正在进行记录,则创建一个名为/tmp/RECORDING的文件,如果没有,则删除该文件。然后,其他过程(例如CGI)可以简单地检查文件是否存在,以了解记录是否处于活动状态,以及是否应禁止命令。

#!/bin/bash
################################################################################
# monitor
# Mark Setchell
#
# Continuously monitor the output of the "oscchief" program to determine if a
# recording is in progress. If it is, create a sentinel file in /tmp that other
# processes (e.g. CGIs) can check in order to find recording status. Delete the
# file if recording is not taking place, or when exiting so that programs will
# not be prevented from running.
################################################################################

SentinelFile="/tmp/RECORDING"

# Add the directory containing "oscchief" below
PATH="$PATH":/path/to/directory/containing/oscchief

# Called when program is terminated
cleanup(){
    echo "Cleaning up..."
    rm "$SentinelFile" 2> /dev/null
}

trap 'cleanup' SIGINT SIGABRT SIGQUIT SIGTERM

# Continuously tail the output of "oscchief"
oscchief | while read -r line ; do
    # If line contains "1.00" recording is active
    if [[ $line == *"1.00"* ]]; then
        touch "$SentinelFile"
    else
        rm "$SentinelFile" 2> /dev/null
    fi
done

要对此进行测试,请将上面的脚本保存在HOME目录中为monitor,并通过启动Terminal并运行以下命令使其可执行:

chmod +x monitor

然后可以使用以下命令运行它:

./monitor

然后您可以通过启动 Finder 并按 SHIFT G 并输入以下内容来观看/tmp /tmp到弹出的框中。

在正常使用情况下,在macOS下,您可以通过launchctl启动此脚本,以使其始终运行-StackOverflow上有很多教程和示例。

然后,您更改名为cgi-bin/aw_ptz的CGI程序(我无法看到其源代码),以便根据是否存在前哨文件来更改其行为。


想到您解决某些问题的其他可能性:

  • 在CGI脚本周围放置一个包装器以拦截调用,
  • 根据录制是否正在运行,将您的CGI脚本符号链接到原始版本或虚拟版本,
  • 为您在录制过程中停止的CGI脚本创建ssh隧道,
  • 在Redis中而不是在文件系统中存储记录状态。