# Sworn – Videodokumentation

## Gelieferte Fassung

- Datei: `artifacts/video.mp4`, MP4, H.264 High, YUV 4:2:0, 1920 × 1080, konstant 30 fps.
- Laufzeit: 149 Sekunden; 4.470 vollständig dekodierte Videoframes.
- Audio: AAC-LC, Stereo, 48 kHz. Absichtlich digitale Stille: keine Narration, keine Musik, keine Geräusche. Peak und RMS wurden als `-inf` bestätigt.
- Browserwiedergabe: H.264/AAC und vorangestelltes `moov`-Atom (`+faststart`).
- Videogröße: 7,653,921 Bytes (7.30 MiB).
- Poster: PNG, 1920 × 1080, unverändertes dekodiertes Videoframe 2460 bei 82 Sekunden. Ein zweiter RGB-Export war pixelgleich.
- Bildschirmmanuskript: `artifacts/script.md`; jede sichtbare Zeile mit dem zugehörigen Satz der Aufgabenquelle. Es gibt keine gesprochenen Sätze.

## Gestaltung und Inhalt

Ruhige typografische Erklärung in Deutsch mit abstrakten Linien, Knoten und proportionalen Balken. Die Kennzahlen springen nicht durch Zwischenwerte. Alle Filterzeilen bleiben während der gesamten Tabelle sichtbar. Die Balken in der Wallets-Spalte teilen dieselbe lineare Skala; Prozentbalken zeigen jeweils den ausdrücklich daneben genannten Anteil. Dekorative Knoten bilden keine gemessenen Populationen ab.

Die Inhalte und Messwerte stammen vollständig aus dem Auftrag, Stand 2026-10-26. Es wurden keine neuen Daten abgefragt oder ergänzt. Kontextaussagen wurden ins Deutsche übersetzt; Fachnamen und die vorgegebenen Tabellenbezeichnungen bleiben erhalten. Keine Screenshots, fremden Logos, echten oder nachgeahmten Karten, Archivbilder oder generativ erzeugten Bildinhalte.

## Einschränkungen

Der Auftrag schreibt im Quellsatz „Nonce 0“, lässt die einzelne Ziffer 0 aber in seiner abschließenden Liste erlaubter Bildschirmzahlen aus. Im Film steht deshalb „Nonce null“. Dies ist die einzige bewusste Abweichung vom Wortlaut des deutschen Fließtexts; die Aussage bleibt dieselbe. Im Manuskript steht direkt darunter der unveränderte Quellsatz.

Die Fassung hat keine Sprecherstimme. Sämtliche Informationen sind ohne Ton verständlich; Untertitel als separate Spur sind nicht enthalten, weil der Text Teil des Bildes ist. Die gelieferten Fakten wurden nicht unabhängig auf der Blockchain überprüft.

## Werkzeuge und Reproduktion

- Python 3.12 und Pillow 11.3.0: Satz, Vektorelemente, Animation und RGB-Bildsequenz.
- ffmpeg version 7.0.2 Copyright (c) 2000-2024 the FFmpeg developers
- ffprobe version 7.0.2 Copyright (c) 2007-2024 the FFmpeg developers
- Das ursprüngliche Rendering erfolgte mit FFmpeg 7.0.2-static; die erneuten Datei- und Dekodierprüfungen verwenden die kompakte mitgelieferte Fassung derselben FFmpeg-Version. Der MP4-Bildinhalt wurde bei der Verkleinerung des Quellpakets nicht geändert.
- FFmpeg: `libx264`, CRF 19, Preset medium, YUV420p, 30 fps; AAC-Stereospur, `+faststart`.
- Schriften: IBM Plex Sans und Instrument Serif, mitgelieferte SIL-OFL-Lizenzen in `tools/fonts/`.
- Die benötigten Laufzeitdateien sind als normale Dateien in `tools/vendor/` und `tools/fonts/` enthalten. Die kompakten Archive enthalten Pillow mit den benötigten Bild-/Schriftbibliotheken sowie eigens für diesen Film gebautes FFmpeg/ffprobe. Herkunft, Umfang und Prüfsummen stehen in `tools/vendor/`. Keine Netzwerkverbindung zur Reproduktion erforderlich. Zielplattform: Linux x86_64, CPython 3.12 mit den üblichen Systembibliotheken (glibc und zlib).

Vom Repository-Hauptverzeichnis:

```sh
python3 src/render.py
python3 tools/check.py
```

Die Werkzeugarchive werden bei Bedarf nach `test/scratch/` entpackt. Dieser Ordner darf vor dem Build vollständig gelöscht werden. Das Rendern erstellt Video und Manuskript; die Prüfung kann auch direkt auf dem gelieferten Video ausgeführt werden, extrahiert das Poster und aktualisiert diese Dokumentation. Für Standbildvorschauen: `python3 src/render.py --previews`.

## Ausgeführte Prüfungen

- Vollständige Dekodierung des Video- und Audiostreams mit `ffmpeg -v error -xerror`: ohne Fehlermeldung, Exit-Code 0.
- Codec, Auflösung, konstante Bildrate, Bildzahl, Laufzeit, Audioprofil und Atomreihenfolge geprüft.
- Tatsächliches Posterframe pixelweise mit einer zweiten Dekodierung verglichen.
- Stille der gesamten AAC-Spur mit `astats` bestätigt.
- Alle Bildschirmzeilen auf erlaubte Ziffernfolgen und vorhandene Quellenzuordnung geprüft; vier Tabellenzeilen und vollständige Schlussaussage zur Cluster-Erkennung geprüft.
- Die unveränderte Renderpipeline wurde zusätzlich mit einem kurzen Testclip und frisch entpackter kompakter Laufzeit geprüft: H.264/AAC, Full HD und 30 fps erfolgreich.
- Gestaltung aller Einstellungen anhand von Vorschauen und dekodierten Videoframes visuell geprüft.

## ffprobe-Zusammenfassung

Aufruf mit dem mitgelieferten `ffprobe`:

```sh
ffprobe -v error -count_frames -show_entries format=format_name,duration,size,bit_rate:stream=index,codec_name,codec_type,profile,width,height,pix_fmt,r_frame_rate,avg_frame_rate,duration,nb_frames,nb_read_frames,sample_rate,channels,channel_layout:stream_tags=language -of json artifacts/video.mp4
```

```json
{
  "programs": [],
  "stream_groups": [],
  "streams": [
    {
      "index": 0,
      "codec_name": "h264",
      "profile": "100",
      "codec_type": "video",
      "width": 1920,
      "height": 1080,
      "pix_fmt": "yuv420p",
      "r_frame_rate": "30/1",
      "avg_frame_rate": "30/1",
      "duration": "149.000000",
      "nb_frames": "4470",
      "nb_read_frames": "4470",
      "tags": {
        "language": "deu"
      }
    },
    {
      "index": 1,
      "codec_name": "aac",
      "profile": "1",
      "codec_type": "audio",
      "sample_rate": "48000",
      "channels": 2,
      "channel_layout": "stereo",
      "r_frame_rate": "0/0",
      "avg_frame_rate": "0/0",
      "duration": "149.000000",
      "nb_frames": "6986",
      "nb_read_frames": "6985",
      "tags": {
        "language": "deu"
      }
    }
  ],
  "format": {
    "format_name": "mov,mp4,m4a,3gp,3g2,mj2",
    "duration": "149.000000",
    "size": "7653921",
    "bit_rate": "410948"
  }
}
```
