Tulisan di bawah ini merupakan garisbesar (overview) dari
cara membuat file format MPEG movie dari file-file gambar yang ada. Dokumentasi
ini hanya dikhususkan untuk pengguna yang menggunakan system UNIX (bukan
Windows atau Mac). Untuk membuat film MPEG di sistem UNIX, ada beberapa hal
yang perlu di persiapkan :
-
Serangkaian
file-file gambar yang berisi data untuk film.
-
Program yang
dapat mengkonversi gambar-gambar tersebut menjadi tiga file-file terpisah,
yaitu file Y, U, dan file V.
-
MPEG encoder seperti
mpeg(_encode)
-
Program display
MPEG untuk melihat hasilnya.
File data Image /
gambar
File data image dapat berupa berbagai jenis format.
Dengan menggunakan tool konversi yang ada (dapat diperoleh secara “free” di
web), ada script yang dapat digunakan
untuk mengkonversi format-format tersebut ke format ppm dan kemudian menjadi
file-file YUV. Lebih baik jika data
image diperkecil ukurannya menjadi ukuran yang relatif lebih kecil (sekitar
400x300). Ini dilakukan sehingga film yang dihasilkan akan di play back dengan
kecepatan yang cukup dan ukurannya dapat dimanage dengan baik. Contoh untuk hal
ini akan ditunjukkan kemudian.
Konversi ke YUV
Tidak peduli format image dari data, sebelum
mengirimkannya ke encoder MPEG, data tersebut harus dikonvert terlebih dahulu
ke file-file terpisah Y, U dan file V. Satu cara untuk melakukan ini adalah
menggunakan program (yang disebut ppmtoyuvsplit) yang merupakan bagian dari
netpbm toolkit (dapat diperoleh via ftp anonymous pada site
ftp://www.arc.umn.edu/GVL/). Kombinasi dari tool-tool dari beberapa toolkit
yang dapat digunakan dalam proses konversi ini. Di bawah ini adalah contohnya :
rlatorle im.0001.rla | avg4 | avg4 | rletoppm |
ppmtoyuvsplit basename
MPEG Encoder
MPEG encoder yang digunakan disini disebut simply mpeg
( dapat diperoleh via anonymous ftp at havefun.stanford.edu di directori
/pub/mpeg atau ftp.arc.umn.edu/pub/GVL). Encoder ini
menerima serangkaian file-file Y,U,V yang terpisah. Di bawah ini adalah sebuah
contoh dimana 100 file 180x122 dari directory work di encoding ke file yang dinamai
“outname.mpg”.
mpeg -a 1 -b 100 -h 180 -v 122 -PF
/work/i3a/mpeg/basename -s outname.mpg
Catatan : ada mpeg encoder lainnya (disebut
mpeg_encode) yang dapat diperoleh gratis melalui anonymous ftp di
mm-ftp.cs.berkeley.edu. Keuntungan dari encoder ini adalah bahwa ia tidak
membutuhkan kita untuk mempunyai package pbmplus. Tetapi, didalamnya terdapat
library-library yang dibutuhkan dari package pbmplus dengan source nya.
Program-program
Display MPEG
Ada beberapa program display MPEG berbasis-X11.
Program yang digunakan disini disebut mpeg_play ( dapat diperoleh via anonymous
ftp at ftp.geom.umn.edu). Ketika
menggunakan program ini, tipe dari “visual” harus secara eksplisit di
terangkan. Di bawah ini adalah contoh bagaimana menggunakannya pada workstation
SGI 24-bit :
mpeg_play -dither color outname.mpg
Menggabungkan
hal-hal di atas
Langkah-langkah di atas dapat dijadikan satu shell
script. Di bawah ini disertakan script ybs. Script tersebut dapat dilaksanakan
bila kita telah mempunyai :
-
serangkaian image
(rle, ppm, gif, sgi) dinamakan menggunakan persyaratan sebagai berikut :
basename.0001.ext, basename.0002.ext, … Dimana “ext” adalah extensi file image.
-
Package netpbm
-
Stanford mpeg
encoder
Script
#!/bin/csh -f
#
# Create mpeg animation file directly from a
series of image files.
#
# Original script from Wes Barris, MSC, Inc.
# wesb@msc.edu
#
# Additions by Matt Hughes, University of
Minnesota Supercomputer Institute.
# 3/23/94
#
# Define the defaults
#
@ fs = 1 # starting frame number
@ fe = 1 # ending frame number
@ fi = 1 # frame increment
set base = "image" # default basename
set TMPDIR = /usr/tmp/$USER # default temp directory
#set TMPDIR = /work/i0tmp/$USER
#
if ( $#argv == 0 ) then
echo "Usage: makempeg [-fs start]
[-fe end] [-fi increment] [-base basename] [-ext extension]"
echo ""
echo " fs = fe = fi = 1"
echo " base = image"
exit
endif
#
# Parse out arguments.
#
@ n = 1
while ($n <= $#argv)
if ("$argv[$n]" ==
"-fs") then
@ n++
@ fs = $argv[$n]
else if ("$argv[$n]" ==
"-fe") then
@ n++
@
fe = $argv[$n]
else if ("$argv[$n]" ==
"-fi") then
@ n++
@ fi = $argv[$n]
else if ("$argv[$n]" ==
"-base") then
@ n++
set base = $argv[$n]
else if ("$argv[$n]" ==
"-ext") then
@ n++
set ext = $argv[$n]
else
echo "Usage: makempeg [-fs start]
[-fe end] [-fi increment] [-base basename] [-ext extension]"
echo ""
echo " fs = fe = fi = 1"
echo " base = image"
exit
endif
@ n++
end
#
# Find out what image format we are dealing
with.
#
if ($?ext) then
set file = `echo $base $fs $ext | awk
'{printf "%s.%04d.%s",$1,$2,$3}'`
if (-e $file) then
else
echo I can\'t find $file.
exit
endif
else
set file = `echo $base $fs | awk '{printf
"%s.%04d", $1,$2}'`
if (-e $file.rle) then
set ext = rle
else if (-e $file.sgi) then
set ext = sgi
else if (-e $file.rgb) then
set ext = rgb
set CONV = sgitopnm
else if (-e $file.ppm) then
set ext = ppm
else if (-e $file.gif) then
set ext = gif
else if (-e $file.tiff) then
set ext = tiff
else if (-e $file.xwd) then
set ext = xwd
else if (-e $file.jpg) then
set ext = jpg
else if (-e $file.tga) then
set ext = tga
else
echo I can\'t find $file.\*
exit
endif
endif
#
# Select an image converter based on the
filename extension.
#
if ($ext == rle) then
set CONV = rletopnm # part of the Utah Raster
Toolkit
else if ($ext == sgi || $ext
== rgb) then
set CONV = sgitopnm # part of NETPBM
else if ($ext == ppm) then
set CONV = cat
else if ($ext == gif) then
set CONV = giftopnm # part of NETPBM
else if ($ext == tiff) then
set CONV = tifftopnm # part of NETPBM
else if ($ext == xwd) then
set CONV = xwdtopnm # part of NETPBM
else if ($ext == tga) then
set CONV = tgatoppm # part of NETPBM
else if ($ext == jpg) then
set CONV = djpeg # part of The Independent JPEG Group's
JPEG software
else
echo Unknown file extension\: $ext
exit
endif
#
# get size of the first image
and use for the rest.
#
set file = `echo $base $fs
$ext | awk '{printf "%s.%04d.%s",$1,$2,$3}'`
set junk = `$CONV $file |
head -2`
@ width = $junk[2]
@ height = $junk[3]
echo ""
echo ""
echo images have dimensions
$width x $height
sleep 2
#
# Set up a temporary location (with sufficient
space) for intermediate
# files to go.
#
if (-d $TMPDIR) then
echo $TMPDIR exists
else
echo Creating $TMPDIR
mkdir $TMPDIR
endif
#
# loop over all selected
images
#
@ iin = $fs
@ iout = $fs
while ( $iin <= $fe )
set file = `echo $base $iin $ext | awk
'{printf "%s.%04d.%s",$1,$2,$3}'`
set outname = $TMPDIR/$base.$$.$iout
echo Converting $file to $outname .Y .U .V
$CONV $file | ppmtoyuvsplit $outname
@ iin += $fi
@ iout++
end
@ iout-- # reset to the last actual frame output
#
# Compress into an mpeg movie file.
# NOTE: An option has to be added if the width
of the image is not evenly
# divisible by 16.
#
set junk = `echo $width 16 |
awk '{print $1/$2}'`
@ div16 = `echo $junk | awk
-F. '{print $2}'`
if ($div16 == 0) then
set junk = `echo $height 16 | awk '{print
$1/$2}'`
@ div16 = `echo $junk | awk -F. '{print
$2}'`
if ($div16 == 0) then
set PF = "" # only if both X and Y are evenly
divisible by 16
else
set PF = "-PF"
endif
else
set PF = "-PF"
endif
#
# ppmtoyuvsplit may chop off an odd row and/or
column
#
set junk = `echo $width 2 |
awk '{print $1/$2}'`
@ xeven = `echo $junk | awk
-F. '{print $2}'`
set junk = `echo $height 2 |
awk '{print $1/$2}'`
@ yeven = `echo $junk | awk
-F. '{print $2}'`
#
echo Width Height $width
$height in
#
if ( $xeven != 0 ) @ width --
if ( $yeven != 0 ) @ height
--
#
echo Width Height $width
$height out
sleep 2
set MPEGNAME =
"$base".mpg
mpeg -a $fs -b $iout -h
$width -v $height $PF $TMPDIR/$base.$$. -s $MPEGNAME
#
# Clean up and instruct the user.
#
/bin/rm $TMPDIR/$base.$$.*.Y
/bin/rm $TMPDIR/$base.$$.*.U
/bin/rm $TMPDIR/$base.$$.*.V
#
echo "To see segment, type mpeg_play
$MPEGNAME"
echo "or"
echo "mpeg_play -dither color $MPEGNAME"
echo ""