# Video Analysis and Understanding Patterns

**Last updated:** 2026-02
**Status:** GA
**Category:** Multi-Modal AI

---

## Introduksjon

Videoanalyse og -forståing på Azure-plattforma kombinerer Azure AI Video Indexer sin spesialiserte videoanalyse med generative AI-modellar som GPT-4o for djupare semantisk forståing. Video Indexer ekstraherer over 30 ulike typar innsikt frå video — inkludert scenedeteksjon, talegjenkjenning, emosjonanalyse, OCR, ansiktsgjenkjenning og objektdeteksjon — medan GPT-4o sine visuelle kapabilitetar opnar for fri-form analyse av enkeltbilete og keyframes.

For norsk offentleg sektor er videoanalyse relevant for fleire bruksområde: analyse av overvakingsvideo for Direktoratet for digital tjenesteutvikling, transkripsjon og søk i offentlege høyringar for Stortinget, tilgjengelegheitsanalyse av offentleg video, og automatisert kvalitetskontroll av opplæringsvideo. Azure Video Indexer støttar norsk tale-til-tekst og kan oversette til 50+ språk.

Azure AI Video Indexer tilbyr også real-time videoanalyse (preview) via Azure Arc-enabled infrastruktur, som mogleggjer sanntidsanalyse av livevideo ved kanten — relevant for trafikkmonitorering og smart byinfrastruktur.

---

## Kjernekomponentar

| Komponent | Formål | Teknologi |
|-----------|--------|-----------|
| **Video Indexer** | Heilskapleg videoanalyse med 30+ innsiktstypar | Azure AI Video Indexer |
| **Scene Detection** | Identifiserer sceneovergangar basert på visuelle signal | Video Indexer AI |
| **Shot Detection** | Identifiserer kameraskift og redigeringsovergangar | Video Indexer AI |
| **Keyframe Extraction** | Vel representative bilete frå kvar shot | Video Indexer AI |
| **GPT-4o Vision** | Fri-form analyse av enkeltbilete frå video | Azure OpenAI |
| **Real-time Analysis** | Sanntids videoanalyse ved kanten | Video Indexer on Arc |
| **Spatial Analysis** | Persondeteksjon og bevegelsesanalyse | Azure AI Vision |

---

## Scene- og Action Detection

### Video Indexer Scene Detection

Scene detection identifiserer når ein scene endrar seg basert på visuelle signal. Ein scene representerer ei enkelt hending og består av ein serie relaterte shots.

| Innsiktstype | Beskriving |
|--------------|-----------|
| **Scenes** | Semantisk relaterte sekvenser av shots |
| **Shots** | Samanhengande biletesekvens frå same kamera |
| **Keyframes** | Mest representative bilde frå kvar shot |
| **Editorial Shot Type** | Wide, medium, close-up, extreme close-up, two-shot |
| **Observed People** | Persondeteksjon med bounding boxes |
| **Matched Person** | Kopling mellom observerte personar og ansikt |
| **Detected Clothing** | Klestype-identifisering knytt til personar |

### Indeksering med avanserte innstillingar

```python
import requests

def index_video_advanced(account_id, access_token, video_url, video_name):
    """Indekser video med full suite av innsikter."""

    base_url = "https://api.videoindexer.ai"

    response = requests.post(
        f"{base_url}/{account_id}/Videos",
        params={
            "accessToken": access_token,
            "name": video_name,
            "videoUrl": video_url,
            "language": "nb-NO",
            "indexingPreset": "AdvancedVideo",
            "streamingPreset": "Default",
            "sendSuccessEmail": True,
            "priority": "Normal"
        }
    )

    video_id = response.json()["id"]
    return video_id
```

### Indexing Presets

| Preset | Innsikter | Bruksscenario |
|--------|-----------|---------------|
| **Basic** | Transkripsjon, OCR, scener, keyframes | Enkel søkbarheit |
| **Standard** | Basic + emosjonar, nøkkelord, personar, sentiment | Innhaldsanalyse |
| **Advanced** | Standard + kledningsdeteksjon, audioeffektar, matched person | Full analyse |
| **Audio only** | Transkripsjon, sentimentanalyse, nøkkelord | Podcast/lydinnhald |

---

## Temporal Understanding og Summarization

### Tidslinje-basert forståing

Video Indexer gir tidsstempla innsikter som muliggjer temporal forståing:

