Tutte le pagine dei formati ↓
Grafica e media

Bink — Filmati di TA: Kingdoms

Fonte: coreprime/kbot @ 0ab97bf · Modifica su GitHub

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 sotto movies/.

Estensione Usata da Note
.bik movies/*.bik di TA: Kingdoms RAD Bink 1. Firma BIK + un byte di revisione (BIKf in 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 zrb un .bik (né a kbot bik uno .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 i KB2* con un errore chiaro.
  • Brevi clip cifrate di Boneyards. Una manciata di file sotto boneyards/metagame/*.bik (ad es. ftuimovie2.bik) ha l'estensione .bik ma 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.