모든 형식 페이지 ↓
그래픽·미디어

Bink — TA: Kingdoms 컷신 영상

출처: coreprime/kbot @ 0ab97bf · GitHub에서 편집

Total Annihilation: Kingdoms는 원작의 Smacker(.zrb) 영상을 RAD Game Tools의 더 새로운 Bink 코덱으로 바꾸었으며, .bik로 저장합니다. 미션 인트로, 세력 브리핑, 아웃트로는 모두 movies/ 아래의 Bink 1 파일로 배포됩니다.

확장자 사용처 비고
.bik TA: Kingdoms movies/*.bik RAD 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 — 이 파일들을 담아 배포하는 컨테이너 아카이브.