```python
def get_video_timeline(account_id, video_id, access_token):
    """Hent tidslinje-baserte innsikter frå video."""

    base_url = "https://api.videoindexer.ai"

    response = requests.get(
        f"{base_url}/{account_id}/Videos/{video_id}/Index",
        params={
            "accessToken": access_token,
            "includeSummarizedInsights": True
        }
    )

    insights = response.json()

    # Scenetidslinje
    scenes = insights["videos"][0]["insights"]["scenes"]
    for scene in scenes:
        print(f"Scene {scene['id']}: "
              f"{format_time(scene['instances'][0]['start'])} - "
              f"{format_time(scene['instances'][0]['end'])}")

        # Shots i denne scena
        for shot in scene.get("shots", []):
            for keyframe in shot.get("keyFrames", []):
                print(f"  Keyframe: {format_time(keyframe['instances'][0]['start'])}")

    # Emosjonell tidslinje
    sentiments = insights["videos"][0]["insights"]["sentiments"]
    for sentiment in sentiments:
        print(f"Sentiment: {sentiment['sentimentType']} "
              f"(score: {sentiment['averageScore']:.2f})")
        for instance in sentiment["instances"]:
            print(f"  {format_time(instance['start'])} - "
                  f"{format_time(instance['end'])}")

    return insights
```

### AI-driven Video Summarization

Video Indexer tilbyr oppsummeringsfunksjonalitet for opptil 6-timars segment:

```python
def summarize_video_segment(account_id, video_id, access_token,
                            focus_on="", camera_description=""):
    """Generer AI-oppsummering av eit videosegment."""

    summary_config = {
        "focus_on": focus_on,           # Kva type hendingar å fokusere på
        "camera_description": camera_description  # Kamerakontekst
    }

    # Oppsummeringa består av:
    # 1. Overordna oversikt — generell beskriving av aktivitetar
    # 2. Highlights — spesifikke hendingar med tidsstempel

    return summary_config
```

### GPT-4o Keyframe Analysis

For djupare semantisk forståing, analyser keyframes med GPT-4o:

```python
from openai import AzureOpenAI

def analyze_keyframes_with_gpt4o(keyframe_urls, video_context):
    """Analyser keyframes frå video med GPT-4o for narrativ forståing."""

    client = AzureOpenAI(
        azure_endpoint="https://<resource>.openai.azure.com/",
        api_key="<api-key>",
        api_version="2024-08-01-preview"
    )

    # Bygg bildeinnhald frå keyframes
    image_content = []
    for i, url in enumerate(keyframe_urls):
        image_content.append({
            "type": "text",
            "text": f"Keyframe {i+1}:"
        })
        image_content.append({
            "type": "image_url",
            "image_url": {"url": url, "detail": "high"}
        })

    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {
                "role": "system",
                "content": (
                    "Du analyserer keyframes frå ein video. "
                    "Beskriv handlinga over tid, identifiser personar, "
                    "stad og kontekst. Gje ein temporal forståing av "
                    "kva som skjer i videoen basert på desse bileta."
                )
            },
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": f"Kontekst: {video_context}"},
                    *image_content,
                    {"type": "text", "text": "Analyser handlinga i videoen basert på keyframes."}
                ]
            }
        ],
        max_tokens=1000
    )

    return response.choices[0].message.content
```

---

## Multi-Frame Analysis Strategies

### Strategi 1: Uniform Sampling

```python
def uniform_sample_frames(total_frames, num_samples=10):
    """Vel jamlikt fordelte frames for analyse."""
    interval = total_frames // num_samples
    return [i * interval for i in range(num_samples)]
```

### Strategi 2: Keyframe-basert Sampling

Bruk Video Indexer sine keyframes som er algoritmisk valde for å representere kvar shot:

```python
def get_keyframes_for_analysis(video_insights):
    """Hent keyframes valde av Video Indexer."""
    keyframes = []
    for scene in video_insights["scenes"]:
        for shot in scene.get("shots", []):
            for kf in shot.get("keyFrames", []):
                keyframes.append({
                    "timestamp": kf["instances"][0]["start"],
                    "thumbnail_id": kf["instances"][0]["thumbnailId"],
                    "scene_id": scene["id"],
                    "shot_id": shot["id"]
                })
    return keyframes
```

### Strategi 3: Change-Detection Sampling

Fokuser på frames der visuell endring er størst:

```python
def change_detection_sampling(frames, threshold=0.3):
    """Vel frames basert på visuell endring."""
    selected = [frames[0]]

    for i in range(1, len(frames)):
        similarity = compute_visual_similarity(frames[i-1], frames[i])
        if similarity < (1 - threshold):
            selected.append(frames[i])

    return selected
```

### Strategi 4: Event-driven Sampling

Bruk Video Indexer-innsikter til å fokusere på interessante hendingar:

```python
def event_driven_sampling(video_insights, event_types=None):
    """Vel frames rundt spesifikke hendingstypar."""
    event_types = event_types or ["people", "emotions", "labels"]

    event_frames = []
    for event_type in event_types:
        events = video_insights.get(event_type, [])
        for event in events:
            for instance in event.get("instances", []):
                event_frames.append({
                    "timestamp": instance["start"],
                    "event_type": event_type,
                    "confidence": instance.get("confidence", 0)
                })

    # Sorter etter confidence og dedupliser
    event_frames.sort(key=lambda x: x["confidence"], reverse=True)
    return deduplicate_by_proximity(event_frames, min_gap_seconds=2)
```

