Video streaming

Ticketa

Registered
Привет,
има ли някой запознат с видео стрийминга?

Имам 2 сървъра като всеки един е разположен на домейн и под домейн:

Искам да направя в site.com потребителите да могат да създават собствени видео стриймове (live) през телефони, лаптопи или каквото там е устройството, за целта съм им генерирал уникални ключове и така, когато искат да покажат някакъв стрийминг може да се гледа на примерен адрес: https://site.com/live/user/kO3r9iewqddpokaads

Обаче имам проблем с (предполагам) настройването на RTMP сървъра.

Имам инсталиран Debian 11, nginx и модула за RTMP. Имам и примерна настройка:

Код:
rtmp {
  server {
    listen 1935;
    chunk_size 4096;
    application live {
      live on;
    }
  }
}


(вероятно с времето доста ще се разшири, като цяло дори и да се налага да се ползват load balancers не е проблем, ако се стигне до голямо натоварване)

В site.com съм сложил (за тест) следният код:

site.com/test.php
Код:
<?php
// Генериране на случайно число с фиксирана дължина
function generateRandomString($length = 10) {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

// Генериране на уникален ключ за потребител А
$stream_key = generateRandomString();
?>

<!DOCTYPE html>
<html>
<head>
    <title>Live Streaming</title>
</head>
<body>
    <h1>Live Streaming</h1>
    <p>Твоят стрийминг ключ: <?php echo $stream_key; ?></p>

    <video id="player" autoplay muted></video>
    <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
    <script>
        var streamKey = '<?php echo $stream_key; ?>';
        var videoPlayer = document.getElementById('player');

        if (Hls.isSupported()) {
            var hls = new Hls();
            var streamUrl = 'https://rtmp.site.com/live/' + streamKey + '/index.m3u8';
            hls.loadSource(streamUrl);
            hls.attachMedia(videoPlayer);
            hls.on(Hls.Events.MANIFEST_PARSED,function() {
              videoPlayer.play();
            });
        }
    </script>
</body>
</html>

Като идеята ми е тук този който пуска стрийминга да се "самогледа". като пък друг код ще бъде за "посетителите"/"гледачите", той съответно трябва да зареди това което се се стриймва с този stream_key (по-горе е просто пример, все още не се ползват данните от базата данни).

Код:
<!DOCTYPE html>
<html>
<head>
    <title>Гледайте стрийминг</title>
    <link href="https://vjs.zencdn.net/7.8.4/video-js.css" rel="stylesheet" />
    <script src="https://vjs.zencdn.net/7.8.4/video.js"></script>
</head>
<body>
    <h1>Гледайте стрийминг DOISAoijdsaewq21</h1>

    <div class="video-container">
        <video-js id="player" class="vjs-default-skin" controls preload="auto" width="640" height="264">
            <source src="https://rtmp.site.com/live/DOISAoijdsaewq21/index.m3u8" type="application/x-mpegURL">
        </video-js>
    </div>

    <script>
        var player = videojs('player');
        player.play();
    </script>
</body>
</html>

Въпроса е, че нищо не се стартира и реално комуникацията между

rtmp.site.com и site.com липсва. Някакви предложения?

това е и default на /etc/nginx/sites-available:
Код:
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;

    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }
}

server {
    listen 80;
    server_name rtmp.site.com;

    location / {
        return 301 https://$server_name$request_uri;
    }
}
server {
    listen 443 ssl;
    server_name rtmp.site.com;

    ssl_certificate /etc/letsencrypt/live/rtmp.site.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/rtmp.site.com/privkey.pem;

    location / {
        proxy_pass http://rtmp.site.com:1935;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Port 443;
    }
}

ЕДИТ: Сигурен съм, че съм изписал доста глупости за това, моля някой да удари едно туристко рамо
 
Последно редактирано:
Ти генерираш на сървър 1 ключа и го подаваш на сървър 2, който трябва да интерпретира този ключ и да започне споделянето на съдържанието. Сървър 2 връща ли ти за въпросният ключ някакво съдържание? На сървър 2 връщаш ли коректните хедъри за видеото?
 
Ти генерираш на сървър 1 ключа и го подаваш на сървър 2, който трябва да интерпретира този ключ и да започне споделянето на съдържанието. Сървър 2 връща ли ти за въпросният ключ някакво съдържание? На сървър 2 връщаш ли коректните хедъри за видеото?

Изглежда, че Сървър 2 не връща никаква информация и дава 504 Timeout
 
Изглежда, че Сървър 2 не връща никаква информация и дава 504 Timeout
А какъв код използваш на сървър 2, да връща информацията?

 
А какъв код използваш на сървър 2, да връща информацията?

Амии .. никакъв хахахахахаха, имам само конфигурацията на RTMP, която по-горе споделих. Реално, аз си мислех, че самият RTMP просто връща някаква информация

rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
}
}
}

Тоест, трябва да имам и някаква PHP част на Сървър 2, където е RTMP ?
 
А какъв код използваш на сървър 2, да връща информацията?

Амии .. никакъв хахахахахаха, имам само конфигурацията на RTMP, която по-горе споделих. Реално, аз си мислех, че самият RTMP просто връща някаква информация

rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
}
}
}

Тоест, трябва да имам и някаква PHP част на Сървър 2, където е RTMP ?
Трябва да си прегледам архивите, защото не си спомням как го правих преди години. По спомен имаше хибриден вариант RTMP да се обработва и с PHP а след това да връща, но имаше някакви проблеми и мисля, че с един колега го настройвахме по подобен на теб начин в чиста форма и само плеър. Просто в момента наистина съм забравил. С години не ми се е налагало и не съм се занимавал по-сериозно с видеосъдържание.
 

Back
Горе