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 emmovies/.
Extensão Usado por Observações .bikmovies/*.bikdo TA: KingdomsRAD Bink 1. Assinatura BIK+ um byte de revisão (BIKfno 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 zrbpara um.bik(nemkbot bikpara 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 rejeitaKB2*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.