diff --git a/README.md b/README.md index 7fa7e4b2..97616ace 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ The main purpose of ffplayout is to provide a 24/7 broadcasting solution that pl - **aevalsrc** (if video have no audio) - **apad** (add silence if audio duration is to short) - **tpad** (add black frames if video duration is to short) +- [separate preview stream](/docs/preview_stream.md) - [output](/docs/output.md): - **stream** - **desktop** diff --git a/docs/preview_stream.md b/docs/preview_stream.md new file mode 100644 index 00000000..6ddef57c --- /dev/null +++ b/docs/preview_stream.md @@ -0,0 +1,200 @@ +### Preview Stream + +The ffplayout engine output provides a setting for previewing. In general you can use any technique to display your streaming preview, even SDL could be possible. + +In this documentation we suspect, that you are using [ffplayout-frontend](https://github.com/ffplayout/ffplayout-frontend) and that you using [SRS](https://github.com/ossrs/srs) at least for the preview stream. In the past we used HLS for the preview, but now it is possible to also use [HTTP-FLV](https://github.com/ossrs/srs/wiki/v4_EN_DeliveryHttpStream) for less latency. + +To get this working we have to follow some steps. ffplayout engine needs a direction where it can stream on and SRS need a virtual host for the rtmp input. Because both runs on the same machine, we use for that a redirection in the **/etc/hosts** file: + +``` +... + +127.0.0.1 preview.local +``` + +Add this line to **/etc/hosts** ans save it. + +#### Next step is to compile and install SRS: + +```BASH +# install some tool for compiling +apt install curl wget net-tools git build-essential autoconf automake libtool pkg-config gperf libssl-dev + +cd /opt/ + +# get SRS +git clone https://github.com/ossrs/srs.git + +cd srs/trunk + +# get correct branch +git checkout 4.0release + +./configure --ffmpeg-fit=off + +make -j4 + +# install SRS to /usr/local/srs +make install + +``` + +Now we need a systemd service, to startup SRS automatically. Create the file: + +**/etc/systemd/system/srs.service** + +with this content: + +```INI +Description=SRS +Documentation=https://github.com/ossrs/srs/wiki +After=network.target + +[Service] +Type=forking +ExecStartPre=/usr/local/srs/objs/srs -t -c /etc/srs/srs.conf +ExecStart=/usr/local/srs/objs/srs -c /etc/srs/srs.conf +ExecStop=/bin/kill -TERM \$MAINPID +ExecReload=/bin/kill -1 \$MAINPID +Restart=always +RestartSec=3 + +[Install] +WantedBy=multi-user.target +``` + +Then create the config for SRS under **/etc/srs/srs.conf** with this content: + +```NGINX +listen 1935; +max_connections 20; +daemon on; +pid /usr/local/srs/objs/srs.pid; +srs_log_tank console; # file; +srs_log_file /var/log/srs.log; +ff_log_dir /tmp; +srs_log_level error; + +http_server { + enabled on; + listen 127.0.0.1:8080; + dir ./objs/nginx/html; +} + +stats { + network 0; + disk sda vda xvda xvdb; +} + +vhost preview.local { + http_remux { + enabled on; + mount [vhost]/[app]/[stream].flv; + } +} +``` + +Now you can enable and start SRS with: `systemctl enable --now srs` and check if it is running: `systemctl status srs` + +#### Configure Nginx + +We assume that you have already installed nginx and you are using it already for the frontend. So open the frontend config **/etc/nginx/sites-enabled/ffplayout.conf** and add a new location to it: + +```NGINX +location /preview/stream.flv { + proxy_pass http://preview.local:8080/live/stream.flv; +} +``` + +Full config looks like: + +```NGINX +server { + listen 80; + + server_name ffplayout.example.org; + + gzip on; + gzip_types text/plain application/xml text/css application/javascript; + gzip_min_length 1000; + + charset utf-8; + + client_max_body_size 7000M; # should be desirable value + + add_header X-Frame-Options SAMEORIGIN; + add_header X-Content-Type-Options nosniff; + add_header X-XSS-Protection "1; mode=block"; + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; + + location / { + if ($http_origin ~ '^https?://(localhost|ffplayout\.example\.org)') { + add_header 'Access-Control-Allow-Origin' "$http_origin" always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always; + } + + if ($request_method = OPTIONS ) { + add_header 'Access-Control-Max-Age' 1728000; + add_header 'Content-Type' 'text/plain charset=UTF-8'; + add_header 'Content-Length' 0; + return 204; + } + + root /var/www/ffplayout-frontend/dist/; + + } + + location ~ ^/(api|admin|auth|api-auth) { + if ($http_origin ~ '^https?://(localhost|ffplayout\.local)') { + add_header 'Access-Control-Allow-Origin' "$http_origin" always; + add_header 'Access-Control-Allow-Credentials' 'true' always; + add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; + add_header 'Access-Control-Allow-Headers' 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With' always; + } + + add_header Last-Modified $date_gmt; + add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0'; + if_modified_since off; + expires off; + etag off; + + proxy_set_header Host $http_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 $scheme; + proxy_read_timeout 36000s; + proxy_connect_timeout 36000s; + proxy_send_timeout 36000s; + proxy_buffer_size 128k; + proxy_buffers 4 256k; + proxy_busy_buffers_size 256k; + send_timeout 36000s; + proxy_no_cache 1; + proxy_pass http://127.0.0.1:8001; + + } + + location /static/ { + alias /var/www/ffplayout-api/ffplayout/static/; + } + + location /live/ { + alias /var/www/srs/live/; + } + + location /preview/stream.flv { + # HTTP-FLV preview + proxy_pass http://preview.local:8080/live/stream.flv; + } +} +``` + +Of course in production you should have a HTTPS directive to, but this step is up to you. + +Restart Nginx. + +You you can start ffplayout engine with preview enabled and when you setup everything correct it should run without errors. + +You can go now in your frontend configuration and change the `player_url` to: `http://[domain or IP]/preview/stream.flv`, save and reload the page. When you go now to the player tap you should see the preview video.