TareqAlqutami / rtmp-hls-server

a docker file to create a streaming server that supports RTMP, HLS and DASH content based on nginx and nginx-rtmp-module.
MIT License
402 stars 193 forks source link

rtsp to rtmp #30

Closed dio99 closed 2 years ago

dio99 commented 3 years ago

im using your code and docker image it works in the default setup , so i changed little in nginx.conf

but i want to get live feed from rtsp cam so i tried to modify it but i cant to create the stream files for hls or dash any hints?

worker_processes auto; error_log /var/log/nginx/nginx_error.log;

events { worker_connections 1024; }

RTMP configuration

rtmp { server { listen 1935; # Listen on standard RTMP port chunk_size 4000;

ping 30s;

    # notify_method get;

    # This application is to accept incoming stream
    application live {
        live on; # Allows live input
        interleave on;

        # for each received stream, transcode for adaptive streaming
        # This single ffmpeg command takes the input and transforms
        # the source into 4 different streams with different bitrates
        # and qualities. # these settings respect the aspect ratio.
        #exec_push  /usr/local/bin/ffmpeg -i rtmp://localhost:1935/$app/$name -async 1 -vsync -1
        #           -c:v libx264 -c:a aac -b:v 256k  -b:a 64k -vf "scale=480:trunc(ow/a/2)*2"  -tune zerolatency -preset superfast -crf 23 -f flv rtmp://localhost:1935/show/$name_low
        #           -c:v libx264 -c:a aac -b:v 768k  -b:a 64k -vf "scale=720:trunc(ow/a/2)*2"  -tune zerolatency -preset superfast -crf 23 -f flv rtmp://localhost:1935/show/$name_mid
        #           -c:v libx264 -c:a aac -b:v 1024k -b:a 64k -vf "scale=960:trunc(ow/a/2)*2"  -tune zerolatency -preset superfast -crf 23 -f flv rtmp://localhost:1935/show/$name_high
        #           -c:v libx264 -c:a aac -b:v 1920k -b:a 64k -vf "scale=1280:trunc(ow/a/2)*2" -tune zerolatency -preset superfast -crf 23 -f flv rtmp://localhost:1935/show/$name_hd720
        #           -c copy -f flv rtmp://localhost:1935/show/$name_src;            
        #

        exec_static /usr/local/bin/ffmpeg -i rtsp://mydomain.com:554/media/video1 -c copy -an -f flv rtmp://localhost:1935/live/cam >> /var/log/ffmpeg.log;
        drop_idle_publisher 10s; 

    # This is the HLS application
    #application show {
    #   live on; # Allows live input from above application
        #deny play all; # disable consuming the stream from nginx as rtmp

        hls on; # Enable HTTP Live Streaming
        hls_fragment 3;
        hls_playlist_length 20;
        hls_path /mnt/hls/;  # hls fragments path
        # Instruct clients to adjust resolution according to bandwidth
        #hls_variant _src BANDWIDTH=4096000; # Source bitrate, source resolution
        #hls_variant _hd720 BANDWIDTH=2048000; # High bitrate, HD 720p resolution
        #hls_variant _high BANDWIDTH=1152000; # High bitrate, higher-than-SD resolution
        #hls_variant _mid BANDWIDTH=448000; # Medium bitrate, SD resolution
        #hls_variant _low BANDWIDTH=288000; # Low bitrate, sub-SD resolution

        # MPEG-DASH
        dash on;
        dash_path /mnt/dash/;  # dash fragments path
        dash_fragment 3;
        dash_playlist_length 20;            
    }
}

}

http { access_log /var/log/nginx/nginx_access.log; sendfile off; tcp_nopush on; directio 512;

aio on;

# HTTP server required to serve the player and HLS fragments
server {
    listen 8080;

    # Serve HLS fragments
    location /hls {
        types {
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }

        root /mnt;

        add_header Cache-Control no-cache; # Disable 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;
        }
    }

    # Serve DASH fragments
    location /dash {
        types {
            application/dash+xml mpd;
            video/mp4 mp4;
        }

        root /mnt;

        add_header Cache-Control no-cache; # Disable 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;
        }
    }       

    # This URL provides RTMP statistics in XML
    location /stat {
        rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl; # Use stat.xsl stylesheet 
    }

    location /stat.xsl {
        # XML stylesheet to view RTMP stats.
        root /usr/local/nginx/html;
    }

}

}

TareqAlqutami commented 2 years ago

The flow of the default config is that rtmp streams are received in live endpoints >> transcoded and pushed by ffmpeg to show endpoints >> hls and dash pulls the show endpoints. Maybe for starters try to push rtsmp to rtmp live point and test if you can open it in vlc. Then uncomment the transcoding and see if you can get the rtmp show endpoints as rtmp. IF that works, I believe the default dash/hls will work.

dio99 commented 2 years ago

yes i got it working. issue here was my >> to log file since that sent to stdout :) the static push as i read was better in keep con then push/pull but i need to see why i did not get it in the show endpoints