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

问题描述 投票:0回答:1

我正在教堂里制作一个带有视频制作设备的项目,我认为,如果看到完成并取得成功,对于那些使用类似设备的人来说,无论是在低级广播,工作室还是教堂,都会有很大的帮助。

这是我的情况。我有2个机器人PTZ摄像机,通过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

它的UDP数据包已经通过wireshark确认。

那么如何创建一个脚本来接受OSCchief(或原始的UDP协议,如果它更好)的输入并解析该文本或寻找特定的字符。这是OSCchief的样子

上次登录时间:2月20日星期三09:16:51关于ttys000 Video-Booth-Mac-Pro:~macpro2 $ oscchief listen 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表示无效。

如果有任何令人困惑的话,我道歉...因为有些令我感到困惑。我愿意做更多的研究!我不希望被勺子喂。非常感谢正确方向的任何指针。

谢谢!

-Zack

applescript
1个回答
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

要对此进行测试,请将以上脚本作为monitor保存在HOME目录中,并通过启动终端并运行来使其可执行:

chmod +x monitor

然后你可以运行它:

./monitor

然后,您可以通过启动Finder并按SHIFT⌘G并在弹出的框中键入/tmp来观看/tmp

在正常用例中,在macOS下,您将通过launchctl启动此脚本,以便它始终运行 - 在StackOverflow上有许多教程和示例。

然后,您更改名为cgi-bin/aw_ptz(其源代码我看不到)的CGI程序,以便根据sentinel文件的存在与否改变其行为。


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

  • 在CGI脚本周围放置一个包装器来拦截调用,
  • 将CGI脚本符号链接到原始版本或虚拟版本,具体取决于录制是否正在运行,
  • 创建一个ssh隧道到您在录制期间停止的CGI脚本,
  • 将记录状态存储在Redis中而不是存储在文件系统中。
© www.soinside.com 2019 - 2024. All rights reserved.