Bink: vídeo de las cinemáticas de TA: Kingdoms
Fuente: coreprime/kbot @ 0ab97bf · Editar en GitHub
Total Annihilation: Kingdoms sustituyó las cinemáticas Smacker (
.zrb) del juego original por el códec Bink, más moderno, de RAD Game Tools, guardado como.bik. Las introducciones de las misiones, las instrucciones de cada facción y las cinemáticas finales se distribuyen todas como archivos Bink 1 enmovies/.
Extensión Lo usa Notas .bikmovies/*.bikde TA: KingdomsRAD Bink 1. Firma BIK+ un byte de revisión (BIKfen TA:K).Bink no es Smacker: es un códec distinto y posterior, con su propio flujo de bits de vídeo basado en DCT y su propio audio (Bink Audio, DCT o RDFT). kbot analiza la cabecera del contenedor por sí mismo, pero delega la decodificación de los píxeles en FFmpeg, que incluye un decodificador de Bink 1 (
binkvideo,binkaudio_dct/binkaudio_rdft).
Tip
Pruébalo tú mismo.
kbot bik info movies/takmission14_ph.bik # header summary
kbot bik to-mp4 movies/takmission14_ph.bik out.mp4 # decode to MP4 (requires ffmpeg)
Desde 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")
Qué encontrarás en una instalación 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
Una cinemática de misión típica es de 640 × 350 a 15 fps, con una
sola pista de audio estéreo de 16 bits (~22 kHz). Los clips de
movies/gui/ son mucho más pequeños y a veces tienen dimensiones
impares (p. ej., 124 × 101): consulta el escollo de más abajo.
Disposición de la cabecera (Bink 1)
Todos los campos son little-endian. kbot lee hasta las tablas de pistas de audio, incluidas; el índice por fotograma y el flujo de bits comprimido se dejan 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;
Frecuencia de fotogramas
fps = FPSNum / FPSDen. Las cinemáticas de TA:K usan 15 / 1. Como es
una pareja racional, el valor puede ser fraccionario, así que kbot lo
guarda como número de coma flotante.
Marcas de audio (la palabra Flags de 16 bits)
| Bit | Significado |
|---|---|
0x4000 |
muestras de 16 bits (si no, de 8 bits) |
0x2000 |
estéreo (si no, mono) |
0x1000 |
códec DCT (si no, RDFT) |
Note
SampleRate es el valor guardado tal cual: TA:K usa 22254 Hz, no un
redondo 22050. kbot lo muestra literalmente.
La conversión es solo de decodificación
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
No hay from-mp4: no existe ningún codificador de Bink de código
abierto, y solo las herramientas propietarias de RAD producen archivos
.bik. En la práctica, lo mismo ocurre con Smacker: FFmpeg de serie
tampoco tiene codificador ni multiplexor de Smacker (consulta
Smacker/ZRB).
Warning
Dimensiones impares. Varios clips movies/gui/*.bik tienen
dimensiones que no son divisibles por 2 (p. ej., 124 × 101). H.264 con
yuv420p exige un ancho y un alto pares, así que el conversor rellena
hasta el siguiente tamaño par con un filtro pad en lugar de
reescalar: no se remuestrea ningún píxel, sino que se añade una fila o
columna negra en el borde.
Escollos
- Bink no es Smacker. No uses
kbot zrbcon un.bik(nikbot bikcon un.zrb); las firmas y los códecs son totalmente distintos. - Bink 2 (
KB2) no está soportado. TA:K es anterior a Bink 2, así que todos los archivos distribuidos son Bink 1 (BIK*). kbot rechazaKB2*con un error claro. - Cortinillas cifradas de Boneyards. Unos cuantos archivos de
boneyards/metagame/*.bik(p. ej.,ftuimovie2.bik) tienen la extensión.bikpero no son contenedores Bink: son datos desordenados u ofuscados para la interfaz del metajuego en línea. kbot los rechaza como no válidos en lugar de intentar adivinar.
Véase también
- Smacker / ZRB: el formato de cinemáticas del TA original al que sustituyó Bink.
- HPI: el archivo comprimido envoltorio en el que se distribuyen estos archivos.