Как можно отобразить MJPG поток с авторизацией digest?

Как можно показать видео с веб-камеры, которая использует basic авторизацию для доступа к видеопотоку через браузер?
  • 18 марта 2024 г. 23:29
Ответы на вопрос 2
1. Для отображения MJPG потока с авторизацией Digest можно использовать код на языке программирования Python с библиотекой OpenCV. Ниже приведен пример кода:

```python
import cv2

url = "http://username:password@ip_address:port/video.mjpg"

cap = cv2.VideoCapture(url)

while True:
    ret, frame = cap.read()
    
    if ret:
        cv2.imshow('MJPG Stream', frame)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
```

2. Для показа видео с веб-камеры с базовой авторизацией в браузере, можно использовать следующий HTML-код:

```html
<video controls>
  <source src="http://username:password@ip_address:port/video.mjpg" type="video/mjpeg">
  Your browser does not support the video tag.
</video>
```

Убедитесь, что заменены значения "username", "password", "ip_address" и "port" на соответствующие значения для вашего видеоисточника.
Это не будет работать в таком виде, потому что это на уровне браузера стоит защита от таких вот конструкций.  Вы правильно указали, что без PHP тут не обойтись. Я бы как-то решила этот вопрос: 

<?php
$url = 'http://192.168.1.8/cgi-bin/mjpg/video.cgi?channel=1&subtype=1';

// Функция для digest-авторизации
function digest_parse($txt)
{
    $needed_parts = array('nonce'=>1, 'realm'=>1, 'qop'=>1);
    $data = array();
    $keys = implode('|', array_keys($needed_parts));

    preg_match_all('@('.$keys.')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);

    foreach ($matches as $m) {
        $data[$m[1]] = $m[3] ? $m[3] : $m[4];
        unset($needed_parts[$m[1]]);
    }

    return $needed_parts ? false : $data;
}

// Инициализация cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);

// получения заголовков www-Authenticate
$response = curl_exec($ch);

// разбор заголовк а WWW-Authenticate
if (preg_match('/^WWW-Authenticate: Digest (.*)$/im', $response, $matches)) {
    $digest_parts = digest_parse($matches[1]);

    // Создание заголовка Authorization
    // Здесь также надо сгенерить правильный ответ на основе полученных данных и вашего логина и пароля
    // наподобие этого
    $digest_response = ''; // ответ

    // Установка опций для cURL с заголовком Authorization
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Digest username="adminka", realm="'.$digest_parts['realm'].'", nonce="'.$digest_parts['nonce'].'", uri="/cgi-bin/mjpg/video.cgi?channel=1&subtype=1", response="'.$digest_response.'", qop='.$digest_parts['qop'].', nc=00000001, cnonce="d41d8cd98f00b204e9800998ecf8427e"'));
}

// Удаление предыдущих заголовков
curl_setopt($ch, CURLOPT_HEADER, 0);

// Передача потока клиенту
curl_exec($ch);
curl_close($ch);
?>


Ну а потом уже смело в теге img можно сделать так:
<img src="вашскрипт.php" width="720" height="480">

Пример с PHP кодом не полный - я лишь натолкнула вас на мысль, как это может работать. Удачи!
Похожие вопросы