Todas las páginas de formatos ↓
Gráficos y multimedia

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

Extensión Lo usa Notas
.bik movies/*.bik de TA: Kingdoms RAD Bink 1. Firma BIK + un byte de revisión (BIKf en 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 zrb con un .bik (ni kbot bik con 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 rechaza KB2* con un error claro.
  • Cortinillas cifradas de Boneyards. Unos cuantos archivos de boneyards/metagame/*.bik (p. ej., ftuimovie2.bik) tienen la extensión .bik pero 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.