Bink – Zwischensequenz-Video von TA: Kingdoms
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 untermovies/ausgeliefert.
Endung Verwendet von Anmerkungen .bikmovies/*.bikvon TA: KingdomsRAD Bink 1. Signatur BIK+ ein Revisionsbyte (BIKfin 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 zrbnicht auf eine.bik(undkbot biknicht 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 weistKB2*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.