我想使用python程序将不同的视频发送到不同的设备。
我的计划是使用ffmpeg来控制视频和目的地(我可以使用os.system为一个目的地这样做(,但我不知道如何编写并发的ffmpeg命令,以便在不同的设备上同时播放6个视频。
起初我认为我可以使用tmux,但我找不到如何在python程序中控制/访问不同tmux窗口的解决方案。我是不是错过了一些显而易见的东西?
您可以使用python子流程模块来实现这一点:https://docs.python.org/3/library/subprocess.html
作为一个简单的例子,我将运行一个Linux实用程序"sleep",它只会等待给定的秒数。我将并行地做这件事,看看我们真的可以通过并行的子流程来做到这一点。作为第一个设置,我做:
import os
import subprocess
import time
n_jobs = 5
sleeping_time_in_sec = 10
shell_command_with_arguments = ["sleep", f"{sleeping_time_in_sec}s"]
我正在导入"子流程"以并行启动作业。我将使用"时间"模块来测量总运行时间。我将使用"os"模块来阻止脚本,直到所有作业都完成。shell命令看起来像"sleep 10s",但对于子进程,您可以将脚本和所有参数放在一个列表中。
提交这样的作业:
time_start = time.time()
jobs = list()
for counter in range(n_jobs):
process = subprocess.Popen(shell_command_with_arguments, shell=False)
jobs.append(process)
现在,每项耗时10秒的5个作业都已提交。为了让你的脚本等待最后一个过程完成,你可以添加:
print(f"Waiting for all {n_jobs} processes to finish...")
for ip, process in enumerate(jobs):
try:
os.waitpid(process.pid, 0)
except ChildProcessError:
print(f"No more: {ip} : {process.pid}")
else:
print(f"DONE: {ip} : {process.pid}")
最后,我报告了总运行时间:
time_end = time.time()
delta_time = time_end - time_start
print(f"Run {n_jobs} jobs taking {sleeping_time_in_sec} s each in {delta_time} s")
脚本的输出看起来像:
Waiting for all 5 processes to finish...
DONE: 0 : 88988
DONE: 1 : 88989
DONE: 2 : 88990
DONE: 3 : 88991
DONE: 4 : 88992
Finished running 5 jobs each taking 10 s in 10.022365093231201 s
正如你所看到的,如果你连续运行sleep命令5次,需要50秒。但由于脚本需要10秒多一点的时间,你可以看到这些作业确实是并行运行的。