Недопустимый аргумент вызова подпроцесса или опция не найдена - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь вызвать команду ffmpeg с помощью subprocess.call () в linux, но не могу получить правильные аргументы.До этого я использовал 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.

Спасибо

1 Ответ

0 голосов
/ 14 сентября 2018

Вы должны разделить параметры:

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

ffm_input, ffm_rate, ffm_format должны содержать только значение:

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

Когда вы передаетеlist анализ не выполняется, поэтому -r 5 принимается как один аргумент, но программа ожидает, что вы предоставите два отдельных аргумента -r, за которыми следует 5.


В основном, если вы поставите их какотдельный элемент в списке, как если бы вы указали их в командной строке:

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

В первом примере echo видит один аргумент -n hello.Поскольку он не соответствует ни одной опции, он просто печатает его.Во втором случае echo видит два аргумента -n и hello, первый является допустимой опцией для подавления конца строки, и, как вы можете видеть, приглашение выводится сразу после hello, а не в отдельной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...