Все страницы форматов ↓
Графика и медиа

Bink — видеоролики TA: Kingdoms

Источник: coreprime/kbot @ 0ab97bf · Редактировать на GitHub

В Total Annihilation: Kingdoms ролики Smacker (.zrb) из оригинальной игры заменены более новым кодеком Bink от RAD Game Tools, файлы которого хранятся как .bik. Вступления к миссиям, брифинги фракций и финальные ролики поставляются в виде файлов Bink 1 в каталоге movies/.

Расширение Где используется Примечания
.bik TA: Kingdoms movies/*.bik RAD Bink 1. Сигнатура BIK + байт ревизии (BIKf в TA:K).

Bink — не Smacker: это отдельный, более поздний кодек с собственным видеопотоком на основе DCT и собственным звуком (Bink Audio, DCT или RDFT). kbot сам разбирает заголовок контейнера, а декодирование пикселей поручает FFmpeg, в котором есть декодер Bink 1 (binkvideo, binkaudio_dct/binkaudio_rdft).

Tip

Попробуйте сами.

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

Из Go. Используйте 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")

Что лежит в установке 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

Типичный ролик миссии — 640 × 350 при 15 fps с одной 16-битной стереодорожкой (~22 кГц). Клипы из movies/gui/ гораздо меньше, и у некоторых из них нечётные размеры (например, 124 × 101) — см. подводный камень ниже.


Структура заголовка (Bink 1)

Все поля little-endian. kbot читает заголовок вплоть до таблиц звуковых дорожек включительно. Покадровый индекс и сжатый битовый поток остаются на долю 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;

Частота кадров

fps = FPSNum / FPSDen. В роликах TA:K используется 15 / 1. Поскольку это пара числитель/знаменатель, значение может быть дробным, поэтому kbot хранит его как число с плавающей точкой.

Звуковые флаги (16-битное слово Flags)

Бит Значение
0x4000 16-битные сэмплы (иначе 8-битные)
0x2000 стерео (иначе моно)
0x1000 кодек DCT (иначе RDFT)

Note

SampleRate — это значение ровно в том виде, в каком оно записано: в TA:K это 22254 Гц, а не круглые 22050. kbot выводит его как есть.


Преобразование только с декодированием

kbot bik to-mp4 вызывает 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

Команды from-mp4 нет: кодировщиков Bink с открытым исходным кодом не существует, и файлы .bik создают только проприетарные инструменты RAD. На практике то же верно и для Smacker — в стандартной сборке FFmpeg нет ни кодировщика, ни мультиплексора Smacker (см. Smacker/ZRB).

Warning

Нечётные размеры. У ряда клипов movies/gui/*.bik ширина или высота не делится на 2 (например, 124 × 101). H.264 с yuv420p требует чётных ширины и высоты, поэтому конвертер не масштабирует кадр, а дополняет его до ближайшего чётного размера фильтром pad: пиксели не пересчитываются, вместо этого добавляется чёрная строка или столбец по краю.


Подводные камни

  • Bink — не Smacker. Не натравливайте kbot zrb на .bik (или kbot bik на .zrb): у них совершенно разные сигнатуры и кодеки.
  • Bink 2 (KB2) не поддерживается. TA:K вышла раньше Bink 2, поэтому все её файлы — Bink 1 (BIK*). kbot отклоняет KB2* с понятным сообщением об ошибке.
  • Зашифрованные короткие ролики Boneyards. Несколько файлов в boneyards/metagame/*.bik (например, ftuimovie2.bik) имеют расширение .bik, но контейнерами Bink не являются — это перемешанные или обфусцированные данные для интерфейса онлайн-метаигры. kbot не пытается угадывать и отклоняет их как недопустимые.

См. также

  • Smacker / ZRB — формат роликов оригинальной TA, на смену которому пришёл Bink.
  • HPI — архив-обёртка, в котором поставляются эти файлы.