Задать вопрос
@karpo518

Почему не работает раздача hls через nginx-rtmp-module?

Наастраиваю рестримминг rtsp-потока через hls средствами nginx-rtmp-module и ffmpeg. Если на раздающем сервере выполнить rtmpdump -r "rtmp://127.0.0.1:1935/show/live" -v, то поток запускается. В это время в нужной папочке появляются файлы .m3u8 и .ts. Но при запросе файла .m3u8 по http файл не создается и не отдается.

По сути имею 2 проблемы:

1. Не знаю точно, как должен работать модуль, но в фоновом режиме (без запуска rtmpdump) файлы .m3u8 и .ts не создаются. По http-запросу они также не создаются.
2. Даже если во время работы rtmpdump попытаться загрузить файл .m3u8 через videojs на сайте, то плеер ругается на неизвестный формат. "code: 4, message: "No compatible source was found for this media."

Как решить эти проблемы?
конфиг nginx
# RTMP configuration
rtmp {
    server {
        listen 1935; # Listen on standard RTMP port
        chunk_size 4000;

        application show {
            live on;
            hls on;
            hls_path /tmp/hls;
            hls_fragment 5s;

            exec_pull ffmpeg -i "rtsp://@10.10.120.200/0" -vcodec copy -f flv -an rtmp://localhost:1935/show/live 2>>/var/log/nginx/ffmpeg_show.log;
            #exec_pull ffmpeg -i "rtsp://@10.10.120.200/0" -vcodec copy -f ssegment -segment_list live.m3u8 -segment_list_flags +live -segment_time 10 out%03d.ts;
        }
    }
}
.....

server {
    listen      192.168.100.87:80;
    server_name tm2.test.ru www.tm2.test.ru;

    index       index.php index.html index.htm;
    access_log  /home/user1/logs/tm2.demis.ru.log combined;
    access_log  /home/user1/logs/tm2.demis.ru.bytes bytes;
    error_log   /home/user1/logs/tm2.demis.ru.error.log error;

    root        /home/user1/web/blog/public;

    location / {

        try_files $uri $uri/ /index.php?$query_string;

        location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|css|js)$ {
            expires     max;
        }

        location ~ [^/]\.php(/|$) {
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            if (!-f $document_root$fastcgi_script_name) {
                return  404;
            }

            fastcgi_pass    127.0.0.1:9006;
            fastcgi_index   index.php;
            include         /etc/nginx/fastcgi_params;
            add_header Access-Control-Allow-Origin *;
        }
    }


    location /hls {
        # Disable cache
        #add_header Cache-Control no-cache;

        # CORS setup
        #add_header 'Access-Control-Allow-Origin' '*' always;
        #add_header 'Access-Control-Expose-Headers' 'Content-Length';

        # allow CORS preflight requests
        #if ($request_method = 'OPTIONS') {
        #    add_header 'Access-Control-Allow-Origin' '*';
        #    add_header 'Access-Control-Max-Age' 1728000;
        #    add_header 'Content-Type' 'text/plain charset=UTF-8';
        #    add_header 'Content-Length' 0;
        #    return 204;
        #}

        types {
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }

        #root /tmp;
        alias /tmp/hls;

    }

    error_page  403 /error/404.html;
    error_page  404 /error/404.html;
    error_page  500 502 503 504 /error/50x.html;

}


Плеер

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Live Streaming</title>
    <link href="//vjs.zencdn.net/5.8/video-js.min.css" rel="stylesheet">
    <script src="//vjs.zencdn.net/5.8/video.min.js"></script>
</head>
<body>
<video id="player" class="video-js vjs-default-skin" height="360" width="640" controls preload="none">
    <source src="http://tm2.test.ru/hls/live.m3u8" type="application/x-mpegURL" />
</video>
<script>
    var player = videojs('#player');
</script>
</body>
</html>
  • Вопрос задан
  • 3375 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
Поменяйте exec_pull на exec_static
Сейчас он у вас запускается только по первому запросу к rtmp
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Drno
Делали отдачу как то по HLS. МОгу поискать конфиги.

Но насколько я помню, файл m3u8 доложен отдаваться в браузер как минимум.
Тоесть можете его запросить у веб сервера?

Вроде файл m3u8 должен создаваться NGINX при старте hls...
Ответ написан
pirxon
@pirxon
Попробуй измени строку
exec_pull ffmpeg -i "rtsp://@10.10.120.200/0" -vcodec copy -f flv -an rtmp://localhost:1935/show/live 2>>/var/log/nginx/ffmpeg_show.log;

на
exec_static ffmpeg -i "rtsp://@10.10.120.200/0" -vcodec copy -f flv -an rtmp://localhost:1935/show/live;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы