{"id":15085993,"url":"https://github.com/vinayakvispute/multi-resolution-transcoder-pipeline-mux","last_synced_at":"2026-01-23T20:05:49.182Z","repository":{"id":255183492,"uuid":"848785608","full_name":"VinayakVispute/Multi-Resolution-Transcoder-Pipeline-Mux","owner":"VinayakVispute","description":"A scalable pipeline for video transcoding, generating multiple resolutions with seamless integration into Azure, inspired by Mux's capabilities","archived":false,"fork":false,"pushed_at":"2024-10-05T16:37:39.000Z","size":2611,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-29T12:11:36.879Z","etag":null,"topics":["automation","azure","azure-container-instances","azure-container-registry","azure-queue","azure-storage","blob-storage","docker","docker-container","ffmpeg","nodejs","scalable","sqs-queue","typescript"],"latest_commit_sha":null,"homepage":"https://www.transcoder.visputevinayak.co/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/VinayakVispute.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-28T12:04:35.000Z","updated_at":"2024-11-21T14:34:37.000Z","dependencies_parsed_at":"2024-09-08T12:00:24.183Z","dependency_job_id":"12f68574-4320-4eff-a0c0-c2ca34b59afe","html_url":"https://github.com/VinayakVispute/Multi-Resolution-Transcoder-Pipeline-Mux","commit_stats":{"total_commits":24,"total_committers":1,"mean_commits":24.0,"dds":0.0,"last_synced_commit":"6f95398b50a8463038adf073eda18e07d548fca6"},"previous_names":["vinayakvispute/multi-resolution-transcoder-pipeline-mux"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VinayakVispute%2FMulti-Resolution-Transcoder-Pipeline-Mux","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VinayakVispute%2FMulti-Resolution-Transcoder-Pipeline-Mux/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VinayakVispute%2FMulti-Resolution-Transcoder-Pipeline-Mux/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/VinayakVispute%2FMulti-Resolution-Transcoder-Pipeline-Mux/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/VinayakVispute","download_url":"https://codeload.github.com/VinayakVispute/Multi-Resolution-Transcoder-Pipeline-Mux/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249778327,"owners_count":21324237,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","azure","azure-container-instances","azure-container-registry","azure-queue","azure-storage","blob-storage","docker","docker-container","ffmpeg","nodejs","scalable","sqs-queue","typescript"],"created_at":"2024-09-25T07:02:50.457Z","updated_at":"2026-01-23T20:05:49.149Z","avatar_url":"https://github.com/VinayakVispute.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Multi-Resolution-Transcoder-Pipeline | Mux\n\nA scalable video transcoding pipeline designed to convert videos into multiple resolutions, leveraging Azure's powerful cloud services. This project is inspired by Mux and demonstrates how to build a video processing pipeline that can be easily scaled to handle large volumes of videos.\n\n## Table of Contents\n\n- [Overview](#overview)\n- [Tech Stack](#tech-stack)\n- [Azure Services Used](#azure-services-used)\n- [Pipeline Workflow](#pipeline-workflow)\n- [Setup and Installation](#setup-and-installation)\n- [Usage](#usage)\n- [Contributing](#contributing)\n- [License](#license)\n\n## Overview\n\nThis project automates the process of transcoding videos into multiple resolutions using Azure services. The pipeline downloads a video from Azure Blob Storage, transcodes it into different resolutions (360p, 480p, 720p), and uploads the transcoded videos back to Azure Blob Storage with a suffix indicating the resolution. This allows for easy selection of videos based on desired resolution.\n\n\u003e Why settle for one resolution when you can have them all? Transcode like a ninja!✨\n\n## Tech Stack\n\n- **Node.js**: The runtime environment used to execute JavaScript code on the server side.\n- **TypeScript**: Superset of JavaScript used for type safety and improved developer experience.\n- **Fluent-ffmpeg**: A Node.js library for working with FFmpeg, used here for video transcoding.\n- **Azure SDK for JavaScript**: Used for interacting with various Azure services.\n\n## Azure Services Used\n\n### 1. **Azure Blob Storage**\n\n- **Purpose**: Used for storing the original video files and the transcoded videos.\n- **Role**: The pipeline retrieves the input video from a specified container, processes it, and stores the output videos back in another container.\n\n### 2. **Azure Storage Queue**\n\n- **Purpose**: Used for queuing video processing requests.\n- **Role**: The pipeline listens to the queue, retrieves messages, and processes videos accordingly. This allows for asynchronous processing and easy scaling.\n\n### 3. **Azure Container Instances**\n\n- **Purpose**: Provides a platform for running the containerized video transcoding service.\n- **Role**: The pipeline spins up containers on demand to handle video transcoding, ensuring that resources are used efficiently.\n\n### 4. **Azure Container Registry**\n\n- **Purpose**: Stores container images.\n- **Role**: The pipeline pulls the Docker image from the registry to spin up container instances for video processing.\n\n## Pipeline Workflow\n\n![Workflow](https://res.cloudinary.com/dkawvablj/image/upload/v1724851239/VinayakVIspute/evwbhhtlbet661yyhnde.png)\n\n1. **Message Queue**: The pipeline starts by receiving a message from an Azure Storage Queue, which contains the name of the video blob to be processed.\n\n2. **Video Download**: The pipeline downloads the video from Azure Blob Storage.\n\n3. **Video Transcoding**: The video is transcoded into multiple resolutions using `fluent-ffmpeg`.\n\n4. **Video Upload**: The transcoded videos are uploaded back to Azure Blob Storage with filenames that include the resolution suffix (e.g., `video-360p.mp4`).\n\n5. **Repeat**: The pipeline continues to listen to the queue for new messages, allowing for continuous processing.\n\n## Setup and Installation\n\n### Prerequisites\n\n- **Node.js** and **npm/yarn** installed.\n- Azure account with the following services set up:\n  - Blob Storage containers (input and output)\n  - Storage Queue\n  - Container Registry with a Docker image for the transcoding service\n  - Container Instance setup\n\n### Installation\n\n1. **Clone the repository:**\n\n   ```bash\n   git clone https://github.com/VinayakVispute/Multi-Resolution-Transcoder-Pipeline-Mux.git\n   cd Multi-Resolution-Transcoder-Pipeline-Mux\n   ```\n\n2. **Install dependencies:**\n\n   ```bash\n   npm install\n   ```\n\n3. **Set up environment variables:**\n   Create a `.env` file in the root directory and populate it with the following values:\n\n   ```\n   AZURE_STORAGE_CONNECTION_STRING=your_connection_string\n   AZURE_RESOURCE_GROUP=your_resource_group\n   AZURE_CONTAINER_REGISTRY_SERVER=your_registry_server\n   CONTAINER_GROUP_NAME=your_container_group_name\n   CONTAINER_NAME=your_container_name\n   BUCKET_NAME=input_blob_container_name\n   OUTPUT_VIDEO_BUCKET=output_blob_container_name\n   SUBSCRIPTION_ID=your_subscription_id\n   ACR_USERNAME=your_acr_username\n   ACR_PASSWORD=your_acr_password\n   QUEUE_NAME=your_queue_name\n   RESOURCE_GROUP_LOCATION=location_for_resource_group\n   ```\n\n4. **Run the pipeline:**\n   ```bash\n   npm start\n   ```\n\n## Usage\n\n- **Input**: The pipeline processes video files stored in an Azure Blob Storage container. The video file's name is extracted from a message received from an Azure Storage Queue.\n- **Output**: The transcoded videos are stored in another Azure Blob Storage container with filenames suffixed with the resolution (e.g., `video-360p.mp4`, `video-480p.mp4`, `video-720p.mp4`).\n\n## Contributing\n\nContributions are welcome! Please fork this repository, create a feature branch, and submit a pull request for any enhancements or fixes.\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n---\n\nThis README provides a comprehensive overview of your project, its components, and how to use it.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvinayakvispute%2Fmulti-resolution-transcoder-pipeline-mux","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvinayakvispute%2Fmulti-resolution-transcoder-pipeline-mux","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvinayakvispute%2Fmulti-resolution-transcoder-pipeline-mux/lists"}