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