Wyciąganie i konwersja MVE z Baldurs Gate do formatu mp4

Znając strukturę binarnego pliku można wyciągać z niego interesujące nas dane. Na blogu multimedia.cx przedstawiono sposób wyciągania animacji z BIFFów (filmików pokazywanych np. między rozdziałami) i konwertowanie ich do normalnych formatów za pomocą FFmpeg.
bgmov1
Potrzebujemy skrypt Pythona, który wyszuka filmiki w podanym pliku bif:
#!/usr/bin/python
# parse-bif-graf.py
#  by Mike Melanson (mike -at- multimedia.cx)
# Split apart a game resource archive format (GRAF) named BIF that comes
# from the game Baldur's Gate. Format details can be found at:
# http://wiki.xentax.com/index.php?title=Baldurs_Gate_BIF
from struct import *
import sys
if (len(sys.argv) <2):
	print "Usage: parse-bif-graf.py <graf.bif>"
	sys.exit(1)
graf_bif = sys.argv[1]
f = open(graf_bif, "rb")
bif_header = f.read(0x14)
if (bif_header[0:6] != "BIFFV1"):
	print "%s does not conform to the BIFF format" % (sys.argv[1])
	sys.exit(1)
file_count = unpack('<L', bif_header[8:12])[0]
header = f.read(file_count * 16)
for i in range(file_count):
	(id, discard, offset, size, type) = unpack("<hhlll", header[i*16:i*16+16])
	filename = "%s-%d.mve" % (graf_bif, id)
	print "extracting file #%d at offset %d, %d bytes, to '%s'" % (id, offset, size, filename)
	f.seek(offset)
	out = open(filename, "wb")
	file_data = f.read(size)
	out.write(file_data)
	out.close()
f.close()
Oraz skrypt basha (pod Linuksem), który ułatwi masową konwersję wyciągniętych plików MVE do mp4:
for mve in `ls *.mve`
do
  ffmpeg -y -i $mve   -acodec libfaac -ab 128k   -vcodec libx264 -vpre hq -b 500k -bt 500k   `basename $mve .mve`.mp4
done
Wykorzystanie tych skryptów jest proste. Wyciągamy MVE:
python parse-bif-graf.py bg2/Movies/MovEnd.bif
I konwertujemy wykonując skrypt basha w katalogu z plikami mve:
chmod 755 ./convert.sh
./convert.sh
RkBlog

Tworzenie gier w Pythonie, 7 January 2010

Comment article
Comment article RkBlog main page Search RSS Contact