PHPackages                             eminos/statamic-video-tools - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Image &amp; Media](/categories/media)
4. /
5. eminos/statamic-video-tools

ActiveStatamic-addon[Image &amp; Media](/categories/media)

eminos/statamic-video-tools
===========================

Automatic video encoding, HLS adaptive streaming, AI transcription, poster extraction, and animated CP thumbnails for Statamic.

v1.0.0(3mo ago)32[1 issues](https://github.com/eminos/statamic-video-tools/issues)proprietaryPHPPHP ^8.3

Since Mar 8Pushed 3mo agoCompare

[ Source](https://github.com/eminos/statamic-video-tools)[ Packagist](https://packagist.org/packages/eminos/statamic-video-tools)[ RSS](/packages/eminos-statamic-video-tools/feed)WikiDiscussions main Synced 3w ago

READMEChangelog (1)Dependencies (5)Versions (2)Used By (0)

 [![Statamic Video Tools Banner](.github/banner.png)](.github/banner.png)

Statamic Video Tools
====================

[](#statamic-video-tools)

[![Statamic 6.0+](https://camo.githubusercontent.com/f5e2381e6f3305f4eccd7f93ee5fb097b35baa005535fde537d7cf124d44f75b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53746174616d69632d362e302b2d4646323639453f7374796c653d666c6174266c6f676f3d73746174616d6963)](https://statamic.com) [![Commercial License](https://camo.githubusercontent.com/691bfee240b08f7cf459839df33bb91be768e7980aa8dc4be1dcefd3c2a56756/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d436f6d6d65726369616c2d6f72616e6765)](LICENSE.md)

[Features](#features) • [Installation](#installation) • [Quick Start](#quick-start) • [Documentation](#documentation) • [Support](#support)

A complete video toolkit for Statamic. Upload a video and get optimized MP4, WebM, AV1, HEVC, and HLS outputs, with automatic poster generation, animated CP thumbnails, and AI transcription with subtitles. Powered by locally installed FFmpeg and whisper.cpp. No third-party services, no monthly fees, no data leaving your server.

Most video solutions require a third-party transcoding service with a monthly subscription. This addon does everything locally: encoding, poster extraction, CP thumbnail injection, and AI transcription.

- **Modern formats and adaptive streaming.** AV1, HEVC, VP9, H.264, and HLS adaptive bitrate out of the box — the same video stack used by streaming platforms, without the platform dependency.
- **AI transcription and subtitles included.** Auto-generate captions in multiple formats using a local AI model. No cloud speech API, no extra cost per transcription.
- **No subscription fees.** Pay once (addon license) and encode unlimited videos. No per-minute charges, no storage fees, no cloud bills growing with your audience.
- **Your videos stay on your server.** No video data is sent to third-party services. Full control over your files, your storage, and your users' privacy.

Features
--------

[](#features)

### Encoding &amp; Conversion

[](#encoding--conversion)

- **Multiple output formats** from a single upload — MP4, WebM, HLS, and more
- **Modern codecs** — H.264, AV1, HEVC out of the box; VP9 supported via custom presets
- **HLS adaptive streaming** — multi-quality `.m3u8` playlists with `.ts` segments, each preset in its own subdirectory
- **Alpha channel support** — transparent video via HEVC and AV1 with proper conditions
- **Conditional encoding** — skip presets based on resolution, codec, alpha presence, or any custom logic
- **Full FFmpeg control** — pass raw FFmpeg flags, or implement a `PresetHandler` class for complex workflows
- **Per-container configuration** — different preset sets for different asset containers

### AI Transcription (powered by whisper.cpp)

[](#ai-transcription-powered-by-whispercpp)

- **Automatic transcription** on upload using [whisper.cpp](https://github.com/ggerganov/whisper.cpp), a standalone local binary with no Python or cloud API required
- **Multiple output formats** generated in a single pass:
    - `.vtt` — WebVTT subtitles, automatically injected as `` in the `{{ video }}` tag
    - `.srt` — SubRip format for video editors and external players
    - `.txt` — clean plain text transcript, no timestamps
    - `.transcript.txt` — formatted paragraphs with `[H:MM:SS]` timestamp markers, ready for front-end display
    - `.json` — full word-level data with confidence scores for custom search or highlighting experiences
- **Automatic language detection** — or pin a specific language in config
- **`{{ video }}` tag + `` Blade component** — `` rendered automatically; all transcript URLs available as template variables
- **Vocabulary hints** — improve recognition of brand names and proper nouns via `prompt`, `prompt_fields` (auto-uses asset alt text), or a custom `PromptResolver` class
- **CP fieldtype panel** — shows transcription status, detected language, per-format download and copy-URL buttons, and a generate/re-generate button
- **Choose your model** — tiny (fastest, ~75MB) through large-v3 (most accurate, ~3GB); download via artisan command

### Poster &amp; Thumbnail Generation

[](#poster--thumbnail-generation)

- **Automatic poster extraction** — a JPEG frame is pulled from the video at a configurable point and stored alongside the converted files
- **`{{ video }}` tag integration** — the poster is used as the `poster` attribute automatically, with optional Glide resizing via tag parameters
- **CP asset browser thumbnails** — poster frames are injected into the Statamic CP so videos show a real image instead of a broken placeholder
- **Animated WebP thumbnails** (optional) — generate a short looping preview clip for the asset browser, created entirely by FFmpeg with no dependency on ImageMagick

### Control Panel Integration

[](#control-panel-integration)

- **Conversion status fieldtype** — add it to any asset blueprint to see per-preset status (Not Started, Pending, Processing, Completed, Failed, Skipped) directly in the asset editor
- **Live status updates** — the fieldtype polls automatically while jobs are running, updating in real time without a page refresh
- **Re-run from the CP** — re-queue individual presets or all conversions with a single click
- **Skipped preset details** — when a preset is skipped due to a condition, the exact condition and asset value are shown
- **Asset listing column** — add the fieldtype as a column in the assets browser for a quick at-a-glance status indicator with a hover popover showing per-preset details

### Developer Experience

[](#developer-experience)

- **Queued processing** — all jobs run as background queue workers via Laravel Horizon or any queue driver
- **Artisan commands** — download FFmpeg and whisper.cpp binaries, batch-process existing assets
- **Detailed logging** — per-job debug and error logs for every step
- **`{{ video }}` Antlers tag + `` Blade component** — both produce identical output; use whichever fits your template stack
- **Publishable templates** — customize both the Antlers and Blade views by publishing them
- **Asset deletion cleanup** — conversion files, posters, thumbnails, and transcripts are automatically deleted when an asset is removed from the CP
- **Events** — `VideoConversionCompleted` and `VideoAssetProcessed` Laravel events for downstream automation (static cache clearing, notifications, etc.)

Screenshots
-----------

[](#screenshots)

**Processing** — live status polling as jobs run, with per-preset re-run controls:

[![Video Tools Status — Processing](.github/screenshot_1.jpg)](.github/screenshot_1.jpg)

**Completed** — full conversion details, HLS quality levels, and all five transcription formats with download and copy-URL actions:

[![Video Tools Status — Completed](.github/screenshot_2.jpg)](.github/screenshot_2.jpg)

Installation
------------

[](#installation)

```
composer require eminos/statamic-video-tools
```

Publish the config file:

```
php artisan vendor:publish --tag=statamic-video-tools-config
```

Download FFmpeg and point your `.env` to it:

```
php artisan video-tools:download-ffmpeg
```

```
# Add to .env — use the absolute path to your project's storage directory
FFMPEG_BINARIES=/var/www/your-site/storage/app/ffmpeg/ffmpeg
FFPROBE_BINARIES=/var/www/your-site/storage/app/ffmpeg/ffprobe
```

> If FFmpeg is already installed system-wide (`which ffmpeg` returns a path), skip the download and the `.env` step — the defaults work automatically.

Optionally, download whisper.cpp for AI transcription (Linux requires cmake and build-essential):

```
php artisan video-tools:download-whisper
php artisan video-tools:download-whisper --model=small  # better accuracy
```

Quick Start
-----------

[](#quick-start)

**1. Configure a container** in `config/video-tools.php`:

```
'containers' => [
    'assets' => [
        'presets'       => ['av1_1080p', 'mp4_1080p'],
        'transcription' => false, // override per-container; or omit to inherit global setting
    ],
    'talks' => [
        'presets'       => ['av1_1080p', 'mp4_1080p'],
        'transcription' => true,  // always transcribe videos in this container
    ],
],
```

**2. Enable transcription** (optional):

```
'transcription' => [
    'enabled' => true, // global default; overridable per container above
    'model'   => env('WHISPER_MODEL', storage_path('app/whisper/models/ggml-base.bin')),
],
```

**3. Add the status fieldtype** to your asset blueprint in the Statamic CP blueprint editor. Search for "Video Tools Status".

**4. Use the video tag** in your Antlers templates:

```
{{# Self-closing: renders full  with sources, poster, and  automatically #}}
{{ video :asset="hero_video" autoplay muted loop playsinline class="w-full" }}

{{# With poster resizing #}}
{{ video :asset="hero_video" controls poster:width="1280" poster:quality="85" }}

{{# HLS adaptive streaming #}}
{{ video :asset="talk_video" hls controls }}

{{# Pair tag: build your own markup with access to sources, poster, and transcript #}}
{{ video :asset="talk_video" }}

        {{ sources }}{{ /sources }}

    {{ if transcript.html }}
        {{ transcript.html | raw }}
    {{ /if }}
{{ /video }}
```

**5. Upload a video.** Conversions, poster, thumbnail, and transcription all run automatically in the background.

Documentation
-------------

[](#documentation)

Complete technical reference is available in [DOCUMENTATION.md](DOCUMENTATION.md):

- [Configuration](DOCUMENTATION.md#configuration)
- [Presets](DOCUMENTATION.md#presets)
- [Poster &amp; Thumbnail Generation](DOCUMENTATION.md#poster--thumbnail-generation)
- [AI Transcription](DOCUMENTATION.md#ai-transcription)
- [The `{{ video }}` Tag](DOCUMENTATION.md#the--video--tag)
- [HLS Streaming](DOCUMENTATION.md#hls-adaptive-streaming)
- [CP Fieldtype](DOCUMENTATION.md#cp-fieldtype)
- [Artisan Commands](DOCUMENTATION.md#artisan-commands)
- [Asset Metadata Structure](DOCUMENTATION.md#asset-metadata-structure)

Requirements
------------

[](#requirements)

- PHP 8.3+
- Statamic 6.x
- FFmpeg and FFprobe ([download via artisan](DOCUMENTATION.md#download-ffmpeg))
- whisper.cpp binary + model ([download via artisan](DOCUMENTATION.md#download-whisper), transcription only)
- A queue worker (Laravel Horizon recommended) for background processing

Features Ideas
--------------

[](#features-ideas)

Features being considered for future releases.

- **Transcript translation** — translate generated transcripts into other languages. Whisper can translate audio directly to English via `--task translate`, but translating to arbitrary languages (e.g. Swedish → French) requires an external service such as DeepL or OpenAI. The translated VTT/SRT files would be stored alongside the originals and exposed via the tag as additional `` elements with their respective `srclang` attributes.
- **Transcription editor** — view and edit transcription files directly in the CP asset editor. Includes a find &amp; replace tool that applies corrections across all five output formats (VTT, SRT, TXT, transcript, JSON) simultaneously, plus a per-file free-text editor for manual tweaks.
- **Video clipping** — extract a time range from any video into a new Statamic asset via an artisan command or CP action. Powered by FFmpeg, with no re-encoding required.
- **Audio normalization** — optional loudness normalization during encoding via FFmpeg's `loudnorm` filter. Ensures consistent audio levels across all encoded outputs regardless of the source recording.
- **Thumbnail at timecode** — generate a poster image from a specific point in the video (e.g. `poster:time="30"` on the tag). Useful for picking a custom frame without manually generating a new poster.
- **Scrubbing sprite sheets** — generate a contact sheet of thumbnail frames spaced at regular intervals, for video scrubbing previews (like YouTube's hover thumbnails). Compatible with Video.js and Plyr.
- **Basic view tracking** — log play events and watch duration per asset to a local database table. Surfaces as a simple "X views, Y avg watch time" stat in the CP asset editor.
- **Private/signed streaming** — serve video files through a Laravel controller with expiring signed URLs, for non-public content that shouldn't be directly accessible.
- **Waveform images** — extract an audio waveform visualization via FFmpeg, useful for podcast or interview content in the CP.
- **Video watermarking** — overlay a logo or image during encoding via an FFmpeg filter.

Support
-------

[](#support)

For support, questions, or feature requests, please open an issue on this GitHub repository.

License
-------

[](#license)

This is a commercial addon that requires a license for production use.

[Purchase a license on the Statamic Marketplace →](https://statamic.com/addons/eminos/statamic-video-tools)

See [LICENSE.md](LICENSE.md) for full terms.

Copyright © 2026 Emin Jasarevic / [kiwikiwi](https://kiwikiwi.se)

---

Made by [kiwikiwi](https://kiwikiwi.se) for the Statamic community

###  Health Score

36

—

LowBetter than 79% of packages

Maintenance73

Regular maintenance activity

Popularity6

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity49

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

108d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/5f7b9b5acefc797c0c0cf24b4b05ce1f55e50a0c20e5bdbf647eae53b0a16fab?d=identicon)[eminos](/maintainers/eminos)

---

Top Contributors

[![eminos](https://avatars.githubusercontent.com/u/1682784?v=4)](https://github.com/eminos "eminos (2 commits)")

---

Tags

encodingvideoffmpegThumbnailsstatamicTranscriptionwhisperhlsav1Statamic addonposteradaptive-streaming

###  Code Quality

TestsPest

### Embed Badge

![Health badge](/badges/eminos-statamic-video-tools/health.svg)

```
[![Health](https://phpackages.com/badges/eminos-statamic-video-tools/health.svg)](https://phpackages.com/packages/eminos-statamic-video-tools)
```

###  Alternatives

[php-ffmpeg/php-ffmpeg

FFMpeg PHP, an Object Oriented library to communicate with AVconv / ffmpeg

5.0k23.2M183](/packages/php-ffmpeg-php-ffmpeg)[lakshmaji/thumbnail

Thumbnails for videos

108123.0k](/packages/lakshmaji-thumbnail)[mostafaznv/nova-video

Video Field for Laravel Nova

22437.2k2](/packages/mostafaznv-nova-video)[lakshmajim/thumbnail

Thumbnails for videos

1088.0k](/packages/lakshmajim-thumbnail)[aminyazdanpanah/php-shaka

Shaka PHP is a library that uses Shaka Packager for DASH and HLS packaging and encryption, supporting Common Encryption for Widevine and other DRM Systems.

929.4k1](/packages/aminyazdanpanah-php-shaka)[mehrdad-dadkhah/hls-video-generater

PHP library for generating video m3u8 playlist

241.4k](/packages/mehrdad-dadkhah-hls-video-generater)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
