我想做一个简单的网络服务器,如果我或其他人访问该网址https://example.com/playalarm,它会在我的盒子上连接的扬声器上播放指定的音频文件。
使用终端播放器 ffplay、mplayer、vlc 等等。
我怎样才能做到这一点?
答案1
概述
这可以通过命令行脚本或通过运行的可执行文件来实现电脑生成图像处理(也许快速CGI)。具体如何实现所需的行为将取决于服务器软件以及您选择实现该行为的编程或脚本语言。
CGI 与 FastCGI
CGI 是较旧的协议,总体上可能更容易实现。但是,它在处理大量请求时扩展性不佳,因此开发了 FastCGI。对于您的情况,可以使用任一协议,但此决定可能主要受您运行的 Web 服务器的影响。Apache 支持 CGI 和 FastCGI,而 Nginx 仅支持 FastCGI。
CGI 和 FastCGI 脚本通常以 C/C++(作为可执行程序)或流行的脚本语言(如 Python、Perl 和 Ruby)实现(作为脚本)。无论您选择哪种语言,CGI 都应支持上述所有语言(至少)。在将上述脚本语言用于任何 CGI 脚本之前,应先将其安装在您的系统上。
请注意,我在这个答案中特别忽略了 WSGI/uWSGI 或其他特定于语言的协议。
Python CGI 脚本示例
为了使事情相对简单,以下脚本是用 Python 编写的,并使用基本 CGI 通过 Apache 调用。此脚本假定您使用的 URL 直接调用此脚本(例如https://example.com/playalarm指的是https://example.com/playalarm.py)。
例如 playalarm.py
#!/path/to/python3
# A CGI script in Python to play a sound with ffplay when a URL is accessed.
# This script assumes Python 3.5 or higher is being used and that the
# script itself resides in a directory has been properly configured
# to allow CGI script execution.
# --- Play Sound ---
# Our script commands having nothing to do with our HTML document (below).
# We use ffplay to play our audio file. Note that we likely need to use
# "-nodisp -autoexit" to keep the script from "hanging" indefinitely.
# Alternately, you can try 'ffplay -nodisp -autoexit sound.mp3 >/dev/null 2>&1' (as needed).
# The line below assumes beep.mp3 resides in our script directory.
# You can specify a full path to the audio clip as necessary.
import os
import subprocess
subprocess.run ('ffplay -nodisp -autoexit beep.mp3')
# --- HTML Document ---
# Since this is a standard CGI script, we are expected to return
# e.g. a standard HTML document. In fact, we need to return e.g. a
# document to avoid an internal server error.
# The following lines (or something very similar) are required,
# regardless of CGI script type.
# print ("Content-type: text/plain")
print ("Content-type: text/html")
print ("")
# We can leave the script here. A blank page will be displayed
# but the script should execute successfully.
# However, we have decided to return an HTML 5 document that
# instantly redirects to another page (e.g. example.com).
# But this is just an example.
print ("<!doctype html>")
print ("<html>")
print ("")
print ("<head>")
print (' <meta http-equiv="Refresh" content="0;url=http://example.com">')
print ("</head>")
print ("")
print ("<body>")
print ("</body>")
print ("")
print ("</html>")
注意事项
正如评论中提到的,您可能需要解决许多问题才能允许此脚本(或您最终使用的脚本)在目标系统上运行。这个问题并非旨在解决服务器环境、Web 服务器配置、权限、脚本是否可以执行、安全问题、更高级的脚本或程序实现等问题。只需注意,您可能还有额外的工作或问题需要解决。