Alle Formatseiten ↓
Grafik und Medien

Bink – Zwischensequenz-Video von TA: Kingdoms

Aus coreprime/kbot @ 0ab97bf · Auf GitHub bearbeiten

Total Annihilation: Kingdoms hat die Smacker-Zwischensequenzen (.zrb) des ursprünglichen Spiels durch den neueren Codec Bink von RAD Game Tools ersetzt, gespeichert als .bik. Die Missionsintros, die Briefings der Fraktionen und die Abspänne werden alle als Bink-1-Dateien unter movies/ ausgeliefert.

Endung Verwendet von Anmerkungen
.bik movies/*.bik von TA: Kingdoms RAD Bink 1. Signatur BIK + ein Revisionsbyte (BIKf in TA:K).

Bink ist nicht Smacker – es ist ein eigener, späterer Codec mit eigenem DCT-basiertem Video-Bitstrom und eigenem Audio (Bink Audio, DCT oder RDFT). kbot parst den Header des Containers selbst, überlässt das Dekodieren der Pixel aber FFmpeg, das einen Bink-1-Decoder mitbringt (binkvideo, binkaudio_dct/binkaudio_rdft).

Tip

Probier es selbst.

kbot bik info   movies/takmission14_ph.bik          # header summary
kbot bik to-mp4 movies/takmission14_ph.bik out.mp4  # decode to MP4 (requires ffmpeg)

Aus Go heraus. Verwende formats/bik:

import "github.com/coreprime/kbot/formats/bik"

r, _ := bik.OpenReader("movies/takmission14_ph.bik")
defer r.Close()
fmt.Println(r.Width(), r.Height(), r.FrameCount(), r.FrameRate())
_ = bik.ConvertToMP4("movies/takmission14_ph.bik", "out.mp4")

Was du in einer Installation von TA: Kingdoms findest

$ ls $(kbot ctx path)/movies/*.bik
takmission01_ph.bik  takmission14_ph.bik  takx21_dh.bik  …
$ ls $(kbot ctx path)/movies/gui/*.bik
snort4.bik  snort6.bik  …          # tiny UI stingers, often a few KB

Eine typische Missions-Zwischensequenz hat 640 × 350 bei 15 fps und eine einzige Stereo-Audiospur mit 16 Bit (~22 kHz). Die Clips in movies/gui/ sind viel kleiner und haben manchmal ungerade Maße (z. B. 124 × 101) – siehe die Stolperfalle unten.


Aufbau des Headers (Bink 1)

Alle Felder sind Little-Endian. kbot liest bis einschließlich der Tabellen der Audiospuren; den Index pro Frame und den komprimierten Bitstrom überlässt es FFmpeg.

typedef struct {
    char   Signature[4];   // 'B','I','K', revision  (revision 'f' in TA:K)
    uint32 FileSize;       // total file size minus 8
    uint32 Frames;         // video frame count
    uint32 LargestFrame;   // size in bytes of the biggest frame
    uint32 FramesCopy;     // duplicate frame count (ignored)
    uint32 Width;
    uint32 Height;
    uint32 FPSNum;         // frame rate numerator
    uint32 FPSDen;         // frame rate denominator
    uint32 VideoFlags;     // bit 0x00100000 = alpha plane, 0x00020000 = grayscale
    uint32 NumAudioTracks;
    // if NumAudioTracks > 0:
    uint32 AudioMaxSize[NumAudioTracks];   // per-track max packet (ignored)
    struct { uint16 SampleRate; uint16 Flags; } AudioInfo[NumAudioTracks];
    uint32 AudioTrackID[NumAudioTracks];
    // followed by:
    uint32 FrameOffsets[Frames + 1];       // LSB of each offset is the keyframe flag
} BinkHeader;

Bildrate

fps = FPSNum / FPSDen. Die Zwischensequenzen von TA:K verwenden 15 / 1. Weil es ein Paar aus Zähler und Nenner ist, kann der Wert gebrochen sein, daher hält kbot ihn als Gleitkommazahl.

Audio-Flags (das 16-Bit-Wort Flags)

Bit Bedeutung
0x4000 16-Bit-Samples (sonst 8 Bit)
0x2000 Stereo (sonst Mono)
0x1000 DCT-Codec (sonst RDFT)

Note

SampleRate ist der wörtlich gespeicherte Wert – TA:K liefert 22254 Hz aus, kein rundes 22050. kbot gibt ihn unverändert aus.


Konvertieren geht nur beim Dekodieren

kbot bik to-mp4 ruft FFmpeg auf:

ffmpeg -i in.bik \
       -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2" \
       -c:v libx264 -preset fast -crf 18 \
       -c:a aac -b:a 192k \
       -y out.mp4

Ein from-mp4 gibt es nicht: Es existiert kein quelloffener Bink-Encoder, und nur die proprietären Werkzeuge von RAD erzeugen .bik-Dateien. Für Smacker gilt in der Praxis dasselbe – auch das Standard-FFmpeg hat weder einen Smacker-Encoder noch einen Muxer (siehe Smacker/ZRB).

Warning

Ungerade Maße. Mehrere Clips movies/gui/*.bik haben Maße, die nicht durch 2 teilbar sind (z. B. 124 × 101). H.264 mit yuv420p verlangt gerade Breite und Höhe, daher füllt der Konverter mit einem pad-Filter auf die nächste gerade Größe auf, statt neu zu skalieren – es werden keine Pixel neu abgetastet, stattdessen kommt am Rand eine schwarze Zeile bzw. Spalte hinzu.


Stolperfallen

  • Bink ist nicht Smacker. Richte kbot zrb nicht auf eine .bik (und kbot bik nicht auf eine .zrb); Signaturen und Codecs unterscheiden sich vollständig.
  • Bink 2 (KB2) wird nicht unterstützt. TA:K ist älter als Bink 2, jede ausgelieferte Datei ist also Bink 1 (BIK*). kbot weist KB2* mit einer klaren Fehlermeldung ab.
  • Verschlüsselte Clips von Boneyards. Eine Handvoll Dateien unter boneyards/metagame/*.bik (z. B. ftuimovie2.bik) tragen die Endung .bik, sind aber keine Bink-Container – es sind verwürfelte bzw. verschleierte Nutzdaten für die Oberfläche des Online-Metaspiels. kbot weist sie als ungültig ab, statt zu raten.

Siehe auch

  • Smacker / ZRB – das Format der Zwischensequenzen des ursprünglichen TA, das Bink abgelöst hat.
  • HPI – das Hüllarchiv, in dem diese Dateien ausgeliefert werden.