Bink — TA: Kingdoms 컷신 영상
Total Annihilation: Kingdoms는 원작의 Smacker(
.zrb) 영상을 RAD Game Tools의 더 새로운 Bink 코덱으로 바꾸었으며,.bik로 저장합니다. 미션 인트로, 세력 브리핑, 아웃트로는 모두movies/아래의 Bink 1 파일로 배포됩니다.
확장자 사용처 비고 .bikTA: Kingdoms movies/*.bikRAD Bink 1. 시그니처는 BIK+ 리비전 바이트(TA:K에서는BIKf).Bink는 Smacker가 아닙니다 — 자체 DCT 기반 영상 비트스트림과 자체 오디오(Bink Audio, DCT 또는 RDFT)를 갖춘, 별개의 더 나중 코덱입니다. kbot은 컨테이너 헤더는 직접 파싱하지만 픽셀 디코딩은 Bink 1 디코더(
binkvideo,binkaudio_dct/binkaudio_rdft)가 들어 있는 FFmpeg에 맡깁니다.
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 kHz) 하나가 있습니다. movies/gui/의 클립은 훨씬 작고 가끔 홀수
크기(예: 124 × 101)이기도 합니다 — 아래의 주의할 점을 참고하세요.
헤더 구조(Bink 1)
모든 필드는 리틀 엔디언입니다. 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는 딱 떨어지는 22050이 아니라
22254 Hz를 씁니다. 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). yuv420p를 쓰는 H.264는 너비와 높이가 짝수여야
하므로, 변환기는 크기를 다시 조정하는 대신 pad 필터로 다음 짝수 크기까지
채웁니다 — 픽셀을 다시 표본화하지 않고, 대신 가장자리에 검은 행/열을
덧붙입니다.
주의할 점
- Bink는 Smacker가 아닙니다.
.bik에kbot zrb를 쓰거나.zrb에kbot bik을 쓰지 마세요. 시그니처와 코덱이 완전히 다릅니다. - Bink 2(
KB2)는 지원하지 않습니다. TA:K는 Bink 2보다 먼저 나왔으므로 배포된 파일은 모두 Bink 1(BIK*)입니다. kbot은KB2*를 분명한 오류와 함께 거부합니다. - 암호화된 Boneyards 짧은 영상.
boneyards/metagame/*.bik아래의 파일 몇 개(예:ftuimovie2.bik)는.bik확장자를 달고 있지만 Bink 컨테이너가 아닙니다 — 온라인 메타게임 UI용으로 뒤섞거나 난독화한 페이로드입니다. kbot은 추측하지 않고 이를 잘못된 파일로 거부합니다.
함께 보기
- Smacker / ZRB — Bink가 대체한 원작 TA의 컷신 형식.
- HPI — 이 파일들을 담아 배포하는 컨테이너 아카이브.