---

## Integrasjon med Narrative Understanding

### Heilskapleg videoforståingspipeline

```
Video Input
   |
   ├── Video Indexer
   |   ├── Transkripsjon (tale → tekst)
   |   ├── Scene/Shot/Keyframe-deteksjon
   |   ├── Persondeteksjon og -gjenkjenning
   |   ├── OCR (tekst i video)
   |   ├── Emosjonanalyse
   |   └── Nøkkelord og emneanalyse
   |
   ├── GPT-4o Keyframe Analysis
   |   ├── Scene-beskriving
   |   ├── Handling-identifisering
   |   └── Kontekstuell tolking
   |
   └── Narrative Synthesis
       ├── Kronologisk samandrag
       ├── Hovudtema identifisering
       ├── Nøkkelhendingar med tidsstempel
       └── Sentiment-boge over tid
```

### Audio Insights

Video Indexer ekstraherer rike audio-innsikter:

| Innsikt | Beskriving |
|---------|-----------|
| **Audio Effects** | Latter, folkemengd-reaksjonar, alarmar, sirener |
| **Keywords** | Viktige nøkkelord frå transkripsjon |
| **Named Entities** | Stadnamn, personnamn, merkevarar |
| **Emotions** | Sinne, frykt, glede, tristheit per tekstsegment |
| **Topics** | Emne-inferering frå transkripsjon og OCR |
| **Speakers** | Talar-identifisering og -diarisering |

---

## Norsk offentleg sektor

### Bruksscenario

- **Direktoratet for digital tjenesteutvikling**: Trafikkvideoanalyse for hendingsdeteksjon og trafikkflyt
- **Stortinget**: Søkbar indeksering av høyringar og debattar
- **NRK**: Automatisk underteksting og innhaldsklassifisering
- **Kommunar**: Analyse av bystyremøte med talar-identifisering

### Personvern og etikk

| Aspekt | Tiltak |
|--------|--------|
| **Ansiktsgjenkjenning** | Krev samtykke eller lovheimel i Noreg |
| **Overvaking** | Regulert av personopplysningslova og arbeidsmiljølova |
| **Lagring** | Video-innsikter lagra i EU med GDPR-etterleving |
| **Transparens** | Informer om automatisert videoanalyse |
| **Dataminimering** | Bruk berre nødvendige innsiktstypar |

### Real-time analyse ved kanten

For bruksscenario som krev sanntidsanalyse utan skyavhengigheit:

- **Azure AI Video Indexer on Arc** — Deploy på Azure Local eller Kubernetes
- **Custom OV Insights** — Eigendefinerte objektdeteksjonar utan koding
- **Persondeteksjon** — Bounding boxes utan ansiktsidentifisering
- **Oppsummering** — Automatisk oppsummering av 6-timars segment

---

## Beslutningsrammeverk

| Scenario | Anbefaling | Begrunnelse |
|----------|------------|-------------|
| Søkbar videoarkivering | Video Indexer Standard preset | Transkripsjon + nøkkelord + scener |
| Detaljert innhaldsanalyse | Video Indexer Advanced + GPT-4o | Full analyse + semantisk forståing |
| Sanntids trafikkmonitorering | Video Indexer on Arc | Edge-basert, låg latency |
| Videotilgjengelegheit | Video Indexer + Azure Speech TTS | Undertekstar + lydbeskrivingar |
| Enkel persondeteksjon | Azure AI Vision Spatial Analysis | Lågare kostnad for basisk analyse |
| Narrativ videoforståing | Keyframe sampling + GPT-4o | Temporal kontekst + semantikk |

---

## For Cosmo

- **Azure AI Video Indexer** gir 30+ innsiktstypar i ein enkelt API — bruk Standard preset for dei fleste bruksscenario, Advanced for full analyse med kledningsdeteksjon og audioeffektar
- **Scene → Shot → Keyframe-hierarkiet** er fundamentalt for temporal forståing — scener er semantiske einingar, shots er kamera-einingar, keyframes er representative stillbilete
- **GPT-4o keyframe analysis** utfyller Video Indexer for djupare semantisk forståing — send 5-10 keyframes med kontekst for narrativ analyse av videoinnhald
- **Real-time Video Indexer on Arc** (preview) mogleggjer edge-basert sanntidsanalyse — relevant for trafikkmonitorering og smart byinfrastruktur i norsk offentleg sektor
- **Audio insights** (emosjonar, nøkkelord, talarar) kombinert med visuelle innsikter gir heilskapleg videoforståing — bruk dette for søkbar arkivering av offentlege høyringar og møte
