Усі сторінки форматів ↓
Графіка й медіа

Bink — відео заставок TA: Kingdoms

Джерело: coreprime/kbot @ 0ab97bf · Редагувати на GitHub

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

Розширення Де використовується Примітки
.bik movies/*.bik у TA: Kingdoms 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 кадрів/с з однією 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 — архів-обгортка, у якому постачаються ці файли.