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 .smkLas herramientas genéricas de Smacker Formato estándar de RAD. .zrbLos datos data/*.zrbde TACavedog cambió la extensión de los archivos Smacker a .zrbpara 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
.bikconkbot zrb: usakbot biken su lugar. - Los árboles de Huffman de
SMK4no son compatibles con los decodificadores deSMK2. 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↔.smkno hace ningún daño, pero el juego espera.zrben el directoriodata/. No le pases al motor archivos con extensión.smk.