因此上下文:
我想制作一个 bash 终端命令,启动 VLC 来流式传输视频,然后当 VLC 不再处于前台时(当流式传输中断时间过长时,VLC 会自动转到后台),它将重复该命令以启动 VLC 再次进行流式传输。
我得到了单独的工作命令代码,但我不知道如何将它们合并为一个不断重复的命令。
- 要启动 VLC 并开始流式传输:
am start -a android.intent.action.VIEW -d rtsp://theurl
这将启动/将 RTSP 的默认应用程序(在本例中为 VLC)带到前台并开始流式传输。
- 检查 VLC 是否仍在前台
dumpsys activity activities | sed -e '/mResumedActivity/!d' -e '/vlc/!d'
当 VLC 处于前台时,这将返回类似这样的内容。
mResumedActivity: ActivityRecord{b43545d u0 org.videolan.vlc/.gui.video.VideoPlayerActivity t11827}
如果 VLC 不在前台,则终端将不会返回任何内容。
所以也许代码会做这样的事情?
每隔 1 秒检查一次 VLC 是否在前台(使用代码 2)。如果 VLC 不在前台,则使用流媒体 URL 启动 vlc(使用代码 1)。如果 vlc 在前台,则继续检查。
答案1
尝试这个循环:
while true; do
foreground="$(dumpsys activity activities | sed -e '/mResumedActivity/!d' -e '/vlc/!d')"
if [[ "$foreground" == "" ]]; then
am start -a android.intent.action.VIEW -d rtsp://theurl
fi
sleep 1
done
它只是检查am
命令是否不返回任何内容,如果返回,则启动 vlc。
答案2
我认为这是一个错误的命令,因为它故意制造 sed 错误,但它确实有效
watch -n1 'dumpsys activity activities | sed -e '/mResumedActivity/!d' -e '/vlc/!q100' || am start -a android.intent.action.VIEW -d rtsp://address;'
因此每次流中断时,它都会自动重新启动 vlc 并重新连接到流。