Python - Как обработать ошибку для RTSP-ссылки - PullRequest
0 голосов
/ 31 марта 2020

Я создал сценарий python, который проверяет несколько разных URL-адресов и портов и обнаруживает, есть ли на них поток RTSP - он работает нормально, но создает ошибки, когда поток не существует (который я ' буду явно ожидать).

Я получаю [rtsp @ 0x16745c0] method DESCRIBE failed: 451 ERROR

Что я хочу сделать, это добавить строку в мой скрипт, поэтому, если я получаю вышеуказанную ошибку, я просто отображаю ее в сообщении на экране. Я безуспешно пробовал следующее:

for x in feedList:

    print("[INFO] Checking Link..." + x)

    cap=cv2.VideoCapture(x)

    try:

        # Check if camera opened successfully
        if (cap.isOpened()== True): 
            streamlink = x
            print("[INFO] FOUND! Stream Link..." + x)
            break
    except socket.error:
        print("[NO STREAM]" + x)
    except:
        print("[FAILED]" + x)
        pass

За исключением случаев, когда меня никогда не бьют, я всегда просто получаю [rtsp @ 0x16745c0] method DESCRIBE failed: 451 ERROR

Любая помощь будет оценена.

Спасибо Крис

1 Ответ

1 голос
/ 31 марта 2020

Если поток по ссылке не существует, создание объекта VideoCapture по этой ссылке все равно будет успешным, но вы не сможете обработать объект.

Вы управляете потоком кода, который, возможно, входит и проверяет if (cap.isOpened()== True), но нет блока else для обработки того, что произойдет, если if (cap.isOpened() != True). Поэтому просто попробуйте добавить блок else, чтобы отобразить сообщение об ошибке.

for x in feedList:

    print("[INFO] Checking Link..." + x)

    cap=cv2.VideoCapture(x)

    try:   
        # Check if camera opened successfully
        if (cap.isOpened()== True): 
            streamlink = x
            print("[INFO] FOUND! Stream Link..." + x)
            break
        # Else is important to display error message on the screen if can.isOpened returns false
        else
            print("[NO STREAM]" + x)
    except socket.error:
        print("[NO STREAM]" + x)
    except:
        print("[FAILED]" + x)
        pass

Если это не сработает: решение проблемы может быть выполнено в следующих случаях:

One из основных проблем является то, что каждый производитель камер использует свой собственный протокол (форматирование RTSP URI). Поиск правильного URL для вашей IP-камеры может быть разочаровывающим и затратным по времени. Когда найден, вы можете попробовать открыть его с помощью VL C, а затем с помощью Kerberos.io.

В зависимости от формата URI RTSP, вещи могут go ошибаться, например, при использовании формата, подобного выше , Для решения проблемы вам необходимо добавить знак вопроса "?" в конце URL.

В качестве примера можно привести исходную ссылку:

rtsp://192.168.2.109:554/user=admin&password=mammaloe&channel=1&stream=0.sdp

Таким образом, с ? это будет:

rtsp://192.168.2.109:554/user=admin&password=mammaloe&channel=1&stream=0.sdp?

Источник

...