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

Smacker / ZRB: vídeo de las cinemáticas

Fuente: coreprime/kbot @ 0ab97bf · Editar en GitHub

La introducción, las instrucciones de las misiones y las cinemáticas finales de Total Annihilation son vídeos Smacker de RAD Game Tools. Se guardan con dos extensiones distintas:

Extensión Lo usa Notas
.smk Las herramientas genéricas de Smacker Formato estándar de RAD.
.zrb Los datos data/*.zrb de TA Cavedog cambió la extensión de los archivos Smacker a .zrb para disuadir de la extracción casual. El contenido binario es idéntico byte a byte.

FFmpeg decodifica Smacker de forma nativa, y kbot lo usa como motor de conversión de Smacker → MP4. Nada convierte en el otro sentido: FFmpeg de serie no tiene codificador ni multiplexor de Smacker, y kbot no tiene escritor de Smacker. Las películas SMK2 para TA se hacen con las herramientas Smacker de RAD Game Tools.

Tip

Pruébalo tú mismo.

kbot zrb info     data/1.zrb               # header summary
kbot zrb to-mp4   data/1.zrb intro.mp4     # decode to a 640x480 MP4 (requires ffmpeg)
kbot zrb from-mp4 intro.mp4 out.zrb        # reports that no Smacker encoder exists

Desde Go. Usa formats/smacker:

import "github.com/coreprime/kbot/formats/smacker"

r, _ := smacker.OpenReader("data/1.zrb")
defer r.Close()
fmt.Println(r.Width(), r.Height(), r.FrameCount(), r.FrameRate())
_ = smacker.ConvertToMP4("data/1.zrb", "intro.mp4")

Qué encontrarás en una instalación de TA

$ ls $(kbot ctx path)/data/*.zrb
1.zrb  2.zrb  3.zrb  4.zrb  5.zrb

Cada archivo numerado es una cinemática: la secuencia de introducción original «Arm contra Core», las instrucciones de las misiones, etc. Los fotogramas se guardan a 640 × 240 con la marca de entrelazado activada, así que el juego los muestra a 640 × 480 con una de cada dos líneas en negro, a 30 fps. kbot zrb to-mp4, la herramienta MCP zrb_to_mp4 y el reproductor de vídeo del studio (y sus miniaturas) los muestran de la misma manera.


Cabecera (104 bytes como mínimo)

La cabecera de Smacker lleva una firma, la geometría, los recuentos de fotogramas, la configuración de audio y los tamaños de las tablas de punteros. Leerla es sencillo, pero el cuerpo se decodifica con árboles de Huffman a nivel de bit, y por eso kbot renuncia a decodificar el cuerpo y usa FFmpeg.

typedef struct {
    uint32 Signature;        // 'SMK2' = 0x324B4D53 or 'SMK4' = 0x344B4D53
    uint32 Width;
    uint32 Height;
    uint32 Frames;
    int32  FrameRate;        // See below — sign-encoded
    uint32 Flags;
    uint32 AudioSize[7];
    uint32 TreesSize;        // Huffman tree section length
    uint32 MMapSize;
    uint32 MClrSize;
    uint32 FullSize;
    uint32 TypeSize;
    uint32 AudioRate[7];     // packed: rate in bits 0-23, flags in bits 24-31
    uint32 dummy;            // 4-byte reserved; the header ends here (104 bytes)
    // …followed by one entry per frame, plus one for the ring frame
    // when Flags bit 0 is set:
    uint32 FrameSizes[Frames (+1)];
    uint8  FrameTypes[Frames (+1)];
    uint8  HuffmanTrees[TreesSize];
} SmackerHeader;

Bits de Flags: 0x01, fotograma de anillo (un fotograma extra después del último, para el bucle); 0x02, entrelazado (se muestra al doble de altura con una de cada dos líneas en negro); 0x04, duplicado (se muestra al doble de altura con cada línea repetida). Con 0x02 y 0x04 activados a la vez, la película se muestra a su altura guardada.

Decodificar la frecuencia de fotogramas

El signo de FrameRate elige entre dos codificaciones:

Valor Significado
> 0 Milisegundos por fotograma: fps = 1000 / FrameRate.
< 0 Cienmilésimas de segundo por fotograma: fps = 100_000 / abs(FrameRate).
0 Sin temporización definida: kbot usa 15 fps.

Para 30 fps, lo normal es ver -3333 (≈ -100000/30).

Variantes de la firma

  • SMK2: el formato Smacker original. Casi todas las cinemáticas de Cavedog lo usan.
  • SMK4: formato ampliado con mejor compresión, de herramientas más recientes de RAD. TA 3.1c solo reproduce SMK2.

kbot lee los dos (y avisa cuando un archivo es SMK4); FFmpeg decodifica los dos.

Pistas de audio

Hasta 7 pistas de audio. Cada palabra AudioRate[i] empaqueta la frecuencia de muestreo (bits 0–23) y las marcas de la pista (bits 24–31): 0x80 comprimida, 0x40 presente, 0x20 de 16 bits (si no, de 8 bits), 0x10 estéreo (si no, mono). El juego solo usa una pista cuando su bit de presencia está activado, sea cual sea su frecuencia. No hay ninguna tabla de marcas aparte: las siete palabras que siguen a la cabecera son la tabla de tamaños de fotograma.

Note

Los archivos ZRB de Cavedog tienen una sola pista, en la posición 0: la palabra 0xD0005622, es decir, presente, 22 050 Hz, estéreo, 8 bits, comprimida. Las otras seis posiciones están a cero. kbot zrb info y la herramienta MCP zrb_info solo enumeran las pistas presentes.


El mito de los «datos cifrados»

Muchos modders creen que los archivos .zrb son una variante cifrada de Smacker. No lo son. Si cambias el nombre de 1.zrb a 1.smk, se pueden reproducir con cualquier herramienta que entienda Smacker (las herramientas Bink/Smacker de RAD, FFmpeg, VLC). La única ofuscación de Cavedog fue la propia extensión.

# Equivalent — try both
ffplay data/1.zrb
cp data/1.zrb /tmp/intro.smk && ffplay /tmp/intro.smk

Procesos de conversión

kbot zrb to-mp4 lee la cabecera y después hace que FFmpeg decodifique la película a H.264 (CRF 18) y AAC tal como la muestra el juego: a la altura de visualización (una película entrelazada de 640×240 pasa a 640×480 con una de cada dos líneas en negro), con píxeles cuadrados, y deteniéndose en el número de fotogramas de la cabecera (el fotograma de anillo no se muestra).

Opción Efecto
--line-double Rellena las líneas extra de una película entrelazada repitiendo cada línea guardada en lugar de con negro.
--stored-height Mantiene la altura de fotograma guardada (640×240).

El reproductor de vídeo del studio usa la misma conversión, y sus miniaturas conservan la forma de visualización 4:3 (128×96, con las líneas duplicadas).

Important

No hay ninguna vía MP4 → Smacker. FFmpeg de serie no tiene codificador de Smacker (smackvid / smackaud) ni multiplexor, y kbot no tiene escritor de Smacker. kbot zrb from-mp4 y la herramienta MCP zrb_from_mp4 dicen exactamente eso (y solo intentan usar FFmpeg cuando enumera tanto un codificador smackvid como un multiplexor smk). Haz las películas SMK2 para TA con las herramientas Smacker de RAD Game Tools.


Tamaños habituales

Recurso Resolución Fotogramas Duración Tamaño del archivo
Cinemática de introducción (data/1.zrb) 640 × 240 (se muestra a 640 × 480) 599 ~20 s ~7 MB
Otras cinemáticas (data/2.zrb–5.zrb) 640 × 240 (se muestra a 640 × 480) — — 10–41 MB

Escollos

Warning

AudioRate es una palabra empaquetada, no una frecuencia. Leída como un número normal, la palabra 0xD0005622 de la versión comercial da 3 489 682 978 «Hz». Aplica una máscara a los 24 bits bajos para obtener la frecuencia y comprueba el bit 0x40000000 para saber si la pista está presente. Las herramientas que leen siete palabras más de «flags» después de la cabecera están leyendo la tabla de tamaños de fotograma.

  • Smacker no es Bink. RAD sacó primero Smacker y después Bink como su sucesor. TA solo usa Smacker; TA: Kingdoms se pasó a Bink. No cargues archivos .bik con kbot zrb: usa kbot bik en su lugar.
  • Los árboles de Huffman de SMK4 no son compatibles con los decodificadores de SMK2. FFmpeg maneja los dos, pero puede que las bibliotecas de terceros más antiguas no.
  • Las cinemáticas distribuidas guardan -3333 (100 000 / 3333 ≈ 30,003 fps).
  • La altura guardada no es la altura mostrada. Comprueba las marcas de entrelazado y de duplicado; si reproduces las películas de la versión comercial a 640×240, quedan aplastadas a la mitad de altura.
  • Cambiar la extensión .zrb ↔ .smk no hace ningún daño, pero el juego espera .zrb en el directorio data/. No le pases al motor archivos con extensión .smk.

Véase también

  • Bink: el códec sucesor que usa TA: Kingdoms en lugar de Smacker.
  • HPI: el archivo comprimido envoltorio en el que se distribuyen los archivos ZRB.
  • Glosario: frame rate, signature.