Todas as páginas de formatos ↓
Gráficos e multimé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, guardado como .bik. As introduções das missões, os briefings das fações e os finais são todos distribuídos como ficheiros Bink 1 em movies/.

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

O Bink não é Smacker: é um codec diferente e posterior, com o seu próprio fluxo de bits de vídeo baseado em DCT e o seu próprio áudio (Bink Audio, DCT ou RDFT). O kbot analisa o cabeçalho do contentor de forma nativa, mas delega a descodificação dos píxeis no FFmpeg, que inclui um descodificador de Bink 1 (binkvideo, binkaudio_dct/binkaudio_rdft).

Tip

Experimente por si.

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

A partir de 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 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 muito mais pequenos e por 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é às tabelas das faixas de áudio, inclusive. O índice de fotogramas e o fluxo de bits comprimido ficam a cargo do 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 fotogramas

fps = FPSNum / FPSDen. As cinemáticas do TA:K usam 15 / 1. Como se trata de um par racional, o valor pode ser fracionário, por isso o kbot guarda-o como número de vírgula flutuante.

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

Bit Significado
0x4000 amostras de 16 bits (caso contrário, 8 bits)
0x2000 estéreo (caso contrário, mono)
0x1000 codec DCT (caso contrário, RDFT)

Note

O SampleRate é o valor guardado tal e qual: o TA:K usa 22254 Hz, e não uns redondos 22050. O kbot apresenta-o sem o alterar.


A conversão é só de descodificação

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 de Bink de código aberto, e só as ferramentas proprietárias da RAD produzem ficheiros .bik. Na prática, passa-se o mesmo com o Smacker: o FFmpeg de origem 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, por isso o conversor acrescenta margem até ao tamanho par seguinte com um filtro pad, em vez de redimensionar: nenhum píxel é reamostrado, é antes acrescentada uma linha ou coluna preta na borda.


Armadilhas

  • O Bink não é Smacker. Não aponte o kbot zrb a um .bik (nem o kbot bik a 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, por isso todos os ficheiros distribuídos são Bink 1 (BIK*). O kbot rejeita KB2* com um erro claro.
  • Vinhetas cifradas do Boneyards. Alguns ficheiros em boneyards/metagame/*.bik (por exemplo, ftuimovie2.bik) têm a extensão .bik mas não são contentores Bink: são payloads baralhados ou ofuscados para a interface do metajogo online. O kbot rejeita-os como inválidos em vez de tentar adivinhar.

Ver também

  • Smacker / ZRB — o formato das cinemáticas do TA original que o Bink substituiu.
  • HPI — o arquivo invólucro em que estes ficheiros são distribuídos.