media · diff
git:20261021.09ec491 to git:20261021.03f5455
51 added, 135 removed. Audit A to B.
---
name: media
description: >-
Infrastructure skill - DCC-agnostic media probing, transcoding, thumbnails,
- frame extraction, and image-sequence-to-MP4 conversion through installed
- FFmpeg. Use when agents need to preflight, inspect, or share media outputs.
+ frame extraction, and image-sequence-to-MP4 conversion through vx-managed
+ FFmpeg. Use when agents need to inspect or share render/playblast outputs.
Not for arbitrary shell or vx execution - use typed media tools only.
license: MIT
- compatibility: Python 3.7+. Requires external FFmpeg and matching FFprobe; explicit executable overrides, then installed vx runtime, then system PATH. Never installs or downloads dependencies.
+ compatibility: Uses vx on PATH; non-read-only media tools can bootstrap vx with the official install script.
metadata:
dcc-mcp:
dcc: python
recall-context:
app_type: python
domain: media
workflow_stage: interchange
task_category: export
version: "0.1.0"
layer: infrastructure
- search-hint: "media, ffmpeg, ffprobe, vx ffmpeg, check runtime, preflight, encoder, image sequence, render output, playblast, mp4, transcode, extract frames, thumbnail, probe video, audio-only, wav, ogg, vorbis"
+ search-hint: "media, ffmpeg, ffprobe, vx ffmpeg, image sequence, render output, playblast, mp4, transcode, extract frames, thumbnail, probe video, audio-only, wav, ogg, vorbis"
tags: "media, video, image-sequence, ffmpeg, ffprobe, vx, infrastructure, dcc-agnostic"
tools: tools.yaml
---
# Media
DCC-agnostic media utilities for render, playblast, flipbook, and review
- artifacts. FFmpeg and matching FFprobe are external, operator-approved
- prerequisites, not bundled with Core. Every media tool uses only installed
- binaries; none installs vx, downloads FFmpeg, or invokes a launcher that might
- bootstrap dependencies. A missing runtime is an actionable preflight failure.
+ artifacts. The tools invoke FFmpeg and FFprobe through `vx`, so a fresh machine
+ does not need users to install FFmpeg manually. If `vx` is not available on
+ `PATH`, non-read-only media tools run the official `loonghao/vx` installer for
+ the current platform and then retry the media command with the installed
+ binary. `media__probe` remains side-effect-free: when `vx` is missing it
+ returns `vx_not_found` instead of installing anything.
- Use `media__check_runtime` before expensive render/export work. Prefer native
- DCC skills for creating the render output, then use `media__probe`,
- `media__sequence_to_mp4`, `media__thumbnail`, `media__transcode`,
- `media__transcode_audio`, or `media__extract_frames` to inspect or repackage
- files already on disk. Discover the capability, follow the returned load or
- describe step, and call the returned tool slug with typed arguments. Do not
- guess gateway slugs or replace the tool with arbitrary shell commands.
+ Use this skill after a DCC-native render/playblast/export tool has produced
+ files on disk. Prefer native DCC skills for creating the render output, then use
+ `media__probe`, `media__sequence_to_mp4`, `media__thumbnail`,
+ `media__transcode`, or `media__extract_frames` to inspect or repackage the
+ artifact.
## Safety Contract
This skill intentionally exposes typed media operations, not a generic
- `vx <command>` runner. Every tool builds a fixed argument vector for the
- resolved FFmpeg or FFprobe executable without `shell=True`, validates paths
- and enum fields, rejects option-like paths, and requires explicit overwrite
- intent before replacing outputs. Verified audio-only output is stricter: its
- destination must be fresh and cannot be overwritten.
-
- ## Runtime selection and preparation
-
- FFmpeg selection follows this priority:
-
- 1. `DCC_MCP_MEDIA_FFMPEG_BIN`, if set to an absolute executable path.
- 2. An already-installed FFmpeg in the local vx store (`VX_HOME`, or `~/.vx`
- by default), discovered from local files without executing vx.
- 3. `ffmpeg` on the server process's system `PATH` if there is no installed vx
- runtime.
+ `vx <command>` runner. Every tool builds a fixed `vx ffmpeg` or `vx ffprobe`
+ argument vector without `shell=True`, validates paths and enum fields, rejects
+ option-like paths, and requires explicit overwrite intent before replacing
+ outputs.
- The vx lookup checks the vx 0.9.37 provider layouts under
- `<vx-root>/store/ffmpeg/<version>`, with at most 128 entries and the highest
- numeric stable version first. It does not require a vx launcher, consult
- `vx.toml` or `vx.lock`, or select preview/custom version names. Pin a version
- or use an unsupported layout through explicit executable overrides instead.
+ Configuration:
- `DCC_MCP_MEDIA_FFPROBE_BIN` may specify the matching probe's absolute
- executable path. Otherwise, resolve FFprobe only as a sibling of the resolved
- FFmpeg binary, never from an unrelated `PATH` entry. FFmpeg and FFprobe must
- have matching release/build identities. An invalid explicit override fails;
- it is not permission to switch installations or silently choose another codec.
- Override values are executable paths, not command names, shell fragments, or
- arguments. Only native ELF, PE, or Mach-O executables are accepted; scripts and
- known vx shim directories are rejected. Native wrappers cannot be identified
- reliably from file headers. Spaces in paths are supported. Configure
- these variables in the media server's environment, not only the agent's shell.
+ - `DCC_MCP_MEDIA_VX_BIN`: explicit vx executable path or command name.
+ - `DCC_MCP_MEDIA_AUTO_INSTALL_VX=0`: disable automatic vx installation for
+ non-read-only media tools.
+ - `VX_INSTALL_DIR`: override the official vx installer target directory.
- `DCC_MCP_MEDIA_VX_BIN` and `DCC_MCP_MEDIA_AUTO_INSTALL_VX` no longer control
- media execution. Migrate an old pinned vx launcher to the FFmpeg/FFprobe
- executable overrides. `VX_INSTALL_DIR` is not a media runtime selector, and no
- installer configuration enables media-tool downloads.
+ Installer commands:
- Before an approved online setup, ask the user for permission to install or
- download dependencies. Use an existing vx installation with
- `vx install ffmpeg@8.1`, or the operating system's package manager, to obtain
- FFmpeg and FFprobe together. If vx needs installation, download its official
- installer to a local file, inspect it, and execute it only after approval;
- never pipe an installer directly into a shell. Prepare approved binaries and
- required shared libraries before an offline workload. Core's MIT license does
- not replace FFmpeg's build-dependent LGPL/GPL license; review the selected
- distribution's terms before redistribution.
+ ```bash
+ curl -fsSL https://raw.githubusercontent.com/loonghao/vx/main/install.sh | bash
+ powershell -c "irm https://raw.githubusercontent.com/loonghao/vx/main/install.ps1 | iex"
+ ```
Use absolute paths where possible. Relative paths are resolved by the process
running the DCC-MCP server, which may not be the same working directory as the
- agent. Runtime overrides always require absolute paths.
-
- ## Read-only runtime preflight
-
- Discover and call `media__check_runtime` before scheduling media work. Its
- optional `required_encoders` array defaults to `pcm_s16le`, `libvorbis`, and
- `pcm_f32le`; request the encoders needed for the intended workflow.
- `timeout_secs` is bounded to 60 seconds. This check creates no media output
- and performs no installation. The resolver itself starts no package manager
- or network request; preflight executes the selected local binaries for
- version and capability checks, so they remain operator-trusted code rather
- than a sandboxed guarantee against arbitrary binary behavior.
-
- Review the selected source, resolved absolute executable paths, versions,
- SHA-256 hashes, and required encoder availability. Keep this evidence with the
- job, and stop on missing binaries, build mismatches, or missing capabilities.
- Selection priority is not a trust attestation: a local vx installation or
- system path is an operator-trusted prerequisite, and a hash only identifies
- the executable bytes. Preflight does not replace native codec, output, or
- playback qualification. A later operation resolves and validates its own
- runtime; an earlier successful check is not a guarantee that files or the
- environment have remained unchanged.
+ agent.
## Verified audio-only encoding
Use `media__transcode_audio` for a fresh `.wav`/`pcm_s16le` or
`.ogg`/`libvorbis` output. Container and codec are explicit; incompatible pairs
are rejected before launch. Optional `audio_quality` is Vorbis-only (-1 to 10,
default 5). No resampling, channel conversion, overwrite, padding, trimming,
or codec fallback is exposed. The first audio stream is selected explicitly;
- video, subtitle, data and inherited metadata are excluded. Source sample rate
- and channel count are preserved, and a known source channel layout must match.
-
- OGG output uses fixed `-page_duration 1` muxer pagination to keep the priming
- packet off the final EOS page. This avoids the documented FFmpeg single-page
- Vorbis duration-accounting issue without padding, trimming, resampling, or
- changing compressed audio packets. See the
- [upstream diagnosis](https://ffmpeg.org/pipermail/ffmpeg-devel/2022-May/295939.html).
- More pages add container overhead; the full-decode sample-count gate is still
- mandatory, including for very short clips. This is not a codec fallback.
-
-
- This operation uses the same **already installed** FFmpeg/FFprobe selection
- policy as preflight; it does not install anything. The selected executables
- are **operator-trusted prerequisites**, not a supply-chain attestation. The
- tool pins their resolved absolute paths and records each executable's version,
- SHA-256 and resolution basis. Hashes identify the bytes used; neither a hash
- nor the discovery source independently authenticates those bytes. Requested
- encoder and `pcm_f32le` verification-encoder capabilities are checked before
- encoding; a missing encoder fails without silently choosing another build.
-
- Input is limited to 128 MiB, 8–192 kHz and 1–8 channels. Full f32le PCM decode
- is streamed, never saved, with a 256 MiB cap for each source/output decode.
- Text stdout has a 1 MiB cap; stderr has a 4 MiB total cap and retains only a
- 4 KiB diagnostic tail. Crossing a stream cap stops the owned process. Output
- uses FFmpeg's `-fs` limit, owner-thread size monitoring, and a strict 64 MiB
- pre-publication acceptance gate. FFmpeg can slightly overshoot `-fs`; this is
- **not an OS disk quota**. Limits and the shared operation timeout appear in
- receipts. Hashing also checks cancellation, time and byte budgets.
+ video, subtitle, data and inherited metadata are excluded.
- Encoding writes only to a private staging directory beside the destination.
- The final pathname is published through an atomic no-replace hard link only
- after complete validation. Filesystems without that operation fail closed;
- there is no copy/replace fallback. Failed operations retain diagnostic staging
- artifacts, never publish them or retry automatically. Successful publication
- is the commit point; a late cancellation does not retract a published file.
+ This tool requires **already installed** vx-managed FFmpeg and FFprobe. It
+ resolves FFmpeg using `vx --output-format json where ffmpeg`, rejects
+ system/global fallback, and finds FFprobe only in the same resolved bundle
+ directory (the official vx provider layout). It records each executable's
+ version, SHA-256 and resolution basis, and pins these absolute paths for execution. It checks encoder capability before encoding. Unlike the older
+ video helpers, this operation does not install vx or FFmpeg automatically.
- Receipts bind source/output hashes, actual codec/container/rate/channels,
- full-decode sample-frame counts and PCM hashes, resolved executable evidence,
- exact argv, Core-owned job identity when present, and cleanup state. Counts
- come from decoder PCM (including its codec-delay/skip handling), not container
- duration or packet count. A count change is a failure, never repaired. Lossy
- waveform quality, independent decoder/loop-boundary checks and browser playback
- remain separate qualification; matching counts alone do not prove quality. Lossy
- Vorbis can change very short signals substantially: preserving one sample is
- not a promise to reproduce that sample's amplitude. Do not waive fidelity
- requirements, pad/trim samples, or treat count acceptance as a quality score.
+ One total timeout bounds commands and streamed hashing/decoding. PCM decoding
+ is streamed and counted in sample frames (not container duration or packet
+ count); stderr retains a bounded tail. Receipts include source/output hashes,
+ actual codec/container/rate/channels, full-decode sample counts and PCM hashes,
+ resolved executable evidence and every exact argv. A sample count change is a
+ failure, never silently repaired. Lossy waveform quality and browser playback
+ remain separate acceptance checks; matching counts alone do not prove quality.
- The existing Core async job lifecycle supplies job identity and cancellation.
- The owner thread checks `check_dcc_cancelled()` at most 50 ms between process
- polls, and during hashing and before publication. Cancellation and timeout stop
- the owned group and retain the original reason/receipt. Poll the Core job to
- terminal state; admission is not artifact acceptance. POSIX processes run in
- owned groups. Windows uses `taskkill /T /F` and launcher reaping; failure or an
- already-exited launcher leaves cleanup `unknown`. Windows live cancellation,
- real Core transport cancellation and native codec qualification remain separate
- from host-free/POSIX subprocess tests. Cleanup has a separate bounded grace
- period; an uncertain cleanup never grants permission to retry.
+ The tool uses the existing Core async job lifecycle. Poll the returned owned
+ Core job to terminal state; do not treat admission as artifact acceptance.
+ Timeout/error receipts retain the unverified partial output path and status;
+ no retry or cleanup of the artifact is implicit. POSIX child processes run in
+ an owned process group which is killed and reaped on interruption. Windows
+ uses `taskkill /T /F` followed by launcher reaping; Windows live cancellation
+ qualification is separate from POSIX unit coverage.