Clean Metadata from AI Videos video-scrub
Clean metadata from AI videos before sharing them. video-scrub removes source location, device and timestamp information, then checks the output for residual metadata.
Works with Claude Code · Codex
Requirements
- Node.js >= 18
- FFmpeg
- FFprobe
Overview
What you get
- A new video file with source metadata removed, plus a verification report.
- A copy mode that avoids re-encoding the video, and an encode mode that re-encodes it. Audio is re-encoded in both modes.
Good fit
- Checking and cleaning file metadata before sharing or delivering a video.
Not for
- Removing visible or robust pixel watermarks, or guaranteeing that a platform will not identify AI-generated content.
Tutorial
Install the skill and check the dependencies
An exported AI video may still contain information about the generating software or creation time. This is file metadata, distinct from text or watermarks visible in the picture. video-scrub rebuilds the container using only the first video stream and first audio stream, then checks for residual source metadata. It also works with videos from other sources.
For this example, use one MP4 file and create a separate output so you can compare it with the source.
-
Check the dependencies in a terminal:
node --version ffmpeg -version ffprobe -versionNode.js must be version 18 or later. The other two commands should also print version information. The installer creates skill links; it does not install these dependencies. If any are missing, use the Node.js download page or FFmpeg download page to find installation options for your system, then check the versions again.
-
Run the commands in this page’s installation section to install only
video-scrub. The script detects the Claude Code and Codex configuration directories and links the skill to them. To select a host explicitly, run one of these commands from the repository root:./scripts/install.sh --claude video-scrub ./scripts/install.sh --codex video-scrubInstallation is complete when the script reports a link from the target directory to
skills/video-scrubin the repository. Keep the repository in place. Rungit pullthere when you want to update it. -
Choose one approach: to have AI run the workflow, start a new Claude Code or Codex session and send the request shown under Usage above, replacing the file paths. To process the file directly, use the terminal commands in the next section.
Inspect the source, clean it, and verify the output
Run these commands from the reelbench-skills repository root. Replace the example paths with your own. Keep the quotes around paths that contain spaces.
-
Inspect the source file:
node skills/video-scrub/scripts/video-scrub.mjs inspect "/absolute/path/input.mp4"Look for location, device, timestamp, and encoding-tool information, along with additional audio tracks, subtitles, or HDR information. Not every source contains every field. An absent location field does not mean the command failed.
-
Clean and verify the file, choosing a new output filename that is not already in use:
node skills/video-scrub/scripts/video-scrub.mjs run "/absolute/path/input.mp4" -o "/absolute/path/input-clean.mp4" --mode copy --profile barecopyavoids re-encoding the video, but audio is re-encoded as AAC, which can reduce audio quality. The current script has no option to retain the original audio encoding. For audio-sensitive work, keep the source and compare by listening.--profilecontrols the tool and time information written to the output. This example usesbare, which adds no recording-tool labels or creation time. The defaultobsprofile retains the FFmpeg muxer identifier and standard stream handler names, and writes a new creation time. To minimize file information, keepbareas shown here.runprocesses the file, then reports the results of its checks, including residual metadata, stream composition, duration, and decodability.✓means passed,✗means failed, and–means skipped with a reason. The final✅ … 道门全过message means the script’s checks passed;❌ … 道门红了means some failed, with exit code 1. These messages are printed in Chinese by the script. A skipped check has not been performed: read the reason. The existence of an output file is not enough. -
To verify the same output again, use the same mode and profile:
node skills/video-scrub/scripts/video-scrub.mjs verify "/absolute/path/input.mp4" "/absolute/path/input-clean.mp4" --mode copy --profile bareThis report covers the script’s checks, not a platform’s AI-content detection.
Choose a mode and check the picture, sound, and subtitles
Play the output and compare its sound, orientation, color, and duration with the source. This workflow retains only the first video stream and first audio stream. Separate subtitle tracks and additional audio tracks are not retained. If your delivery needs selectable subtitles or multiple languages, do not replace the complete delivery file with this output.
When you need to re-encode
Start with the default copy mode to preserve the existing video encoding. If you need to re-encode the video, save another version:
node skills/video-scrub/scripts/video-scrub.mjs run "/absolute/path/input.mp4" -o "/absolute/path/input-encoded.mp4" --mode encode --profile bare --crf 18
--crf controls re-encoding quality and only applies to encode mode. Re-encoding takes longer and can change picture quality. Start with copy for metadata cleanup; choose encode when you need to re-encode the video.
With HDR or embedded captions
SEI is supplementary information in the encoded video stream. It can carry HDR information, embedded captions, or encoder identifiers. For HDR sources, the script leaves this SEI in place to avoid affecting color. If the report flags a remaining identifier, read the explanation first. SEI removal can also affect embedded captions, so check them throughout the video. Passing the metadata checks does not establish that every caption survived.
Before processing your own video, check for multiple audio tracks, subtitles, or HDR and decide whether this workflow fits the requirements above. For a standard single-audio-track video, keep copy and bare, replace the input and output paths, and check the new result.