Python 启动带参数的 VLC
Python launching VLC with arguments
我在使用 python 脚本的参数启动 VLC 时遇到问题。我在 Win10 21H1 build 1081 上使用 python 3.9.6。
运行 此命令适用于 cmd.exe,我已将其翻译成 python 代码。
"C:\Program Files\VideoLAN\VLC\vlc.exe" -I dummy 1.m4a --sout="#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}:std{access=file{no-overwrite},mux=mp3,dst=1.mp3}" vlc://quit
我尝试了两种方法。在方法 1 中,我如下单独发送参数。
import subprocess as objSubProcess
strFileName = "1.m4a"
strNewFileName = "1.mp3"
g_strVLCPath = "C:\Program Files\VideoLAN\VLC\vlc.exe"
strCmd = []
strCmd.append(g_strVLCPath)
strLine = "-I dummy " + strFileName
strCmd.append(strLine)
strLine = "--sout=\"#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}:std{access=file{no-overwrite},mux=mp3,dst="
strLine = strLine + strNewFileName + "}\""
strCmd.append(strLine)
strCmd.append("vlc://quit")
# Run VLC
objSubProcess.run(strCmd)
此代码立即 returns。我的猜测是 VLC 会立即启动并退出。
在方法 2 中,我将所有参数合并为一个,如下所示。
import subprocess as objSubProcess
strFileName = "1.m4a"
strNewFileName = "1.mp3"
g_strVLCPath = "C:\Program Files\VideoLAN\VLC\vlc.exe"
strCmd = []
strCmd.append(g_strVLCPath)
strLine = "-I dummy " + "\"" + strFileName + "\" "
strLine = strLine + "--sout=\"#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}:std{access=file{no-overwrite},mux=mp3,dst="
strLine = strLine + strNewFileName + "}\"" + " vlc://quit"
strCmd.append(strLine)
# Run VLC
objSubProcess.run(strCmd)
此处 VLC 启动(正如我在任务管理器中看到的那样),但我的代码挂起并且 return 即使在很长一段时间后也没有。
在这两种情况下,我都没有得到我想要的 .mp3。
我做错了什么?
首先使用 subprocess.run() 方法的第二个参数为 vlc Subprocess management.
传递参数
subprocess.run() 方法的两个参数很有用:
- 如果capture_output为真,stdout和stderr将被捕获。
对故障排除很有用。
- 超时参数。如果超时
过期,子进程会被杀死等待
找到解决方案。我将带有所有参数的单个字符串作为简单字符串而不是数组传递。这是对我有用的代码。
import subprocess as objSubProcess
strFileName = "1.m4a"
strNewFileName = "1.mp3"
g_strVLCPath = "C:\Program Files\VideoLAN\VLC\vlc.exe"
strLine = "\"" + g_strVLCPath + "\" -I dummy " + strFileName
strLine = strLine + " --sout=\"#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}:std{access=file{no-overwrite},mux=mp3,dst="
strLine = strLine + strNewFileName + "}\""
strLine = strLine + " vlc://quit"
# Run VLC
objSubProcess.run(strLine)
如果要在列表中传递多个参数,则必须将所有参数分开:
strFileName = "1.m4a"
strNewFileName = "1.mp3"
g_strVLCPath = "C:\Program Files\VideoLAN\VLC\vlc.exe"
strCmd = [
g_strVLCPath,
"-I",
"dummy",
strFileName,
'--sout="#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}:std{access=file{no-overwrite},mux=mp3,dst=' + strNewFileName + '}"',
"vlc://quit"
]
# Run VLC
objSubProcess.run(strCmd)
在 Windows 上,shell=True
总是隐含的,因为 cmd.exe
的工作原理。这意味着 python 会将您的参数 assemble 放入单个命令行并转义或引用空格等内容。这对于理解为什么您的两种方法都不起作用至关重要。如果你想传入一个字符串,你可以直接在 Windows 上进行,但我仍然建议添加 shell=True
以明确你的意图:
strFileName = "1.m4a"
strNewFileName = "1.mp3"
g_strVLCPath = "C:\Program Files\VideoLAN\VLC\vlc.exe"
strCmd = f'{g_strVLCPath} -I dummy {strFileName} --sout="#transcode{{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}}:std{{access=file{{no-overwrite}},mux=mp3,dst={strNewFileName}}} vlc://quit'
# Run VLC
objSubProcess.run(strCmd, shell=True)
在您的第一次尝试中,您有一个包含 "-I dummy 1.m4a"
的列表元素。当您将其传递给 shell 时,它将变成字符串 包括 引号,因为您将其指定为包含空格的单个参数,而不是三个单独的参数.
在你的第二次尝试中,你或多或少正确地连接了参数,但没有将程序名称添加到字符串中。由于您传递的是一个列表,python 将用双引号将所有内容括起来并转义其中的所有引号。
我在使用 python 脚本的参数启动 VLC 时遇到问题。我在 Win10 21H1 build 1081 上使用 python 3.9.6。
运行 此命令适用于 cmd.exe,我已将其翻译成 python 代码。
"C:\Program Files\VideoLAN\VLC\vlc.exe" -I dummy 1.m4a --sout="#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}:std{access=file{no-overwrite},mux=mp3,dst=1.mp3}" vlc://quit
我尝试了两种方法。在方法 1 中,我如下单独发送参数。
import subprocess as objSubProcess
strFileName = "1.m4a"
strNewFileName = "1.mp3"
g_strVLCPath = "C:\Program Files\VideoLAN\VLC\vlc.exe"
strCmd = []
strCmd.append(g_strVLCPath)
strLine = "-I dummy " + strFileName
strCmd.append(strLine)
strLine = "--sout=\"#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}:std{access=file{no-overwrite},mux=mp3,dst="
strLine = strLine + strNewFileName + "}\""
strCmd.append(strLine)
strCmd.append("vlc://quit")
# Run VLC
objSubProcess.run(strCmd)
此代码立即 returns。我的猜测是 VLC 会立即启动并退出。
在方法 2 中,我将所有参数合并为一个,如下所示。
import subprocess as objSubProcess
strFileName = "1.m4a"
strNewFileName = "1.mp3"
g_strVLCPath = "C:\Program Files\VideoLAN\VLC\vlc.exe"
strCmd = []
strCmd.append(g_strVLCPath)
strLine = "-I dummy " + "\"" + strFileName + "\" "
strLine = strLine + "--sout=\"#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}:std{access=file{no-overwrite},mux=mp3,dst="
strLine = strLine + strNewFileName + "}\"" + " vlc://quit"
strCmd.append(strLine)
# Run VLC
objSubProcess.run(strCmd)
此处 VLC 启动(正如我在任务管理器中看到的那样),但我的代码挂起并且 return 即使在很长一段时间后也没有。
在这两种情况下,我都没有得到我想要的 .mp3。
我做错了什么?
首先使用 subprocess.run() 方法的第二个参数为 vlc Subprocess management.
传递参数subprocess.run() 方法的两个参数很有用:
- 如果capture_output为真,stdout和stderr将被捕获。 对故障排除很有用。
- 超时参数。如果超时 过期,子进程会被杀死等待
找到解决方案。我将带有所有参数的单个字符串作为简单字符串而不是数组传递。这是对我有用的代码。
import subprocess as objSubProcess
strFileName = "1.m4a"
strNewFileName = "1.mp3"
g_strVLCPath = "C:\Program Files\VideoLAN\VLC\vlc.exe"
strLine = "\"" + g_strVLCPath + "\" -I dummy " + strFileName
strLine = strLine + " --sout=\"#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}:std{access=file{no-overwrite},mux=mp3,dst="
strLine = strLine + strNewFileName + "}\""
strLine = strLine + " vlc://quit"
# Run VLC
objSubProcess.run(strLine)
如果要在列表中传递多个参数,则必须将所有参数分开:
strFileName = "1.m4a"
strNewFileName = "1.mp3"
g_strVLCPath = "C:\Program Files\VideoLAN\VLC\vlc.exe"
strCmd = [
g_strVLCPath,
"-I",
"dummy",
strFileName,
'--sout="#transcode{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}:std{access=file{no-overwrite},mux=mp3,dst=' + strNewFileName + '}"',
"vlc://quit"
]
# Run VLC
objSubProcess.run(strCmd)
在 Windows 上,shell=True
总是隐含的,因为 cmd.exe
的工作原理。这意味着 python 会将您的参数 assemble 放入单个命令行并转义或引用空格等内容。这对于理解为什么您的两种方法都不起作用至关重要。如果你想传入一个字符串,你可以直接在 Windows 上进行,但我仍然建议添加 shell=True
以明确你的意图:
strFileName = "1.m4a"
strNewFileName = "1.mp3"
g_strVLCPath = "C:\Program Files\VideoLAN\VLC\vlc.exe"
strCmd = f'{g_strVLCPath} -I dummy {strFileName} --sout="#transcode{{vcodec=none,acodec=mp3,ab=128,channels=2,samplerate=8000,scodec=none}}:std{{access=file{{no-overwrite}},mux=mp3,dst={strNewFileName}}} vlc://quit'
# Run VLC
objSubProcess.run(strCmd, shell=True)
在您的第一次尝试中,您有一个包含 "-I dummy 1.m4a"
的列表元素。当您将其传递给 shell 时,它将变成字符串 包括 引号,因为您将其指定为包含空格的单个参数,而不是三个单独的参数.
在你的第二次尝试中,你或多或少正确地连接了参数,但没有将程序名称添加到字符串中。由于您传递的是一个列表,python 将用双引号将所有内容括起来并转义其中的所有引号。