【问题标题】:Subprocess call invalid argument or option not found未找到子进程调用无效参数或选项
【发布时间】:2018-09-14 13:59:39
【问题描述】:

我正在尝试在 Linux 上使用 subprocess.call() 调用 ffmpeg 命令,但我无法正确获取参数。之前我用过 os.system 也可以,但是不推荐这种方式。

使用带有破折号的参数(例如“-i”)会出现此错误

Unrecognized option 'i "rtsp://192.168.0.253:554/user=XXX&password=XXX&channel=0&stream=0.sdp?real_stream"'.
Error splitting the argument list: Option not found

使用不带破折号的参数(如“i”)会出现此错误

[NULL @ 0x7680a8b0] Unable to find a suitable output format for 'i rtsp://192.168.0.253:554/user=admin&password=&channel=0&stream=0.sdp?real_stream'
i rtsp://192.168.0.253:554/user=XXX&password=XXX&channel=0&stream=0.sdp?real_stream: Invalid argument

这是代码

class IPCamera(Camera):
"""
    IP Camera implementation
"""
def __init__(self,
             path='\"rtsp://192.168.0.253:554/'
                  'user=XXX&password=XXX&channel=0&stream=0.sdp?real_stream\"'):

    """
        Constructor
    """
    self.path = path

def __ffmpeg(self, nb_frames=1, filename='capture%003.jpg'):
    """
    """

    ffm_input = "-i " + self.path
    ffm_rate = "-r 5"
    ffm_nb_frames = "-vframes " + str(nb_frames)
    ffm_filename = filename

    if platform.system() == 'Linux':
        ffm_path = 'ffmpeg'
        ffm_format = '-f v4l2'

    else:
        ffm_path = 'C:/Program Files/iSpy/ffmpeg.exe'
        ffm_format = '-f image2'

    command = [ffm_path, ffm_input, ffm_rate, ffm_format, ffm_nb_frames, ffm_filename]
    subprocess.call(command)

    print(command)

顺便说一句,我在 MT7688 上运行此命令。

谢谢

【问题讨论】:

    标签: python ffmpeg subprocess


    【解决方案1】:

    你必须拆分选项:

    command = [ffm_path, '-i', ffm_input, '-r', ffm_rate, '-f', ffm_format, '-vframes',  ffm_nb_frames, ffm_filename]
    

    ffm_inputffm_rateffm_format 应该只包含值:

    ffm_input = self.path
    ffm_rate = '5'
    ffm_nd_frames = str(nb_frames)
    ffm_format = 'v412' if platform.system() == 'Linux' else 'image2'
    

    当您传递一个列表时,不会进行任何解析,因此-r 5 被视为单个参数,但程序希望您提供两个单独的参数-r,后跟5


    基本上,如果您将它们作为单个元素放在列表中,就好像您在命令行中引用它们一样:

    $ echo "-n hello"
    -n hello
    $ echo -n hello
    hello$
    

    在第一个示例中,echo 看到一个参数 -n hello。由于它不匹配任何选项,它只是打印它。在第二种情况下echo 看到两个参数-nhello,第一个是抑制行尾的有效选项,正如您所见,提示是在hello 之后打印的,而不是在它自己的行上。

    【讨论】:

    • 这是救命稻草!我知道如果我们很感激我们不应该发表评论,但是subprocess的文档中没有说明这一点
    猜你喜欢
    • 1970-01-01
    • 2018-03-29
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多