ffmpeg-video-composer
is a tool designed to streamline the process of video compilation and audio mixing using FFmpeg. It enables dynamic template generation, video rendering, and audio composition, making it a comprehensive solution for creating personalized multimedia content programmatically.
Check out the video sample to see ffmpeg-video-composer
in action (unmute for sound):
sample.mp4
- Dynamic video and audio template generation
- Easy video compilation and audio mixing using FFmpeg
- Flexible JSON-based template descriptor system
- CLI for quick video creation
- JSON configuration for complex project setups
- Custom project configurations support
- Audio overlay and mixing capabilities
- Automated video editing and composition
This tool requires FFmpeg to be installed on your system and available in your PATH. FFmpeg is used directly for all video and audio processing operations.
Using Homebrew:
brew install ffmpeg
For Debian/Ubuntu:
sudo apt update && sudo apt install ffmpeg
For Fedora:
sudo dnf install ffmpeg
For Arch Linux:
sudo pacman -S ffmpeg
After installation, verify that FFmpeg is properly installed:
ffmpeg -version ffprobe -version
pnpm add ffmpeg-video-composer
git clone https://github.com/heristop/ffmpeg-video-composer.git cd ffmpeg-video-composer pnpm i
pnpm compile src/shared/templates/sample.json
This generates sample_output.mp4
in the build
directory.
import { compile, loadConfig } from 'ffmpeg-video-composer'; const projectConfig = { buildDir, // Build directory for output files assetsDir, // Assets directory for video segments // Other project configurations... currentLocale: 'en', fields: { form_1_firstname: 'Firstname', form_1_lastname: 'Lastname', }, }; // Using a template descriptor object compile(projectConfig, { global: { // ... (template global configuration) }, sections: [ // ... (template sections configurations) ], }); // Or using a JSON file await compile(projectConfig, await loadConfig('./src/shared/templates/sample.json'));
Ensure the quality of the codebase by running the test suite:
pnpm test
The project includes a mobile playground (LeClap) built with Expo that allows you to test and interact with the video composer functionality on your mobile device.
Before using the mobile playground, you need to start the server:
pnpm server:dev
This command builds and starts the server that the mobile app will communicate with.
To start the Expo development server:
pnpm playground:start
To run the playground on specific platforms:
# Run on Android pnpm playground:android # Run on iOS pnpm playground:ios
%%{init: { 'theme': 'base', 'themeVariables': { 'fontFamily': 'system-ui', 'fontSize': '13px', 'primaryColor': '#fff', 'primaryTextColor': '#2A3F4D', 'primaryBorderColor': '#7C8D9D', 'lineColor': '#7C8D9D', 'tertiaryColor': '#fff' } }}%% graph TD %% Style Definitions classDef core fill:#EDF7FF,stroke:#4B83B8,stroke-width:2px classDef abstract fill:#F9F3FF,stroke:#9D7AB8,stroke-width:2px,stroke-dasharray: 5 5 classDef implementation fill:#E8F3EC,stroke:#67B58A,stroke-width:2px classDef entry fill:#FFF4E6,stroke:#E8A364,stroke-width:2px classDef builder fill:#FFE8E8,stroke:#E88B8B,stroke-width:2px classDef title fill:none,stroke:none %% Entry Points subgraph Flow ["π Application Entry"] direction TB main[("main.ts")]:::entry --> index["index.ts"]:::entry end %% Core Domain subgraph Core ["π Domain Layer"] direction TB subgraph CoreModels ["Domain Models"] core_project["Project.ts"]:::core core_segment["Segment.ts"]:::core core_template["Template.ts"]:::core end subgraph CoreUtils ["Core Utilities"] core_types["types.ts"]:::core core_config["default.config.ts"]:::core end end %% Director Pattern subgraph Builder ["π· Builder Pattern"] direction TB director["TemplateDirector.ts"]:::builder template_builder["TemplateConcreteBuilder.ts"]:::builder end %% Platform Layer subgraph Platform ["β‘ Platform Layer"] direction TB subgraph PlatformCore ["Core Platform"] platform_bridge["PlatformBridge.ts"]:::implementation event_manager["EventManager.ts"]:::implementation end subgraph Abstractions ["Interfaces"] abstract_ffmpeg["AbstractFFmpeg.ts"]:::abstract abstract_music["AbstractMusic.ts"]:::abstract abstract_fs["AbstractFilesystem.ts"]:::abstract abstract_logger["AbstractLogger.ts"]:::abstract end subgraph Adapters ["Platform Adapters"] ffmpeg_node["FFmpegNodeAdapter.ts"]:::implementation music_node["MusicNodeAdapter.ts"]:::implementation fs_node["FilesystemNodeAdapter.ts"]:::implementation pino_adapter["PinoLogAdapter.ts"]:::implementation end end %% Editor Components subgraph Editor ["π₯ Video Processing"] direction TB subgraph EditorCore ["Core Processing"] video_editor["VideoEditor.ts"]:::implementation music_composer["MusicComposer.ts"]:::implementation segment_builder["SegmentBuilder.ts"]:::implementation end subgraph Segments ["Video Segments"] segment_factory["SegmentFactory.ts"]:::implementation video_segment["VideoSegment.ts"]:::implementation color_bg_segment["ColorBackgroundSegment.ts"]:::implementation image_bg_segment["ImageBackgroundSegment.ts"]:::implementation project_video_segment["ProjectVideoSegment.ts"]:::implementation end end %% Resource Management subgraph Resources ["π Resource Management"] direction TB asset_manager["AssetManager.ts"]:::implementation filter_manager["FilterManager.ts"]:::implementation formatter_manager["FormatterManager.ts"]:::implementation map_manager["MapManager.ts"]:::implementation var_manager["VariableManager.ts"]:::implementation end %% Main Flow index --> director director --> template_builder director --> video_editor director --> event_manager %% Builder Pattern Flow template_builder --> segment_builder template_builder --> segment_factory %% Segment Creation Flow segment_factory --> video_segment & color_bg_segment & image_bg_segment & project_video_segment video_segment & color_bg_segment & image_bg_segment & project_video_segment --> segment_builder %% Platform Relations platform_bridge --> ffmpeg_node & music_node & fs_node & pino_adapter ffmpeg_node --> abstract_ffmpeg music_node --> abstract_music fs_node --> abstract_fs pino_adapter --> abstract_logger %% Resource Management segment_builder --> asset_manager & filter_manager & formatter_manager & map_manager & var_manager %% Core Dependencies core_project --> core_config & core_types %% Editor Flow video_editor --> music_composer %% Link Styling linkStyle default stroke:#7C8D9D,stroke-width:1px
This project is licensed under the MIT License - see the LICENSE file for details.
If you have any questions or feedback, please open an issue on GitHub.