Bink — Filmati di TA: Kingdoms
Total Annihilation: Kingdoms ha sostituito i filmati Smacker (
.zrb) del gioco originale con il codec più recente di RAD Game Tools, Bink, memorizzato come.bik. Le introduzioni delle missioni, i briefing delle fazioni e i filmati finali sono tutti distribuiti come file Bink 1 sottomovies/.
Estensione Usata da Note .bikmovies/*.bikdi TA: KingdomsRAD Bink 1. Firma BIK+ un byte di revisione (BIKfin TA:K).Bink non è Smacker: è un codec separato e successivo, con un proprio flusso video basato sulla DCT e un proprio audio (Bink Audio, DCT o RDFT). kbot analizza nativamente l'intestazione del contenitore, ma affida la decodifica dei pixel a FFmpeg, che include un decodificatore Bink 1 (
binkvideo,binkaudio_dct/binkaudio_rdft).
Tip
Provalo tu stesso.
kbot bik info movies/takmission14_ph.bik # header summary
kbot bik to-mp4 movies/takmission14_ph.bik out.mp4 # decode to MP4 (requires ffmpeg)
Da Go. Usa 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")
Che cosa trovi in un'installazione di TA: Kingdoms
$ 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
Un tipico filmato di missione è di 640 × 350 a 15 fps, con una sola
traccia audio stereo a 16 bit (~22 kHz). Le clip di movies/gui/ sono molto
più piccole e a volte hanno dimensioni dispari (ad es. 124 × 101): vedi
l'insidia più sotto.
Struttura dell'intestazione (Bink 1)
Tutti i campi sono little-endian. kbot legge fino alle tabelle delle tracce audio comprese; l'indice per frame e il flusso di bit compresso sono lasciati a 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;
Frequenza dei frame
fps = FPSNum / FPSDen. I filmati di TA:K usano 15 / 1. Trattandosi di una
coppia razionale il valore può essere frazionario, quindi kbot lo conserva
come float.
Flag audio (la parola Flags a 16 bit)
| Bit | Significato |
|---|---|
0x4000 |
campioni a 16 bit (altrimenti a 8 bit) |
0x2000 |
stereo (altrimenti mono) |
0x1000 |
codec DCT (altrimenti RDFT) |
Note
SampleRate è il valore memorizzato così com'è: TA:K distribuisce
22254 Hz, non un tondo 22050. kbot lo riporta tale e quale.
La conversione è solo in decodifica
kbot bik to-mp4 invoca FFmpeg:
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
Non esiste un from-mp4: non esiste alcun codificatore Bink open
source, e solo gli strumenti proprietari di RAD producono file .bik. In
pratica vale lo stesso per Smacker: anche FFmpeg standard non ha un
codificatore né un muxer Smacker (vedi Smacker/ZRB).
Warning
Dimensioni dispari. Diverse clip movies/gui/*.bik hanno dimensioni
non divisibili per 2 (ad es. 124 × 101). H.264 con yuv420p richiede
larghezza e altezza pari, quindi il convertitore riempie fino alla
dimensione pari successiva con un filtro pad invece di ridimensionare:
nessun pixel viene ricampionato, viene invece aggiunta una riga o una
colonna nera sul bordo.
Insidie
- Bink non è Smacker. Non dare a
kbot zrbun.bik(né akbot bikuno.zrb); firme e codec sono del tutto diversi. - Bink 2 (
KB2) non è supportato. TA:K è precedente a Bink 2, quindi ogni file distribuito è Bink 1 (BIK*). kbot rifiuta iKB2*con un errore chiaro. - Brevi clip cifrate di Boneyards. Una manciata di file sotto
boneyards/metagame/*.bik(ad es.ftuimovie2.bik) ha l'estensione.bikma non sono contenitori Bink: sono payload rimescolati/offuscati per l'interfaccia del metagioco online. kbot li rifiuta come non validi invece di tirare a indovinare.
Vedi anche
- Smacker / ZRB: il formato dei filmati del TA originale che Bink ha sostituito.
- HPI: l'archivio contenitore con cui vengono distribuiti questi file.