Remove AI Metadata from Video with FFmpeg

March 2, 2026 · RenderIO

Every AI tool leaves a fingerprint in your video

You generate a video with Runway. The output MP4 contains metadata fields that identify it as AI-generated. TikTok, Instagram, and YouTube can read these fields. Some platforms flag or suppress content based on them.

This isn't speculation. The C2PA standard (Content Credentials) is specifically designed to tag AI-generated content, and major AI video tools are adopting it. Even without C2PA, tools embed encoder names, creation timestamps, and custom metadata that identify their output.

Stripping this metadata is one FFmpeg command. But knowing what to strip and verifying it's gone requires understanding what's there.

What metadata AI tools embed

Common metadata fields

Every video file has standard metadata containers:

  • encoder: Software that created the file (e.g., "Runway Gen-3", "Lavf60.3.100")

  • creation_time: When the file was created

  • comment: Free-text field, often contains tool info

  • handler_name: Names of audio/video stream handlers

  • title: Sometimes auto-populated by the tool

Tool-specific metadata

Runway: Embeds encoder information and may include C2PA content credentials. The metadata often includes Runway-specific handler names and encoding parameters that are distinctive.

Kling AI: Chinese metadata fields may appear. Encoder strings reference Kling's rendering pipeline.

Pika Labs: Includes generation parameters in metadata. Free tier adds visible watermarks in addition to metadata.

Sora: OpenAI is committed to C2PA. Sora outputs include Content Credentials manifests that declare AI origin.

Stable Video Diffusion: Open-source tools vary, but ComfyUI and similar frontends often embed workflow metadata.

C2PA Content Credentials

C2PA is a metadata standard backed by Adobe, Microsoft, Google, and others. It embeds:

  • A manifest declaring the content's origin

  • Cryptographic signatures proving the declaration

  • Action history (what tool generated it, what edits were made)

C2PA data lives in the file's metadata containers (XMP or JUMBF). FFmpeg's -map_metadata -1 removes the standard containers, but C2PA JUMBF data may require additional handling.

Viewing metadata before removal

Use ffprobe to see what's in your file:

ffprobe -v quiet -print_format json -show_format -show_streams video.mp4

Look for these sections in the output:

{
  "format": {
    "tags": {
      "encoder": "Lavf60.3.100",
      "creation_time": "2026-02-01T12:00:00.000000Z",
      "comment": "Generated by AI Tool",
      "title": "AI Generated Content"
    }
  },
  "streams": [
    {
      "tags": {
        "handler_name": "VideoHandler",
        "encoder": "AI Video Encoder v2.1"
      }
    }
  ]
}

Any field that references an AI tool needs to go.

Stripping metadata with FFmpeg

Basic metadata removal

ffmpeg -i input.mp4 -map_metadata -1 -c:v copy -c:a copy output.mp4

-map_metadata -1 removes all metadata from the output. -c:v copy -c:a copy copies streams without re-encoding. Fast, but doesn't change the video content itself.

Deep metadata removal

Some metadata survives -map_metadata -1 because it lives in stream-level containers. For complete removal:

ffmpeg -i input.mp4 \
  -map_metadata -1 \
  -map_metadata:s:v -1 \
  -map_metadata:s:a -1 \
  -fflags +bitexact \
  -flags:v +bitexact \
  -flags:a +bitexact \
  -c:v copy -c:a copy \
  output.mp4
  • -map_metadata:s:v -1: Removes video stream metadata

  • -map_metadata:s:a -1: Removes audio stream metadata

  • -fflags +bitexact: Prevents FFmpeg from adding its own metadata

  • -flags:v +bitexact and -flags:a +bitexact: Prevents codec-level metadata

Nuclear option: re-encode everything

For maximum metadata removal, re-encode the entire file. This destroys any metadata embedded in the encoding structure:

ffmpeg -i input.mp4 \
  -map_metadata -1 \
  -fflags +bitexact \
  -c:v libx264 -crf 22 -preset fast \
  -c:a aac -b:a 128k \
  -movflags +faststart \
  output.mp4

Re-encoding creates a completely new file. No metadata from the original survives. The only downside: slight quality loss and longer processing time.

API call for metadata stripping

