StreamNow is a real-time video streaming application built using Node.js, Express, Socket.IO, and FFmpeg. The application captures video streams from a client, processes them using FFmpeg, and streams the processed video to a YouTube RTMP server.
Ensure you have the following installed on your machine:
- Node.js (version 14.x or higher)
- npm (Node package manager)
- Docker (for containerization)
Clone the repository:
git clone https://github.com/vishalpathakcodes/StreamNow cd StreamNowInstall the dependencies:
npm install
index.js(orapp.js): The main file containing the server and streaming logic.public/: Directory containing static files served by Express.package.json: Contains metadata about the project and its dependencies.Dockerfile: Docker configuration for containerizing the application.
importhttpfrom'http';importexpressfrom'express';importpathfrom'path';import{spawn}from'child_process';import{ServerasSocketIO}from'socket.io';http: Core Node.js module for creating an HTTP server.express: A minimal and flexible Node.js web application framework.path: Core Node.js module for handling file and directory paths.child_process: Core Node.js module for spawning child processes.socket.io: Real-time bidirectional event-based communication.
constapp=express();constserver=http.createServer(app);constio=newSocketIO(server);app: Instance of Express.server: HTTP server created using the Express app.io: Socket.IO server instance attached to the HTTP server.
constoptions=['-i','-','-c:v','libx264','-preset','ultrafast','-tune','zerolatency','-r',`${25}`,'-g',`${25*2}`,'-keyint_min',25,'-crf','25','-pix_fmt','yuv420p','-sc_threshold','0','-profile:v','main','-level','3.1','-c:a','aac','-b:a','128k','-ar',128000/4,'-f','flv',`rtmp://a.rtmp.youtube.com/live2/3wv5-sqds-3p2c-yrw4-84rb`,];constffmpeg=spawn('ffmpeg',options);options: Array of FFmpeg options for video processing and streaming.ffmpeg: Spawns a child process to run FFmpeg with the specified options.
app.use(express.static(path.resolve('./public')));- Serves static files from the
publicdirectory.
io.on('connection',socket=>{console.log("Socket connected",socket.id);socket.on('binarystream',stream=>{console.log('Binary stream incoming');});});- Listens for new socket connections and logs the socket ID.
- Listens for
binarystreamevents and logs when a binary stream is received.
server.listen(3000,()=>{console.log("HTTP Server running on port 3000");});- Starts the HTTP server on port 3000.
Start the server:
node index.js
Access the application:
- Open a web browser and navigate to
http://localhost:3000.
- Open a web browser and navigate to
Create a Dockerfile in the root directory with the following content:
# Use an official Node.js runtime as a parent imageFROM node:14
# Set the working directory in the containerWORKDIR /usr/src/app
# Copy package.json and package-lock.json to the working directoryCOPY package*.json ./
# Install dependenciesRUN npm install
# Copy the rest of the application code to the working directoryCOPY . .
# Expose port 3000EXPOSE 3000
# Start the applicationCMD ["node", "index.js"]Build the Docker image:
docker build -t streamnow .Run the Docker container:
docker run -p 3000:3000 streamnow
- FFmpeg Options: Customize the FFmpeg options based on your streaming requirements and target platform specifications.
- Socket.IO Events: Implement proper handling of incoming binary streams and integrate them with the FFmpeg process.
By following this guide, you will have a working real-time video streaming application using Node.js, Express, Socket.IO, and FFmpeg. The application can be containerized and deployed using Docker for easier scalability and management.