非阻塞模式下如何使用subprocess.run()执行ffmpeg命令?
时间: 2024-09-19 10:12:16 浏览: 61
在非阻塞模式下,你可以使用Python的`subprocess.Popen`函数结合`start_new_thread`或者`threading.Thread`来实现实时执行`ffmpeg`命令,而不是直接通过`subprocess.run()`,因为`run()`会阻塞直到命令执行完成。这里是一个例子:
```python
import subprocess
import threading
def run_ffmpeg(command):
# 创建进程对象,设置stdout和stderr为PIPE以便捕获输出
ffmpeg_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
# 使用线程处理输出
def handle_output():
for line in iter(ffmpeg_process.stdout.readline, b''):
print(line.decode()) # 打印日志或者做其他处理
thread = threading.Thread(target=handle_output)
thread.start() # 启动新线程处理输出
# 等待进程结束,如果需要可以设置一个超时时间
try:
ffmpeg_process.wait(timeout=60) # 这里假设你希望最多等待60秒
except subprocess.TimeoutExpired:
ffmpeg_process.kill() # 如果超时则强制停止进程
# 示例ffmpeg命令
command = 'ffmpeg -i input.mp4 output.mp4'
# 在新的线程中运行ffmpeg
run_ffmpeg(command)
# 这样主线程不会阻塞,而是立即返回,后续可以根据需要继续执行其他任务
```
阅读全文