Tugas IV Teknologi Informasi 

Oleh 	: R. Rizki Munggaran Sastra Permana
NIM 	: 13294084
Dosen	: Onno W. Purbo

Bagaimana membuat MPEG Movie
(untuk UNIX)

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  ""