 This document is setup development enviroment on MacOs. For other Linux such at Ubuntu cloud server we will do later on Deployment task. Watch video [here](https://www.youtube.com/watch?v=TdELN27NkyY) #### Install Node.js We need nodejs for development and run backend resful service , websocket server so to install Node.js just download this package from officical website [https://nodejs.org/en/download/](https://nodejs.org/en/download/) #### Install MongoDB This tutorial we are using Mongodb NoSQL database store document for our Node.js app. To instlal MongoDB just download [https://www.mongodb.com/download-center?jmp=nav#community](https://www.mongodb.com/download-center?jmp=nav#community) or use Home brew [https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/) #### Install Nginx + Nginx Rtmp Module (MacOs) We use home brew to install package if you dont have Home brew just see documentation to install home brew on your MacOs [https://brew.sh/](https://brew.sh/) brew tap homebrew/nginx brew options nginx-full brew info nginx-full brew install nginx-full --with-rtmp-module --with-debug Nginx config file for default in `/usr/local/etc/nginx/nginx.conf` Start Nginx nginx Stop Nginx nginx -s stop Reload Nginx nginx -s reload #### Setup ffmpeg on MacOs Ffmpeg that is awesome and free tools for video converting, streaming, we will use this tool for stream video from a camera (on Raspberry Pi Zero W) and send stream video from camera to our Server or Youtube. for development we use it on Mac for testing and just stream a video source from a input movie .mkv format. We can download and install package directly from official website [https://www.ffmpeg.org/download.html](https://www.ffmpeg.org/download.html) or use Home brew to install it on MacOs. brew install ffmpeg Or Install with extra resources (Plugins) brew install ffmpeg --with-tools --with-fdk-aac --with-freetype --with-fontconfig --with-libass --with-libvorbis --with-libvpx --with-opus --with-x265 Update Ffmpeg to latest version brew update && brew upgrade ffmpeg Documentation for list all inputs videos/audios [https://www.ffmpeg.org/ffmpeg-devices.html](https://www.ffmpeg.org/ffmpeg-devices.html) On MacOs ffmpeg -f avfoundation -list_devices true -i "" Stream Camera on MacOs + Audio to rtmp server ,remember change frame rate correctly in my iMac it: -r 30 ffmpeg -f avfoundation -r 30 -i "0:0" -deinterlace -vcodec libx264 -pix_fmt yuv420p -preset medium -g 60 -b:v 2500k -acodec libmp3lame -ar 44100 -threads 6 -qscale 3 -b:a 712000 -bufsize 512k -f flv rtmp://localhost/live/tabvn Stream a movie (video.mkv) to Nginx Rtmp Server eg: rtmp://localhost/live/tabvn , that mean you can stream a video/camera to your Youtube live channel by replace the rtmp url with your **rtmp://a.rtmp.youtube.com/live2/\[stream-name-key\]** ffmpeg -re -i video.mkv -c:v libx264 -preset veryfast -maxrate 3000k -bufsize 6000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 160k -ac 2 -ar 44100 -f flv rtmp://localhost/live/tabvn #### Nginx Config Sample for Nginx + Nginx Rtmp Module worker_processes auto;events { worker_connections 1024;}# RTMP Configrtmp { server { listen 1935; # Listen on standard RTMP port chunk_size 4000; application live{ live on; deny play all; push rtmp://localhost/play; on_publish http://localhost:3001/api/on-live-auth; on_publish_done http://localhost:3001/api/on-live-done; } application play { live on; # Turn on HLS hls on; hls_nested on; hls_fragment_naming system; #hls_path /Users/toan/Sites/mnt/hls/; hls_path /Users/toan/Tutorials/stream/storage/live/; hls_fragment 3; hls_playlist_length 60; # disable consuming the stream from nginx as rtmp deny play all; } }}# End RTMP Confighttp { default_type application/octet-stream; sendfile off; tcp_nopush on; server { listen 3002; location /live { # 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 /Users/toan/Tutorials/stream/storage/; } } include servers/*;}  > Next Part: [**Python WebSocket Client Connect to Node.js WebSocket Server µWebSocket**](https://medium.com/@tabvn/python-websocket-client-connect-to-node-js-websocket-server-%C2%B5websocket-2580012901e2) > Watch Video: [https://www.youtube.com/watch?v=TdELN27NkyY](https://www.youtube.com/watch?v=TdELN27NkyY) > Github: [https://github.com/tabvn/video-streaming-service](https://github.com/tabvn/video-streaming-service)