The.Matrix-ASCII Process

Click to view the pictorial process page.

I used serveral different programs, scripts and platforms to go from The Matrix to The.Matrix-ASCII. The scripts are very simple. The bulk of the time for the conversion was determining what settings I thought were best.

The first step is to get the frames from the DVD.
mplayer dvd://1 -benchmark -noframedrop -nosound -vo jpeg

I tried to use mplayer for extract the ac3 file but it gave me an error during the extraction. I used DVD2AVI instead.

I tried to get aview to output the ASCII to stdout. When I did this I lost some of the information such as bold and reverse characters. I ended up modifying aview to run xwd and then exit. I felt this was a cheap way out but it was quick, easy, and did exactly what I wanted.

diff -Nru aview-1.3.0/main.c aview-1.3.0-jz/main.c
--- aview-1.3.0/main.c  Wed Apr 25 12:00:06 2001
+++ aview-1.3.0-jz/main.c       Sat Aug 24 23:43:03 2002
@@ -52,6 +52,7 @@
     aa_autoinitkbd(context,0);
     aa_hidecursor(context);
     main_loop();
+    system("xwd -silent -out curframe.xwd -nobdrs -name 'aa for X'");
     aa_close(context);
     return(0);
 }
diff -Nru aview-1.3.0/ui.c aview-1.3.0-jz/ui.c
--- aview-1.3.0/ui.c    Wed Apr 25 12:04:37 2001
+++ aview-1.3.0-jz/ui.c Sat Aug 24 23:42:17 2002
@@ -204,7 +204,8 @@
            resized = 0;
        }
        aa_flush(context);
-       c = aa_getevent(context, 1);
+        quit = 1;
+       //c = aa_getevent(context, 1);
        switch (c) {
        case 'h':
            ui_help();

The next step was to use my patched aview (aview.xwd) to convert each frame to an image of text. I did this with a small script.

#!/bin/bash

export PHASEONE=/tmp/matrix/phase1
export PHASETWO=/tmp/matrix/phase2
LOG=/tmp/matrix/doit.log

convert-sequence ()
  {
    cd $PHASEONE
    for FRAME in `seq -f %08g 1 196158`
      do
        while [ -e $PHASEONE/pause ]
          do
            sleep 300
          done
        IMAGE="${FRAME}.jpg"
        echo $FRAME
        convert -quality 100 -crop 720x360+0+60 $IMAGE temp.jpg
        if [ $? -ne 0 ]
          then
            echo error in initial cropping
            exit 1
          fi
        jpegtopnm temp.jpg >curframe.ppm 2>/dev/null
        if [ $? -ne 0 ]
          then
            echo error converting cropped image to ppm
            exit 1
          fi
        aview.xwd -width 135 -height 57 -dim -bold -reverse -normal curframe.ppm
        if [ $? -ne 0 ]
          then
            echo error with aview
            exit 1
          fi
        convert -colorize 83/1/100 -crop 1080x720+0+10 -geometry 720x480 curframe.xwd $PHASETWO/$IMAGE
        if [ $? -ne 0 ]
          then
            echo error with final convert
            exit 1
          fi
        mv $IMAGE converted/
      done
      rm -f temp.jpg curframe.ppm curframe.xwd
  }

echo -e "`date`\tStart" >>$LOG

convert-sequence

echo -e "`date`\tFinished convert-sequence" >>$LOG

echo 
"----------------------------------------------------------------------------" >>$LOG

At this point I had a folder filled with my ASCII images. I wanted to combine them together to make an MPEG-2. I ran into several problems.
jpeg2yuv can not read all of the jpeg's...it was just for testing, not for production.
ppmtoy4m can *not* read pgm files, only *true* ppm files.
ppmtoppm can not be used in a stream with multiple files.
I did not have the hard drive space to hold all of these images as bitmaps.

The solution that I chose:
Convert the images to bitmaps and compress with bzip2.
Decompress the images in RAM and convert to MPEG-2.

for FRAME in `seq -f %08g 1 196158`
  do
    echo $FRAME
    jpegtopnm ../phase2/$FRAME.jpg|ppmtoppm|bzip2 >$FRAME.ppm.bz2
  done
I did not have any one drive large enough to hold all of these images. I made a text file that listed the location of each image, in order. To combine these images into an MPEG-2 I ran:
time cat /tmp/matrix/list|xargs bzcat|ppmtoy4m -F 24000:1001|mpeg2enc -f 8 -q 7 -F 1 -a 3 -4 1 -2 1 -P -I 0 -N 0 -o video_DVD.m2v

time cat /tmp/matrix/list
time, because I want to know how long it takes...

cat the list of images needed because it is the easiest way (the images are on different drives)
-

xargs bzcat
xargs so bzcat will uncompress as many images at possible in as few instances as possible
-

ppmtoy4m -F 24000:1001
convert ppm files to y4m movie with the correct ending frame rate
-

mpeg2enc -f 8 -q 7 -F 1 -a 3 -4 1 -2 1 -P -I 0 -N 0 -o video_DVD.m2v
-f 8 DVD MPEG-2
-q 7 Minimum  quantisation  of the output stream. The lower the number the
higher the quality
-F 1 24000.0/1001.0
-a 3 16:9 display
-4 1 controls  discarding during  the  initial  4*4 sub-sampled search 
stage
-2 1 controls discarding during the secondary 2*2 sub-sampled stage
-P forces the GOP size selection  to  choose  sizes that ensure 2 B frames
appear between adjacent I/P frames
-I 0 support for interlaced video turned off
-N 0 reduce the precision with which of high-frequency information encoded
-o video_DVD.m2v out file = video_DVD.m2v

That took 892 minutes and created my MPEG-2 video:

7465361053 Nov 19 15:24 video_DVD.m2v
I added sound with:
time mplex -S 0 -f 8 -M -V -O 101 -o The.Matrix-ASCII.mpg video_DVD.m2v /tmp/matrix/matrix.ac3
That took 9 minutes and created my high quality The.Matrix-ASCII:
7989979136 Nov 19 16:57 The.Matrix-ASCII.mpg

That would have been the end except I wanted to share this. BitTorrent was the way that I chose to distribute the movie. I wanted this to fit on a DVDR. That meant shrinking the movie. I had plans of making a menu and maybe adding some screenshots of the scripts running. I used CCE with a max vbr rate of 9800 and an average of 4110. After 1 meg of overhead I was left with one meg free on the DVD+R. I left the movie alone at that point, being the highest quality that would fit.

I wanted a nice image to stick on the DVD. I thought that I might as well do the insert as well. I scanned those two images in and converted them to ASCII:

aview.xwd -width 200 -height 121 -extended -dim -bold -reverse -normal dvdbig.pnm
aview.xwd -width 492 -height 191 -extended -dim -bold -reverse -normal front.pnm

Jack

Return to The.Matrix-ASCII main page.