繁体   English   中英

Python 子进程调用 VLC 命令

[英]Python subprocess calling VLC command

我有以下命令,在 Windows CLI 中可以正常工作:

"G:\VLC\vlc" --dshow-vdev="Video (00 Pro Capture HDMI 4K+)" --dshow-size=1920x1080 -V dummy --intf=dummy --dummy-quiet --video-filter=scene --no-audio --scene-path="C:\<User>\My location" --scene-format=jpeg --scene-prefix=test_file --scene-replace --run-time=1 --scene-ratio=24 "dshow://" vlc://quit

这会拍摄我的采集卡显示的任何内容的快照并将其保存到文件中。 当我像这样尝试使用 Python 时:

import os
import subprocess

path = "C:\\<User>\\My location"
fname = "test_file"

os.chdir('G:\\VLC')
process = subprocess.Popen(['vlc', ' --dshow-vdev="Video (00 Pro Capture HDMI 4K+)"', ' --dshow-size=1920x1080', ' -V dummy', ' --intf=dummy', \
                            ' --dummy-quiet', ' --video-filter=scene', \
                            ' --no-audio' ,path, ' --scene-format=jpeg', ' --scene-prefix=', fname, \
                            ' --scene-replace', ' --run-time=1', ' --scene-ratio=24', ' "dshow://"', ' vlc://quit'])

我在 VLC 日志中得到以下内容,但没有截取屏幕截图:

filesystem error: cannot open file G:\VLC\ --dshow-vdev="Video (00 Pro Capture HDMI 4K+)" (Invalid argument)
dvdnav error: Could not open G:\VLC\ --dshow-vdev="Video (00 Pro Capture HDMI 4K+)" with libdvdcss.
dvdnav error: Can't open G:\VLC\ --dshow-vdev="Video (00 Pro Capture HDMI 4K+)" for reading
dvdnav error: vm: failed to open/read the DVD

谁能向我解释问题是什么?

shlex可以帮助您解决这类问题。

shlex class 使得为类似于 Unix shell 的简单语法编写词法分析器变得容易。 这对于编写小型语言(例如,在 Python 应用程序的运行控制文件中)或解析带引号的字符串通常很有用。

import shlex
shlex.split(string)提出以下建议:

['G:\\VLC\\vlc', '--dshow-vdev=Video (00 Pro Capture HDMI 4K+)', '--dshow-size=1920x1080', '-V', 'dummy', '--intf=dummy', '--dummy-quiet', '--video-filter=scene', '--no-audio', '--scene-path=C:\\<User>\\My location', '--scene-format=jpeg', '--scene-prefix=test_file', '--scene-replace', '--run-time=1', '--scene-ratio=24', 'dshow://', 'vlc://quit']

我遇到了同样的问题,但无法用 shlex 解决。 我的代码:

import os
import shlex
import subprocess

cwd = os.getcwd()                         #working directory: video to be played is stored here
cmd = shlex.split("--random --no-loop")   #additional commands for vlc

p = subprocess.Popen(["C:/Program Files/VideoLAN/VLC/vlc.exe", cwd, cmd], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)

我也试过:

cmd = '--random --no-loop'

cmd = "--random --no-loop"

两者都不起作用。 开始:

vlc.exe --random --no-loop 

通过 windows 中的命令提示符可以正常工作。 有没有人知道如何在不使用 *.bat 文件的情况下解决这个问题?

对于之前的误会,我深表歉意。 现在我实际上有一个答案:

我使用以下语法让它工作:

# Play Video without Loop, Random and start Paused
cmd1 = "--random"
cmd2 = "--no-loop"
cmd3 = "--start-paused"

cwd = os.getcwd() 

p = subprocess.Popen(["C:/Program Files/VideoLAN/VLC/vlc.exe", cwd, cmd1, cmd2, cmd3], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)

如您所见,这些命令在语法中不得包含空格,并且我将字符串分隔在不同的变量中。 此外,对于命令使用 ' 或 " 可能并不重要。这两种方式都有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM