Todas as páginas de formatos ↓
Gráficos e mídia

Bink — vídeo das cinemáticas do TA: Kingdoms

Fonte: coreprime/kbot @ 0ab97bf · Editar no GitHub

O Total Annihilation: Kingdoms substituiu as cinemáticas Smacker (.zrb) do jogo original pelo codec Bink, mais recente, da RAD Game Tools, gravado como .bik. As introduções das missões, os briefings das facções e as cinemáticas finais vêm todos como arquivos Bink 1 em movies/.

Extensão Usado por Observações
.bik movies/*.bik do TA: Kingdoms RAD Bink 1. Assinatura BIK + um byte de revisão (BIKf no TA:K).

Bink não é Smacker: é um codec separado e posterior, com seu próprio fluxo de bits de vídeo baseado em DCT e seu próprio áudio (Bink Audio, DCT ou RDFT). O kbot lê o cabeçalho do contêiner por conta própria, mas deixa a decodificação dos pixels para o FFmpeg, que inclui um decodificador de Bink 1 (binkvideo, binkaudio_dct/binkaudio_rdft).

Tip

Experimente você mesmo.

kbot bik info   movies/takmission14_ph.bik          # header summary
kbot bik to-mp4 movies/takmission14_ph.bik out.mp4  # decode to MP4 (requires ffmpeg)

Em Go. Use 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")

O que você encontra numa instalação do 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

Uma cinemática de missão típica tem 640 × 350 a 15 fps, com uma única faixa de áudio estéreo de 16 bits (~22 kHz). Os clipes de movies/gui/ são bem menores e às vezes têm dimensões ímpares (por exemplo, 124 × 101) — veja a armadilha mais abaixo.


Estrutura do cabeçalho (Bink 1)

Todos os campos são little-endian. O kbot lê até as tabelas das faixas de áudio, inclusive; o índice de quadros e o fluxo de bits compactado ficam para o 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;

Taxa de quadros

fps = FPSNum / FPSDen. As cinemáticas do TA:K usam 15 / 1. Como é um par racional, o valor pode ser fracionário, por isso o kbot o guarda como float.

Flags de áudio (a palavra Flags de 16 bits)

Bit Significado
0x4000 amostras de 16 bits (senão, 8 bits)
0x2000 estéreo (senão, mono)
0x1000 codec DCT (senão, RDFT)

Note

O SampleRate é o valor gravado tal como está: o TA:K usa 22254 Hz, e não um 22050 redondo. O kbot informa o valor sem alterá-lo.


A conversão só decodifica

kbot bik to-mp4 chama o 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

Não existe from-mp4: não há nenhum codificador Bink de código aberto, e só as ferramentas proprietárias da RAD produzem arquivos .bik. Na prática, o mesmo vale para o Smacker — o FFmpeg padrão também não tem codificador nem muxer de Smacker (veja Smacker/ZRB).

Warning

Dimensões ímpares. Vários clipes movies/gui/*.bik têm dimensões que não são divisíveis por 2 (por exemplo, 124 × 101). O H.264 com yuv420p exige largura e altura pares, então o conversor completa até o próximo tamanho par com um filtro pad, em vez de redimensionar: nenhum pixel é reamostrado; em vez disso, acrescenta-se uma linha/coluna preta na borda.


Armadilhas

  • Bink não é Smacker. Não aponte kbot zrb para um .bik (nem kbot bik para um .zrb); as assinaturas e os codecs são completamente diferentes.
  • O Bink 2 (KB2) não é suportado. O TA:K é anterior ao Bink 2, então todo arquivo que vem com o jogo é Bink 1 (BIK*). O kbot rejeita KB2* com uma mensagem de erro clara.
  • Vinhetas criptografadas do Boneyards. Alguns arquivos em boneyards/metagame/*.bik (por exemplo, ftuimovie2.bik) têm a extensão .bik, mas não são contêineres Bink: são dados embaralhados/ofuscados para a interface do metagame online. O kbot os rejeita como inválidos em vez de tentar adivinhar.

Veja também

  • Smacker / ZRB — o formato de cinemáticas do TA original que o Bink substituiu.
  • HPI — o arquivo compactado que serve de invólucro para esses arquivos.