如何在Python 3中通过subprocess启动VLC并自动触发Ctrl+N快捷键
解决VLC自动打开RTSP链接的问题
先聊聊你遇到的核心问题:快捷键触发失败主要是因为模块导入冲突和没有等待VLC完全启动,不过其实还有更高效的方案可以跳过手动快捷键操作,直接让VLC启动就加载你的RTSP链接。
问题根源拆解
你当前代码里有两个关键问题导致键盘模拟失效:
- 模块导入冲突:同时导入了
keyboard原生模块和pynput.keyboard,后者会覆盖前者,导致其中一个模块的功能无法正常调用 - 无启动等待:脚本启动VLC后立刻触发快捷键,但此时VLC还在加载过程中,根本无法响应键盘事件
方案一:直接让VLC启动时加载RTSP链接(强烈推荐)
VLC本身支持在命令行参数里直接传入媒体链接,启动后会自动播放,完全不需要模拟键盘操作,这是最稳定可靠的方式。修改后的代码如下:
import os import platform import subprocess from subprocess import Popen, DEVNULL # 获取DVR参数 ip_adr = input("What is your DVR's ip address?: ") port = input("What is your DVR's RTSP port? (it should be 554 or else): ") username = input("What is your DVR's username? (The default is admin): ") password = input("What is your DVR's password?: ") linkurl = f"rtsp://{username}:{password}@{ip_adr}:{port}/Streaming/channels/1/" # 判断操作系统 nameos = platform.system() cmd = 'vlc' print(f"Your DVR rtsp link is: {linkurl}") # 直接将RTSP链接作为参数传给VLC if nameos == "Linux": Popen([cmd, linkurl], stderr=DEVNULL, stdin=subprocess.PIPE, shell=False) else: # Windows系统同样支持直接传链接参数 Popen([cmd, linkurl], stderr=DEVNULL, stdin=subprocess.PIPE, shell=False)
这个方案不需要任何键盘模拟模块,完全利用VLC的原生命令行特性,稳定性拉满。
方案二:修复键盘模拟功能(若必须用快捷键方式)
如果你坚持需要模拟Ctrl+N打开窗口并输入链接,那需要解决导入冲突和启动等待的问题,这里用pynput来实现:
import os import platform import subprocess import time from subprocess import Popen, DEVNULL from pynput.keyboard import Controller, Key # 获取DVR参数 ip_adr = input("What is your DVR's ip address?: ") port = input("What is your DVR's RTSP port? (it should be 554 or else): ") username = input("What is your DVR's username? (The default is admin): ") password = input("What is your DVR's password?: ") linkurl = f"rtsp://{username}:{password}@{ip_adr}:{port}/Streaming/channels/1/" # 判断操作系统 nameos = platform.system() cmd = 'vlc' print(f"Your DVR rtsp link is: {linkurl}") # 启动VLC进程 if nameos == "Linux": vlc_process = Popen([cmd], stderr=DEVNULL, stdin=subprocess.PIPE, shell=False) else: vlc_process = Popen([cmd], stderr=DEVNULL, stdin=subprocess.PIPE, shell=False) # 等待VLC完全启动(时长根据电脑性能调整,一般3-5秒) time.sleep(4) # 初始化键盘控制器 keyboard = Controller() # 模拟Ctrl+N打开媒体窗口 with keyboard.pressed(Key.ctrl): keyboard.press('n') keyboard.release('n') # 等待窗口弹出 time.sleep(1) # 输入RTSP链接 keyboard.type(linkurl) # 按回车确认播放 keyboard.press(Key.enter) keyboard.release(Key.enter)
注意事项:
- 先安装
pynput模块:pip install pynput - 调整
time.sleep()的时长,确保VLC完全加载后再触发键盘事件 - Linux系统可能需要额外的桌面权限来模拟键盘输入,建议在VS Code终端或图形化环境中运行
内容的提问来源于stack exchange,提问作者ShaheerDevOps
相关产品推荐
相关产品推荐