curl -X POST https://renderio.dev/api/v1/run-ffmpeg-command \
  -H "Content-Type: application/json" \
  -H "X-API-KEY: your_api_key" \
  -d '{
    "ffmpeg_command": "-i {{in_video}} -map_metadata -1 -map_metadata:s:v -1 -map_metadata:s:a -1 -fflags +bitexact -c:v libx264 -crf 22 -c:a aac -b:a 128k {{out_video}}",
    "input_files": { "in_video": "https://example.com/ai-video.mp4" },
    "output_files": { "out_video": "clean.mp4" }
  }'

Handling C2PA specifically

C2PA content credentials use JUMBF (JPEG Universal Metadata Box Format) or XMP. FFmpeg's metadata stripping covers XMP in most cases. For JUMBF:

Re-encoding the file (-c:v libx264 instead of -c:v copy) is the most reliable way to remove JUMBF data, because it creates a completely new file structure.

If you want to verify C2PA removal, use the c2patool:

# Install c2patool (Rust-based CLI)
cargo install c2patool

# Check for C2PA data
c2patool input.mp4

# Should return "No claim found" after stripping
c2patool output.mp4

Verification: confirm metadata is gone

After stripping, verify nothing remains:

# Check format-level metadata
ffprobe -v quiet -print_format json -show_format output.mp4 | grep -i "encoder\|comment\|title\|creation\|tool"

# Check stream-level metadata
ffprobe -v quiet -print_format json -show_streams output.mp4 | grep -i "encoder\|handler\|vendor\|comment"

# Check for any remaining tags
ffprobe -v quiet -show_entries format_tags -show_entries stream_tags output.mp4

The output should be empty or contain only generic FFmpeg encoder strings.

Batch metadata stripping

Strip metadata from multiple AI videos:

import requests

API_KEY = "ffsk_your_key"
HEADERS = {"Content-Type": "application/json", "X-API-KEY": API_KEY}

videos = [
    "https://storage.example.com/runway-output-1.mp4",
    "https://storage.example.com/runway-output-2.mp4",
    "https://storage.example.com/kling-output-1.mp4",
    "https://storage.example.com/sora-output-1.mp4",
]

for i, url in enumerate(videos):
    res = requests.post(
        "https://renderio.dev/api/v1/run-ffmpeg-command",
        headers=HEADERS,
        json={
            "ffmpeg_command": "-i {{in_video}} -map_metadata -1 -map_metadata:s:v -1 -map_metadata:s:a -1 -fflags +bitexact -c:v libx264 -crf 22 -c:a aac -b:a 128k {{out_video}}",
            "input_files": {"in_video": url},
            "output_files": {"out_video": f"clean_{i+1}.mp4"}
        }
    )
    print(f"Video {i+1}: {res.json()['command_id']}")

Beyond metadata: additional steps

Stripping metadata is necessary but not sufficient for avoiding AI detection. Platforms also use:

  • Visual pattern analysis: AI video has characteristic smoothness and consistency

  • Audio pattern analysis: AI-generated speech or music has specific artifacts

For comprehensive AI detection avoidance, combine metadata stripping with:

  1. Add sensor noise: -vf "noise=alls=6:allf=t" (mimics real camera noise)

  2. Crop edges: -vf "crop=iw-6:ih-6:3:3" (removes potential edge artifacts)

  3. Adjust colors: -vf "eq=brightness=0.01:saturation=1.02" (shifts away from AI defaults)

  4. Modify audio: -af "asetrate=44100*1.005,aresample=44100" (shifts pitch slightly)

Combined command:

ffmpeg -i ai-video.mp4 \
  -vf "crop=iw-6:ih-6:3:3,noise=alls=6:allf=t,eq=brightness=0.01:saturation=1.02" \
  -af "asetrate=44100*1.005,aresample=44100" \
  -map_metadata -1 -fflags +bitexact \
  -c:v libx264 -crf 22 \
  -c:a aac -b:a 128k \
  output.mp4

This strips metadata, adds natural-looking noise, adjusts colors, and modifies audio. The result is indistinguishable from a camera-recorded video.

Get started

The Starter plan at $9/mo includes 500 commands. Explore the FFmpeg API features or grab your API key and start processing AI videos.