Movies: Difference between revisions

From GRASS-Wiki
Jump to navigation Jump to search
 
(82 intermediate revisions by 3 users not shown)
Line 11: Line 11:
-ovc lavc -lavcopts vcodec=mpeg4:vhq:vbitrate=1800 -ffourcc MP4S
-ovc lavc -lavcopts vcodec=mpeg4:vhq:vbitrate=1800 -ffourcc MP4S
## for XviD, use:
## for XviD, use:
-ovc xvid -xvidencopts bitrate=1024
-ovc xvid -xvidencopts bitrate=1024 -xvidencopts pass=2 -xvidencopts cartoon
## for DivX4, use:
## for DivX4, use:
-ovc divx4 -divx4opts q=5
-ovc divx4 -divx4opts q=5
## for x264 use:
-ovc x264 -x264encopts pass=3 -x264encopts preset=veryslow -x264encopts tune=animation
</pre>
</pre>


Uses mplayer's encoder. Choose one of encoding formats and append to end  
Uses mplayer's encoder. Choose one of encoding formats and append to end  
of "mencoder" line. Unfortunately only way to know quality settings is by  
of "mencoder" line. Unfortunately only way to know quality settings is by  
encoding, watching result and reendocing with different params.
encoding, watching result and re-encoding with different params.


Notice - by default encoding with lavc will set video fourcc to FMP4, that can be decoded with ffdshow. Option -ffourcc MP4S will change it to MPS4 ("official" MS fourcc for mpeg4) and video will be playable on Windows by standart MS mpeg4 decoder. It may lead to side effects, if MS mpeg4 decoder is buggy. More info: http://www.itdp.de/mplayer-users/2005-03/msg00069.html
Notice - by default encoding with lavc will set video fourcc to FMP4, that can be decoded with ffdshow. Option -ffourcc MP4S will change it to MPS4 ("official" MS fourcc for mpeg4) and video will be playable on Windows by standard MS mpeg4 decoder. It may lead to side effects, if MS mpeg4 decoder is buggy. More info: http://www.itdp.de/mplayer-users/2005-03/msg00069.html
 
 
Other guides:
* http://www.mplayerhq.hu/DOCS/HTML/en/menc-feat-enc-images.html
* http://electron.mit.edu/~gsteele/ffmpeg/
* http://www.stillhq.com/extracted/howto-jpeg2mpeg/output.html


--------
==== Q: How to construct high-quality WebM movies? ====
A: {{wikipedia|WebM}} is the container for the {{wikipedia|VP8}} and {{wikipedia|VP9}} codecs. VP8 approaches H.264 in quality but differs from H.264 in that it is both patent + license free to use. Likewise, VP9 is an alternative to HEVC/H.265. The audio channel, if used, is encoded using the Ogg {{wikipedia|Vorbis}} codec for VP8 or Opus codec for VP9. Google has been promoting WebM as the standard fallback video format for HTML5 and is moving YouTube content to it. Firefox. Opera, and Google Chrome web browsers support WebM playback out of the box without need for extra plugins.
; Encoding:
First convert PNG or JPEG images to PPM format using the {{wikipedia|NetPBM}} tools.
: ''This step is pretty fast, I wouldn't worry about trying to parallelize it.''
<source lang="bash">
for file in *.png ; do
  pngtopnm $file > `basename $file .png`.ppm
done
</source>
::or
<source lang="bash">
for file in *.jpg ; do
  jpegtopnm $file > `basename $file .jpg`.ppm
