npm package: @gromlab/create-vod
Description: DASH/HLS video converter with hardware acceleration (NVENC/QSV/AMF/VAAPI), thumbnails and poster generation
Author: Gromov Sergei
Latest version: 0.1.17

# Create VOD 🎬

🇷🇺 Russian README: https://gromlab.ru/vod/create-vod/src/branch/master/README_RU.md

CLI tool to convert videos to DASH and HLS with hardware acceleration (NVENC / Intel QSV / AMD AMF / VAAPI), adaptive streaming, and automatic thumbnails/poster.

**Features:**
- ⚡ Hardware acceleration: auto-detect encoder/decoder (NVENC / Intel QSV / AMD AMF / VAAPI / CPU)
- 🎯 Formats: DASH and HLS (shared segments)
- 📊 Quality profiles: multiple bitrates/FPS (auto or custom)
- 🖼️ Preview: thumbnail sprite + VTT, poster from the first frame
- ⏱️ Progress: per-profile and overall CLI progress bars

## Install
For the CLI to work correctly, FFmpeg and MP4Box must be installed in the system.
```bash
# Arch Linux
sudo pacman -S ffmpeg gpac

# Ubuntu/Debian
sudo apt install ffmpeg gpac

# macOS
brew install ffmpeg gpac
```

## Quick Start
Before running, make sure `FFmpeg` and `MP4Box` are installed (see Install).

```bash
npx @gromlab/create-vod video.mp4
```

**Output:** In the current directory you'll get:
```
video/
├── manifest.mpd     # DASH manifest
├── master.m3u8      # HLS master playlist
├── poster.jpg       # Poster frame
├── thumbnails.{jpg,vtt}  # Sprite + VTT cues
├── audio/           # Audio init + segments (AAC)
├── 1080p/           # H.264 1080p init + segments
├── 720p/            # H.264 720p
├── 480p/            # H.264 480p
├── 360p/            # H.264 360p
├── 1080p-av1/       # AV1 1080p (if av1 selected)
└── ...              # Other profiles/codecs as {profile}-{codec}
```

## CLI Usage

```bash
create-vod <input-video> [output-dir] [-r resolutions] [-c codec] [-p poster-timecode] [-e encoder] [-d decoder] [-m]
```

### Main arguments

| Argument      | Description                  | Default | Required |
|---------------|------------------------------|---------|----------|
| `input-video` | Path to input video file     | -       | ✅       |
| `output-dir`  | Output directory             | `.`     | ❌       |

### Options

| Option | Description                | Values / Format            | Default  | Example                         |
|--------|----------------------------|----------------------------|----------|---------------------------------|
| `-r, --resolutions` | Quality profiles        | `360`, `720@60`, `1080-60` | auto     | `-r 720,1080,1440@60`           |
| `-c, --codec`       | Video codec(s)          | `h264`, `av1` (comma/space separated) | `h264`   | `-c h264,av1`                   |
| `-p, --poster`      | Poster timecode         | `HH:MM:SS` or seconds      | `00:00:00` | `-p 00:00:05` or `-p 10`      |
| `-e, --encoder`     | Video encoder           | `auto`, `nvenc`, `qsv`, `amf`, `vaapi`, `videotoolbox`, `v4l2`, `cpu` | `auto`   | `-e nvenc` |
| `-d, --decoder`     | Video decoder (hwaccel) | `auto`, `nvenc`, `qsv`, `vaapi`, `videotoolbox`, `v4l2`, `cpu` | `auto`   | `-d cpu`   |
| `-m, --muted`       | Disable audio track     | flag                      | off      | `-m`                            |

### Examples

```bash
# Default (DASH + HLS, auto profiles)
npx @gromlab/create-vod video.mp4

# Custom output directory
npx @gromlab/create-vod video.mp4 ./output

# Selected resolutions
npx @gromlab/create-vod video.mp4 -r 720,1080,1440

# High FPS
npx @gromlab/create-vod video.mp4 -r 720@60,1080@60

# Poster from 5th second
npx @gromlab/create-vod video.mp4 -p 5

# Force CPU encode/decode
npx @gromlab/create-vod video.mp4 -c h264 -e cpu -d cpu

# Force GPU encode + CPU decode
npx @gromlab/create-vod video.mp4 -c h264 -e nvenc -d cpu

# Combined parameters
npx @gromlab/create-vod video.mp4 ./output -r 720,1080@60,1440@60 -p 00:00:10

# No audio
npx @gromlab/create-vod video.mp4 -m
```

### Supported resolutions

| Resolution | Label          | FPS options      |
|------------|----------------|------------------|
| `360`      | 360p (640×360) | 30, 60, 90, 120  |
| `480`      | 480p (854×480) | 30, 60, 90, 120  |
| `720`      | 720p (1280×720)| 30, 60, 90, 120  |
| `1080`     | 1080p (1920×1080)| 30, 60, 90, 120|
| `1440`     | 1440p (2560×1440)| 30, 60, 90, 120|
| `2160`     | 2160p (3840×2160)| 30, 60, 90, 120|

High FPS (60/90/120) are generated only if the source supports that FPS.

## Defaults & Automation

- Segment duration: 2 seconds
- Hardware accel: auto-detect best encoder/decoder (GPU if available, else CPU)
- Profiles: auto-selected based on source resolution
- Bitrate: BPP-based dynamic calculation
- Thumbnails: auto sprite (160×90, 1s interval) + VTT
- Poster: first frame (0:00:00, configurable via `-p`)
- Parallel encoding: enabled
- AV1: enabled only if hardware AV1 encoder detected (in auto mode); otherwise stays on H.264

**Requirements:** Node.js ≥18.0.0, FFmpeg, MP4Box (gpac), optional NVIDIA/Intel/AMD GPU for acceleration