### 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.