done
</source>
Next create a Y4M stream containing a concatenation of the raw PPM frames:
<source lang="bash">
cat *.ppm | ppmtoy4m -F 2:1 > all_frames.y4m
</source>
* ''The "-F 2:1" option above sets the frame rate to 2 frames per second.''
* ''The <tt>ppmtoy4m</tt> program comes from the mjpegtools package.''
* ''For a very high number of frames you may wish to skip this step and create a named FIFO or stdin pipe directly into <tt>vpxenc</tt>, as the raw Y4M file can become extremely large.''
Finally, run the <tt>vpxenc</tt> encoder to create a high quality WebM video:
<source lang="bash">
vpxenc all_frames.y4m -o my_movie.webm \
  --passes=2 --threads=4 \
  --best --target-bitrate=2000 --end-usage=vbr \
  --auto-alt-ref=1 --verbose \
  --minsection-pct=5 --maxsection-pct=800 \
  --lag-in-frames=16 --kf-min-dist=0 --kf-max-dist=360 \
  --static-thresh=0 --drop-frame=0 \
  --min-q=0 --max-q=60
</source>
* ''Set "--threads=" in the above command to the number of cores on your CPU. (or one less than the number of cores if you have many)''
* ''If you are encoding to VP8 (and not VP9) consider adding <tt>--token-parts=2</tt>''
* ''If <tt>vpxenc</tt> complains about "Invalid image format" either add "-S 420jpeg" to the <tt>ppmtoy4m</tt> options or add "--profile=1" to the <tt>vpxenc</tt> options.
* ''The <tt>vpxenc</tt> program comes from the vpx-tools package.''
* [http://www.webmproject.org/docs/encoder-parameters/#2-pass-best-quality-vbr-encoding Encoder parameters help page]


--------
--------
Line 27: Line 88:
==== Q: How to generate an animated GIF, FLI, or MNG? ====
==== Q: How to generate an animated GIF, FLI, or MNG? ====


A: for animations of 300 frames or less, animated GIF, FLI, or MNG formats are smaller files and better quality (ie frames stored as PNG not JPEG). Create with [http://www.lcdf.org/gifsicle/ gifsicle], [http://vento.pi.tu-berlin.de/fli.html ppm2fli], or for MNG use [http://www.imagemagick.org/ ImageMagick's 'convert']. With more than 300 frames the players usually have memory issues. Animated GIFs are playable in any web browser of course and also in OpenOffice.
A: for animations of 300 frames or less, animated GIF, [http://woodshole.er.usgs.gov/operations/modeling/flc.html  FLI], or MNG formats are smaller files and better quality (i.e., frames stored as PNG not JPEG). Create with [http://www.lcdf.org/gifsicle/ gifsicle], [http://vento.pi.tu-berlin.de/fli.html ppm2fli], or for MNG use [http://www.imagemagick.org/script/convert.php ImageMagick's 'convert']. With more than 300 frames the players usually have memory issues. Animated GIFs are playable in any web browser of course and also in OpenOffice.
 
# with convert, many GIFs into one animated GIF:
convert -verbose -delay 20 -loop 0 snapshot*.png animation.gif
 
Notes: '-delay 20' means 20 hundreds of a second delay between each frame. The '-loop 0' flag lets it loop indefinitely. To loop only 3 times use '-loop 3' etc.
 
Sample script to export PNGs in GRASS (generates tmean_001.png .. tmean_708.png):
 
<source lang=bash>
  export i=0
  for year in `seq 1950 2008` ; do
      for m in `seq 1 12` ; do
          i=`expr $i + 1`
          # awk trick to generate wildcard-correct file names:
          i=`echo $i | awk '{printf "%03d\n", $1}'`
          r.out.png tmean_europe.$year.$m.avg out=tmean_$i.png
        done
    done
    convert -verbose -delay 20 -loop 0 tmean_*.png tmean_animation.gif
</source>
 
For presentations using a web browser, you can center the image on a blank white page, turn off any toolbars and go into full screen mode (F11 for Firefox or Chrome). Then Alt-Tab your way to the animation at the appropriate time and nobody knows you are using a web browser.
 
Example HTML for centering image:
 
<source lang="html4strict">
<HTML>
<HEAD></HEAD>
<BODY>
<BR><BR><BR><BR><BR><BR><BR>
<CENTER>
  <IMG SRC="animation.gif">
</CENTER>
</BODY>
</HTML>
</source>




--------
--------


==== Q: How to create dynamic surface movies in NVIZ? ====


==== Q: How to create dynamic surface movies in NVIZ ====
A: See slides from the FOSS4G 2006 workshop:
 
: http://skagit.meas.ncsu.edu/~helena/grasswork/foss4g/FOSS4G06WKSVisual4anim.odp
A: See slides from the FOSS4G 2006 workshop: http://skagit.meas.ncsu.edu/~helena/grasswork/foss4g/FOSS4G06WKSVisual4anim.odp


See also the example at the bottom of the [http://grass.ibiblio.org/grass63/manuals/html63_user/nviz/nviz_panel_kanim.html NVIZ keyframe animator panel help page].
See also the example at the bottom of the [http://grass.osgeo.org/grass64/manuals/html64_user/nviz/nviz_panel_kanim.html NVIZ keyframe animator panel help page].




Line 45: Line 142:


A: Use
A: Use
* [http://grass.ibiblio.org/grass63/manuals/html63_user/d.slide.show.html d.slide.show] to view in a GRASS xmon (see [http://grass.ibiblio.org/grass63/manuals/html63_user/d.mon.html d.mon])
* {{cmd|d.slide.show}} to view in a GRASS xmon (see {{cmd|d.mon}})
* [http://grass.ibiblio.org/grass63/manuals/html63_user/xganim.html xganim] to view on screen in X-windows (with live start/stop/speed controls)
* {{cmd|r.out.mpeg}} to save to a MPEG-1 movie.
* [http://grass.ibiblio.org/grass63/manuals/html63_user/r.out.mpeg.html r.out.mpeg] to save to a MPEG-1 movie.
* GRASS GIS 6: {{cmd|xganim|version=64}} to view on screen in X-windows (with live start/stop/speed controls)
* GRASS GIS 7: {{cmd|g.gui.animation}} to view on screen in wxGUI (with live start/stop/speed controls)
: See also the wiki page for the [[wxGUI Animation Tool]]:
{{YouTube|Pi1ESk9iPwk|YouTube video introduction to the WxGUI Animation Tool}}




Line 54: Line 154:
==== Q: How to animate a series of maps, including decorations? ====
==== Q: How to animate a series of maps, including decorations? ====


A: Use the xmon drivers ([http://grass.ibiblio.org/grass63/manuals/html63_user/d.mon.html d.mon])  
A: Use the xmon drivers ({{cmd|d.mon}})  
to render the displays to a window via a shell script loop, then switch from the ''x0'' to ''PNG''driver to save as a series of PNG or PPM images. Use a method answered in a FAQ above to combine those into a single animation.
to render the displays to a window via a shell script loop, then switch from the ''x0'' to ''PNG'' driver to save as a series of PNG or PPM images. Use a method answered in a FAQ above to combine those into a single animation.
 
 
--------
 
==== Q: How to create a screencast (for video tutorials etc)? ====
 
; GNU/Linux:
* Easist way: [http://recordmydesktop.sourceforge.net/ recordmydesktop] (user interfaces are 'qt-recordmydesktop' and 'gtk-recordmydesktop')
:* when uploading videos to Youtube created by <tt>recordmydesktop</tt> you need to encode the file eg. using <tt>mencoder</tt>
:- No sound, just video screencast, as AVI file:
::<pre>mencoder out.ogv -nosound -ovc lavc -o out.avi</pre>
:- With audio track, as AVI file:
::<pre>mencoder out.ogv -ovc xvid -oac mp3lame -xvidencopts pass=1 -o out.avi</pre>
:- With audio track, as WebM file:
::<pre>ffmpeg -i out.ogv -b:a 24k out.webm</pre>
:- With audio track, as MP4 file:
::<pre>ffmpeg -i out.ogv -ar 44100 -ab 96k -coder ac -strict experimental -vcodec libx264 out.mp4</pre>
* [https://wiki.ubuntu.com/MeetingLogs/openweekfeisty/screencast Ubuntu discussion over screencast]
* [https://wiki.ubuntu.com/ScreencastTeam/RecordingScreencasts Ubuntu screencast how to]
* [http://www.unixuser.org/~euske/vnc2swf/ vnc2swf] to record a flash movie ([http://www-pool.math.tu-berlin.de/~soeren/grass/modules/screenshots/vnc2swf_usage.html short vnc2swf usage tutorial])
* [http://www.maartenbaert.be/simplescreenrecorder/ SimpleScreenRecorder]
 
; MacOSX:
* [http://crschmidt.net/blog/archives/203/openlayers-screencast/ Chris Schmidt experience on MacOSX]
 
; MS Windows:
* [http://camstudio.org/ Camstudio]
 
-----


==== Examples ====
==== Examples ====
''Using the [http://grass.osgeo.org/download/data6.php Spearfish] sample dataset''


===== Animate on screen =====
===== Animate on screen =====
<pre>
''Using a shell script''
 
<source lang=bash>
GRASS_WIDTH=640 GRASS_HEIGHT=500 \
GRASS_WIDTH=640 GRASS_HEIGHT=500 \
   d.mon start=x0
   d.mon start=x0
Line 69: Line 201:
   d.rast elevation.dem --quiet
   d.rast elevation.dem --quiet
   d.vect roads
   d.vect roads
   d.vect bugsites icon=basic/circle col=black fcol=green \
   d.vect bugsites icon=basic/circle col=black fcol=green size=`echo "21-($NUM * 2)" | bc`
      size=`echo "21-($NUM * 2)" | bc`


   echo "symbol basic/arrow2 25 80 `echo "10*$NUM" | bc` 80:80:80 125:125:255" | d.graph
   echo "symbol basic/arrow2 25 80 `echo "10*$NUM" | bc` 80:80:80 125:125:255" | d.graph
Line 77: Line 208:
   d.barscale at=59.8,93.6 tcol=grey
   d.barscale at=59.8,93.6 tcol=grey
done
done
 
</source>
</pre>


===== Animate to files =====
===== Animate to files =====
''Using [http://grass.osgeo.org/grass64/manuals/html64_user/pngdriver.html GRASS's PNG driver]''


<pre>
<source lang=bash>
# set up base map
# set up base map
g.region rast=elevation.dem n=4927830 s=4912980
g.region rast=elevation.dem n=4927830 s=4912980
Line 120: Line 251:
done
done
\rm base.ppm
\rm base.ppm
</source>
===== Encode as animated GIF =====


</pre>
* ''Using the [http://www.lcdf.org/gifsicle/ gifsicle] encoder''
* ''View in a web browser or with ImageMagick's [http://www.imagemagick.org/Usage/basics/#animate animate]''
* see [[Movies#Q:_How_to_generate_an_animated_GIF.2C_FLI.2C_or_MNG.3F]] above
 
'''A) Using gifsicle:'''


===== Encode as animated GIF =====
Advantage: the delay is coded in the animated GIF file and rendered properly e.g. in a Web browser.
* ''Using the gifsicle encoder''
* ''View in a web browser''


<pre>
<source lang=bash>
# Imagemagick's <tt>convert</tt> program may do a better job at
# 256 color quantization than NetPBM's <tt>ppmquant</tt>.
for IMG in ganim*.ppm ; do  # convert each frame from PPM to GIF
for IMG in ganim*.ppm ; do  # convert each frame from PPM to GIF
  ppmquant 256 $IMG | ppmtogif > "`basename $IMG .ppm`.gif"
  #ppmquant 256 $IMG | ppmtogif > "`basename $IMG .ppm`.gif"
  convert "$IMG" "`basename $IMG .ppm`.gif"
done
done
gifsicle -O2 --delay 20 --no-loopcount --colors 256 ganim_*.gif > ganim.gif
gifsicle -O2 --delay 20 --no-loopcount --colors 256 ganim_*.gif > ganim.gif
\rm ganim_0*.gif
\rm ganim_0*.gif
</pre>
</source>
 
'''B) Using ImageMagick's convert and [http://www.imagemagick.org/Usage/basics/#animate animate]:'''
<source lang=bash>
# Generate "film" (create animated GIF):
convert lst_monthly_avg_film.00*.png lst_monthly_avg_2002_2012_zoom_film.gif
 
# play animation (delay 50millisec between frames, pause for 5 seconds at the end)
animate -delay 50 -pause 5 lst_monthly_avg_2002_2012_zoom_film.gif
</source>


===== Encode as animated PNG (MNG) =====
===== Encode as animated PNG (MNG) =====
* ''Using the ImageMagick "convert" encoder''
* ''Using the [http://www.imagemagick.org ImageMagick] "convert" encoder''
* ''View with ImageMagick's "display"''
* ''View with ImageMagick's "display"''


Line 144: Line 294:


===== Encode as FLI =====
===== Encode as FLI =====
* ''Using the ppm2fli encoder''
* ''Using the [http://vento.pi.tu-berlin.de/fli.html ppm2fli] encoder''
* ''View with mplayer or xanim''
* ''View with [http://www.mplayerhq.hu mplayer] or [http://xanim.polter.net xanim]''


<pre>
<source lang=bash>
ls ganim_*.ppm > frames.txt
ls ganim_*.ppm > frames.txt
ppm2fli -g"${GRASS_WIDTH}x${GRASS_HEIGHT}" -O -s 15 frames.txt ganim.fli
ppm2fli -g"${GRASS_WIDTH}x${GRASS_HEIGHT}" -O -s 15 frames.txt ganim.fli
\rm frames.txt
\rm frames.txt
</pre>
</source>
 
===== Encode as Flash =====
 
* ''Using the [http://www.swftools.org/ SWFTools] <tt>png2swf</tt> encoder''
* ''View with [http://www.mplayerhq.hu mplayer]''
 
png2swf -o outfile.swf *.png -r 1


===== Encode as MPEG-4 Xvid =====
===== Encode as MPEG-4 Xvid =====
* ''Using the mencoder encoder''
* ''Using the [http://www.mplayerhq.hu mencoder] encoder''
* ''View with mplayer or similar''
* ''View with [http://www.mplayerhq.hu mplayer] or similar''
 
<pre>


<source lang=bash>
# doesn't like GRASS's PPMs, convert to PNG
# doesn't like GRASS's PPMs, convert to PNG
for IMG in ganim*.ppm ; do
for IMG in ganim*.ppm ; do
   pnmtopng $IMG > "`basename $IMG .ppm`.png"
   pnmtopng $IMG > "`basename $IMG .ppm`.png"
done
done
mencoder "mf://ganim_*.png" -mf "type=png:fps=5" -o ganim.avi -ovc xvid -xvidencopts bitrate=1024
mencoder "mf://ganim_*.png" -mf "type=png:fps=5" -o ganim.avi \
  -ovc "xvid" -xvidencopts "bitrate=1024"
\rm ganim_0*.png
\rm ganim_0*.png
</pre>
</source>
 
==== Publish your cool videos in this Wiki ====
We have installed a Mediawiki widget extension and created a special template for including Youtube videos ([[Template:YouTube]]). See also [[WxGUI_Modeler#Video_tutorials|wxGUI Modeler]] page for the usage.


The overall goal is to have many as possible '''[http://www.youtube.com/results?search_query=grass+gis GRASS GIS videos on YouTube]'''


[[Category:FAQ]]
[[Category:FAQ]]
[[Category:Visualization]]

Latest revision as of 05:39, 6 September 2019

Q: How to construct high-quality MPEG-4 movies (animations) from a series of still frames?

Maris wrote:

Encode all .png files in directory to out.avi with 15 frames per second:

mencoder "mf:///path/to/files/*.png" -mf fps=15 -o out.avi # put -ovc here, see next lines
## for DivX - libavcodec MPEG 4 (DivX5), use:
-ovc lavc -lavcopts vcodec=mpeg4:vhq:vbitrate=1800 -ffourcc MP4S
## for XviD, use:
-ovc xvid -xvidencopts bitrate=1024 -xvidencopts pass=2 -xvidencopts cartoon
## for DivX4, use:
-ovc divx4 -divx4opts q=5
## for x264 use:
-ovc x264 -x264encopts pass=3 -x264encopts preset=veryslow -x264encopts tune=animation

Uses mplayer's encoder. Choose one of encoding formats and append to end of "mencoder" line. Unfortunately only way to know quality settings is by encoding, watching result and re-encoding with different params.

Notice - by default encoding with lavc will set video fourcc to FMP4, that can be decoded with ffdshow. Option -ffourcc MP4S will change it to MPS4 ("official" MS fourcc for mpeg4) and video will be playable on Windows by standard MS mpeg4 decoder. It may lead to side effects, if MS mpeg4 decoder is buggy. More info: http://www.itdp.de/mplayer-users/2005-03/msg00069.html


Other guides:



Q: How to construct high-quality WebM movies?

A: WebM is the container for the VP8 and VP9 codecs. VP8 approaches H.264 in quality but differs from H.264 in that it is both patent + license free to use. Likewise, VP9 is an alternative to HEVC/H.265. The audio channel, if used, is encoded using the Ogg Vorbis codec for VP8 or Opus codec for VP9. Google has been promoting WebM as the standard fallback video format for HTML5 and is moving YouTube content to it. Firefox. Opera, and Google Chrome web browsers support WebM playback out of the box without need for extra plugins.

Encoding

First convert PNG or JPEG images to PPM format using the NetPBM tools.

This step is pretty fast, I wouldn't worry about trying to parallelize it.
for file in *.png ; do
   pngtopnm $file > `basename $file .png`.ppm
done
or
for file in *.jpg ; do
   jpegtopnm $file > `basename $file .jpg`.ppm
done


Next create a Y4M stream containing a concatenation of the raw PPM frames:

cat *.ppm | ppmtoy4m -F 2:1 > all_frames.y4m
  • The "-F 2:1" option above sets the frame rate to 2 frames per second.
  • The ppmtoy4m program comes from the mjpegtools package.
  • For a very high number of frames you may wish to skip this step and create a named FIFO or stdin pipe directly into vpxenc, as the raw Y4M file can become extremely large.


Finally, run the vpxenc encoder to create a high quality WebM video:

vpxenc all_frames.y4m -o my_movie.webm \
  --passes=2 --threads=4 \
  --best --target-bitrate=2000 --end-usage=vbr \
  --auto-alt-ref=1 --verbose \
  --minsection-pct=5 --maxsection-pct=800 \
  --lag-in-frames=16 --kf-min-dist=0 --kf-max-dist=360 \
  --static-thresh=0 --drop-frame=0 \
  --min-q=0 --max-q=60
  • Set "--threads=" in the above command to the number of cores on your CPU. (or one less than the number of cores if you have many)
  • If you are encoding to VP8 (and not VP9) consider adding --token-parts=2
  • If vpxenc complains about "Invalid image format" either add "-S 420jpeg" to the ppmtoy4m options or add "--profile=1" to the vpxenc options.
  • The vpxenc program comes from the vpx-tools package.
  • Encoder parameters help page

Q: How to generate an animated GIF, FLI, or MNG?

A: for animations of 300 frames or less, animated GIF, FLI, or MNG formats are smaller files and better quality (i.e., frames stored as PNG not JPEG). Create with gifsicle, ppm2fli, or for MNG use ImageMagick's 'convert'. With more than 300 frames the players usually have memory issues. Animated GIFs are playable in any web browser of course and also in OpenOffice.

# with convert, many GIFs into one animated GIF:
convert -verbose -delay 20 -loop 0 snapshot*.png animation.gif

Notes: '-delay 20' means 20 hundreds of a second delay between each frame. The '-loop 0' flag lets it loop indefinitely. To loop only 3 times use '-loop 3' etc.

Sample script to export PNGs in GRASS (generates tmean_001.png .. tmean_708.png):

   export i=0
   for year in `seq 1950 2008` ; do
       for m in `seq 1 12` ; do
           i=`expr $i + 1`
           # awk trick to generate wildcard-correct file names:
           i=`echo $i | awk '{printf "%03d\n", $1}'`
           r.out.png tmean_europe.$year.$m.avg out=tmean_$i.png
        done
    done
    convert -verbose -delay 20 -loop 0 tmean_*.png tmean_animation.gif

For presentations using a web browser, you can center the image on a blank white page, turn off any toolbars and go into full screen mode (F11 for Firefox or Chrome). Then Alt-Tab your way to the animation at the appropriate time and nobody knows you are using a web browser.

Example HTML for centering image:

<HTML>
<HEAD></HEAD>
<BODY>
 <BR><BR><BR><BR><BR><BR><BR>
 <CENTER>
  <IMG SRC="animation.gif">
 </CENTER>
</BODY>
</HTML>



Q: How to create dynamic surface movies in NVIZ?

A: See slides from the FOSS4G 2006 workshop:

http://skagit.meas.ncsu.edu/~helena/grasswork/foss4g/FOSS4G06WKSVisual4anim.odp

See also the example at the bottom of the NVIZ keyframe animator panel help page.



Q: How to animate a time series of raster maps?

A: Use

  • d.slide.show to view in a GRASS xmon (see d.mon)
  • r.out.mpeg to save to a MPEG-1 movie.
  • GRASS GIS 6: xganim to view on screen in X-windows (with live start/stop/speed controls)
  • GRASS GIS 7: g.gui.animation to view on screen in wxGUI (with live start/stop/speed controls)
See also the wiki page for the wxGUI Animation Tool:
YouTube video introduction to the WxGUI Animation Tool



Q: How to animate a series of maps, including decorations?

A: Use the xmon drivers (d.mon) to render the displays to a window via a shell script loop, then switch from the x0 to PNG driver to save as a series of PNG or PPM images. Use a method answered in a FAQ above to combine those into a single animation.



Q: How to create a screencast (for video tutorials etc)?

GNU/Linux
  • Easist way: recordmydesktop (user interfaces are 'qt-recordmydesktop' and 'gtk-recordmydesktop')
  • when uploading videos to Youtube created by recordmydesktop you need to encode the file eg. using mencoder
- No sound, just video screencast, as AVI file:
mencoder out.ogv -nosound -ovc lavc -o out.avi
- With audio track, as AVI file:
mencoder out.ogv -ovc xvid -oac mp3lame -xvidencopts pass=1 -o out.avi
- With audio track, as WebM file:
ffmpeg -i out.ogv -b:a 24k out.webm
- With audio track, as MP4 file:
ffmpeg -i out.ogv -ar 44100 -ab 96k -coder ac -strict experimental -vcodec libx264 out.mp4
MacOSX
MS Windows

Examples

Using the Spearfish sample dataset

Animate on screen

Using a shell script

GRASS_WIDTH=640 GRASS_HEIGHT=500 \
  d.mon start=x0

g.region rast=elevation.dem n=4927830 s=4912980

for NUM in `seq 1 0.5 10` ; do
   d.rast elevation.dem --quiet
   d.vect roads
   d.vect bugsites icon=basic/circle col=black fcol=green size=`echo "21-($NUM * 2)" | bc`

   echo "symbol basic/arrow2 25 80 `echo "10*$NUM" | bc` 80:80:80 125:125:255" | d.graph

   echo "Spearfish, South Dakota" | d.text size=4.5 at=1,2.25
   d.barscale at=59.8,93.6 tcol=grey
done
Animate to files

Using GRASS's PNG driver

# set up base map
g.region rast=elevation.dem n=4927830 s=4912980
export GRASS_WIDTH=640
export GRASS_HEIGHT=500
export GRASS_PNGFILE=base.ppm
export GRASS_PNG_READ=FALSE
d.mon start=PNG
  d.rast elevation.dem
  d.vect roads
  echo "Spearfish, South Dakota" | d.text size=4.5 at=1,2.25
  d.barscale at=59.8,93.6 tcol=grey
d.mon stop=PNG

# loop to draw variable parts as new frames
i=0
export GRASS_PNG_READ=TRUE
for NUM in `seq 1 0.5 10` ; do
   i=`expr $i + 1`
   FRAMENUM=`echo $i | awk '{printf("%03d", $1)}'`
   echo "Processing frame $FRAMENUM ..."
   export GRASS_PNGFILE="ganim_${FRAMENUM}.ppm"
   cp base.ppm "$GRASS_PNGFILE"
   d.mon start=PNG --quiet
   d.vect bugsites icon=basic/circle col=black fcol=green \
      size=`echo "21-($NUM * 2)" | bc`

   echo "symbol basic/arrow2 25 80 `echo "10*$NUM" | bc` 80:80:80 125:125:255" | d.graph
   d.mon stop=PNG --quiet
done

# repeat the last frame a few times
for EXTRA in 1 2 3 ; do
 i=`expr $i + 1`
 FRAMENUM=`echo $i | awk '{printf("%03d", $1)}'`
 cp base.ppm "ganim_${FRAMENUM}.ppm"
done
\rm base.ppm
Encode as animated GIF

A) Using gifsicle:

Advantage: the delay is coded in the animated GIF file and rendered properly e.g. in a Web browser.

# Imagemagick's <tt>convert</tt> program may do a better job at 
# 256 color quantization than NetPBM's <tt>ppmquant</tt>.
for IMG in ganim*.ppm ; do   # convert each frame from PPM to GIF
   #ppmquant 256 $IMG | ppmtogif > "`basename $IMG .ppm`.gif"
   convert "$IMG" "`basename $IMG .ppm`.gif"
done

gifsicle -O2 --delay 20 --no-loopcount --colors 256 ganim_*.gif > ganim.gif

\rm ganim_0*.gif

B) Using ImageMagick's convert and animate:

# Generate "film" (create animated GIF):
convert lst_monthly_avg_film.00*.png lst_monthly_avg_2002_2012_zoom_film.gif

# play animation (delay 50millisec between frames, pause for 5 seconds at the end)
animate -delay 50 -pause 5 lst_monthly_avg_2002_2012_zoom_film.gif
Encode as animated PNG (MNG)
  • Using the ImageMagick "convert" encoder
  • View with ImageMagick's "display"
convert -delay 20 ganim_*.ppm ganim.mng
Encode as FLI
ls ganim_*.ppm > frames.txt
ppm2fli -g"${GRASS_WIDTH}x${GRASS_HEIGHT}" -O -s 15 frames.txt ganim.fli
\rm frames.txt
Encode as Flash
png2swf -o outfile.swf *.png -r 1
Encode as MPEG-4 Xvid
# doesn't like GRASS's PPMs, convert to PNG
for IMG in ganim*.ppm ; do
  pnmtopng $IMG > "`basename $IMG .ppm`.png"
done
mencoder "mf://ganim_*.png" -mf "type=png:fps=5" -o ganim.avi \
   -ovc "xvid" -xvidencopts "bitrate=1024"
\rm ganim_0*.png

Publish your cool videos in this Wiki

We have installed a Mediawiki widget extension and created a special template for including Youtube videos (Template:YouTube). See also wxGUI Modeler page for the usage.

The overall goal is to have many as possible GRASS GIS videos on YouTube