Bink — vidéo des cinématiques de TA: Kingdoms
Source : coreprime/kbot @ 0ab97bf · Modifier sur GitHub
Total Annihilation: Kingdoms a remplacé les cinématiques Smacker (
.zrb) du jeu original par le codec Bink, plus récent, de RAD Game Tools, stocké en.bik. Les introductions de missions, les briefings des factions et les cinématiques de fin sont tous livrés sous forme de fichiers Bink 1 dansmovies/.
Extension Utilisée par Remarques .bikmovies/*.bikde TA: KingdomsRAD Bink 1. Signature BIK+ un octet de révision (BIKfdans TA:K).Le Bink n'est pas du Smacker : c'est un codec distinct, plus tardif, avec son propre flux vidéo à base de DCT et son propre audio (Bink Audio, DCT ou RDFT). kbot analyse nativement l'en-tête du conteneur, mais confie le décodage des pixels à FFmpeg, qui dispose d'un décodeur Bink 1 (
binkvideo,binkaudio_dct/binkaudio_rdft).
Tip
Essayez vous-même.
kbot bik info movies/takmission14_ph.bik # header summary
kbot bik to-mp4 movies/takmission14_ph.bik out.mp4 # decode to MP4 (requires ffmpeg)
Depuis Go. Utilisez 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")
Ce que l'on trouve dans une installation de 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
Une cinématique de mission typique est en 640 × 350 à 15 i/s, avec une
seule piste audio stéréo 16 bits (~22 kHz). Les clips de movies/gui/ sont
beaucoup plus petits et ont parfois des dimensions impaires (par ex.
124 × 101) — voir le piège plus bas.
Disposition de l'en-tête (Bink 1)
Tous les champs sont en little-endian. kbot lit tout jusqu'aux tables des pistes audio incluses ; l'index par image et le flux compressé sont laissés à 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;
Cadence
fps = FPSNum / FPSDen. Les cinématiques de TA:K utilisent 15 / 1. Comme
il s'agit d'une paire rationnelle, la valeur peut être fractionnaire : kbot
la conserve donc sous forme de nombre à virgule flottante.
Flags audio (le mot Flags de 16 bits)
| Bit | Signification |
|---|---|
0x4000 |
échantillons 16 bits (sinon 8 bits) |
0x2000 |
stéréo (sinon mono) |
0x1000 |
codec DCT (sinon RDFT) |
Note
SampleRate est la valeur littérale stockée : TA:K livre du 22254 Hz, et
non un 22050 rond. kbot l'affiche telle quelle.
La conversion ne fait que décoder
kbot bik to-mp4 appelle 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
Il n'y a pas de from-mp4 : il n'existe aucun encodeur Bink open
source, et seuls les outils propriétaires de RAD produisent des fichiers
.bik. Il en va de même, en pratique, pour le Smacker : FFmpeg standard n'a
pas non plus d'encodeur ni de multiplexeur Smacker (voir
Smacker/ZRB).
Warning
Dimensions impaires. Plusieurs clips movies/gui/*.bik ont des
dimensions qui ne sont pas divisibles par 2 (par ex. 124 × 101). Le H.264
en yuv420p exige une largeur et une hauteur paires : le convertisseur
complète donc jusqu'à la taille paire suivante avec un filtre pad au lieu
de redimensionner — aucun pixel n'est rééchantillonné, une ligne ou une
colonne noire est ajoutée en bordure.
Pièges
- Le Bink n'est pas du Smacker. Ne donnez pas un
.bikàkbot zrb(ni un.zrbàkbot bik) ; les signatures et les codecs n'ont rien à voir. - Le Bink 2 (
KB2) n'est pas pris en charge. TA:K est antérieur au Bink 2 : chaque fichier livré est donc du Bink 1 (BIK*). kbot rejette lesKB2*avec une erreur claire. - Jingles chiffrés de Boneyards. Une poignée de fichiers de
boneyards/metagame/*.bik(par ex.ftuimovie2.bik) portent l'extension.bikmais ne sont pas des conteneurs Bink : ce sont des charges utiles brouillées ou obscurcies destinées à l'interface du métajeu en ligne. kbot les rejette comme invalides plutôt que de deviner.
Voir aussi
- Smacker / ZRB — le format des cinématiques du TA original, que Bink a remplacé.
- HPI — l'archive enveloppe qui livre ces fichiers.