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 emmovies/.
Extensão Usado por Notas .bikmovies/*.bikdo TA: KingdomsRAD Bink 1. Assinatura BIK+ um byte de revisão (BIKfno 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 zrba um.bik(nem okbot bika 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 rejeitaKB2*com um erro claro. - Vinhetas cifradas do Boneyards. Alguns ficheiros em
boneyards/metagame/*.bik(por exemplo,ftuimovie2.bik) têm a extensão.bikmas 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.