Bink — відео заставок TA: Kingdoms
Джерело: coreprime/kbot @ 0ab97bf · Редагувати на GitHub
Total Annihilation: Kingdoms замінила ролики Smacker (
.zrb) оригінальної гри новішим кодеком Bink від RAD Game Tools, що зберігається у файлах.bik. Вступи до місій, брифінги фракцій і фінальні ролики постачаються як файли Bink 1 уmovies/.
Розширення Де використовується Примітки .bikmovies/*.bikу TA: KingdomsRAD 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 — архів-обгортка, у якому постачаються ці файли.