Mixpeek Logo
    Advanced
    Security
    11 min read

    Forensic Video Search for Incident Investigation

    For security teams investigating incidents across 100+ cameras. Search hours of footage in seconds. Find suspects, vehicles, and objects instantly.

    Who It's For

    Corporate security teams, law enforcement, and loss prevention departments who need to rapidly search video archives during incident investigations

    Problem Solved

    Investigators spend hours or days scrubbing through footage to find relevant clips. Critical evidence is missed due to human fatigue and time pressure

    Why Mixpeek

    Search weeks of footage in seconds, find specific individuals across multiple cameras, and generate evidence packages with timestamped clips

    Overview

    When incidents occur, every minute matters. This use case shows how Mixpeek transforms forensic video review from a hours-long ordeal into a seconds-long search.

    Challenges This Solves

    Time Pressure

    Investigations have hours, not days, to review footage

    Impact: Evidence missed, suspects escape, cases go cold

    Footage Volume

    100+ cameras generating thousands of hours of video

    Impact: Humanly impossible to review all potentially relevant footage

    Cross-Camera Tracking

    Following individuals across different camera views

    Impact: Gaps in timeline, incomplete incident reconstruction

    Evidence Standards

    Chain of custody and authentication requirements

    Impact: Evidence may be inadmissible without proper documentation

    Implementation Steps

    Mixpeek indexes video footage by detected faces, objects, vehicles, and activities, enabling instant search by description, reference image, or behavioral patterns

    1

    Index Video Archive

    Process historical and real-time footage

    import { Mixpeek } from 'mixpeek';
    const client = new Mixpeek({ apiKey: process.env.MIXPEEK_API_KEY });
    // Index video archive with forensic extractors
    await client.buckets.connect({
    collection_id: 'video-archive',
    bucket_uri: 's3://security/footage/',
    extractors: [
    'face-detection', // Detect and encode faces
    'person-reidentification', // Track across cameras
    'vehicle-detection', // License plates, makes, colors
    'object-detection', // Items, weapons, packages
    'activity-recognition' // Running, fighting, loitering
    ],
    settings: {
    retention_days: 90,
    index_interval_seconds: 1,
    hash_frames: true, // For authentication
    preserve_metadata: true
    }
    });
    2

    Search by Description

    Find footage matching verbal descriptions

    // Search by witness description
    async function searchByDescription(description: string, timeRange: {
    start: Date;
    end: Date;
    cameras?: string[];
    }) {
    // e.g., "person in red jacket carrying backpack"
    const results = await client.retrieve({
    collection_id: 'video-archive',
    query: {
    type: 'text',
    text: description
    },
    filters: {
    timestamp: {
    $gte: timeRange.start.toISOString(),
    $lte: timeRange.end.toISOString()
    },
    camera_id: timeRange.cameras ? { $in: timeRange.cameras } : undefined
    },
    return_fields: [
    'timestamp', 'camera_id', 'thumbnail_url',
    'detected_persons', 'detected_objects', 'clip_url'
    ],
    limit: 100
    });
    return results;
    }
    3

    Search by Reference Image

    Find all appearances of a specific person/vehicle

    // Find person across all cameras using reference image
    async function findPersonInFootage(referenceImageUrl: string, timeRange: {
    start: Date;
    end: Date;
    }) {
    // First, get face embedding from reference
    const reference = await client.extract({
    url: referenceImageUrl,
    extractors: ['face-detection']
    });
    // Search for matches across all footage
    const appearances = await client.retrieve({
    collection_id: 'video-archive',
    query: {
    type: 'face',
    embedding: reference.faces[0].embedding,
    threshold: 0.85 // High confidence matching
    },
    filters: {
    timestamp: {
    $gte: timeRange.start.toISOString(),
    $lte: timeRange.end.toISOString()
    }
    },
    return_fields: [
    'timestamp', 'camera_id', 'thumbnail_url',
    'face_confidence', 'clip_url', 'bounding_box'
    ],
    sort: { timestamp: 'asc' },
    limit: 500
    });
    // Reconstruct timeline
    return {
    appearances: appearances,
    timeline: buildTimeline(appearances),
    cameras_visited: [...new Set(appearances.map(a => a.camera_id))]
    };
    }
    4

    Generate Evidence Package

    Export clips with chain of custody documentation

    // Generate forensic evidence package
    async function generateEvidencePackage(caseId: string, clips: ClipSelection[]) {
    const package = await client.forensics.createPackage({
    case_id: caseId,
    clips: clips.map(c => ({
    source_id: c.clip_id,
    start_time: c.start,
    end_time: c.end,
    annotations: c.notes
    })),
    include: {
    original_footage: true,
    frame_hashes: true, // Tamper detection
    metadata_log: true, // Camera settings, timestamps
    chain_of_custody: true, // Access log
    search_methodology: true // How clips were found
    },
    export_format: 'forensic_standard',
    encryption: 'aes256'
    });
    return {
    package_id: package.id,
    download_url: package.secure_url,
    hash: package.package_hash,
    custody_document: package.chain_of_custody_pdf
    };
    }

    Expected Outcomes

    Search weeks of footage in under 30 seconds

    Search Speed

    90% reduction in time to find relevant footage

    Investigation Time

    5x more relevant clips found vs manual review

    Evidence Coverage

    95% accuracy tracking individuals across cameras

    Cross-Camera Tracking

    40% improvement in incident case resolution rate

    Case Resolution

    Frequently Asked Questions

    Ready to Implement This Use Case?

    Our team can help you get started with Forensic Video Search for Incident Investigation in your organization.