<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Brooks Andrus</title>
	<atom:link href="http://www.brooksandrus.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.brooksandrus.com/blog</link>
	<description>This is the blog of Brooks Andrus. Here, at irregular intervals, you may find digital noise centered around the activities of an early 21st century technologist. I work for TechSmith Corporation, but this web space and the views found on it are entirely my own.</description>
	<lastBuildDate>Sun, 14 Feb 2010 04:59:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>OSMF + Flex Example</title>
		<link>http://www.brooksandrus.com/blog/2010/02/10/osmf-flex-example/</link>
		<comments>http://www.brooksandrus.com/blog/2010/02/10/osmf-flex-example/#comments</comments>
		<pubDate>Wed, 10 Feb 2010 18:34:35 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[media]]></category>
		<category><![CDATA[osmf]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=1269</guid>
		<description><![CDATA[I&#8217;ve been checking up on OSMF (Open Source Media Framework) periodically, but found that many of their examples / samples don&#8217;t work at the moment (their APIs have been in flux). If you&#8217;re just looking for a quick way to get OSMF (v.9) up and running in Flex here&#8217;s a bit of code that should [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been checking up on <a href="http://www.opensourcemediaframework.com/">OSMF</a> (Open Source Media Framework) periodically, but found that many of their examples / samples don&#8217;t work at the moment (their APIs have been in flux). If you&#8217;re just looking for a quick way to get OSMF (v.9) up and running in Flex here&#8217;s a bit of code that should help.</p>
<p><span id="more-1269"></span></p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="mxml" style="font-family:monospace;"><span style="color: #000000;">&lt; ?xml version=<span style="color: #ff0000;">&quot;1.0&quot;</span> encoding=<span style="color: #ff0000;">&quot;utf-8&quot;</span>?<span style="color: #7400FF;">&gt;</span></span>
<span style="color: #000000;">&lt;mx :Application xmlns:mx=<span style="color: #ff0000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span style="color: #ff0000;">&quot;absolute&quot;</span> xmlns:containers=<span style="color: #ff0000;">&quot;org.osmf.containers.*&quot;</span> applicationComplete=<span style="color: #ff0000;">&quot;init();&quot;</span> xmlns:media=<span style="color: #ff0000;">&quot;org.osmf.media.*&quot;</span><span style="color: #7400FF;">&gt;</span></span>
&nbsp;
&nbsp;
&nbsp;
    <span style="color: #000000;">&lt;/mx<span style="color: #7400FF;">&gt;</span>&lt;mx :Script<span style="color: #7400FF;">&gt;</span></span>
        <span style="color: #000000;">&lt; !<span style="color: #66cc66;">&#91;</span>CDATA<span style="color: #66cc66;">&#91;</span></span>
<span style="color: #000000;">            import org.osmf.display.MediaPlayerSprite;</span>
<span style="color: #000000;">            import org.osmf.layout.LayoutUtils;</span>
&nbsp;
<span style="color: #000000;">            import org.osmf.containers.MediaContainer;</span>
<span style="color: #000000;">            import org.osmf.media.MediaElement;</span>
<span style="color: #000000;">            import org.osmf.media.MediaPlayer;</span>
<span style="color: #000000;">            import org.osmf.media.URLResource;</span>
<span style="color: #000000;">            import org.osmf.utils.URL;</span>
<span style="color: #000000;">            import org.osmf.video.VideoElement;</span>
<span style="color: #000000;">            import org.osmf.net.NetLoader;</span>
&nbsp;
<span style="color: #000000;">            import mx.core.UIComponent;</span>
&nbsp;
<span style="color: #000000;">            private static const REMOTE_PROGRESSIVE:String = <span style="color: #ff0000;">&quot;http://mediapm.edgesuite.net/strobe/content/test/AFaerysTale_sylviaApostol_640_500_short.flv&quot;</span>;</span>
&nbsp;
<span style="color: #000000;">            private var mediaElement:MediaElement;</span>
<span style="color: #000000;">            private var mediaPlayer:MediaPlayer;</span>
<span style="color: #000000;">            private var container:MediaContainer;</span>
&nbsp;
<span style="color: #000000;">            private function init<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:void</span>
<span style="color: #000000;">            <span style="color: #66cc66;">&#123;</span></span>
<span style="color: #000000;">                // set up some listeners for our buttons</span>
<span style="color: #000000;">                playBtn.addEventListener<span style="color: #66cc66;">&#40;</span> MouseEvent.CLICK, playHandler, false, <span style="color: #cc66cc;">0</span>, true <span style="color: #66cc66;">&#41;</span>;</span>
<span style="color: #000000;">                pauseBtn.addEventListener<span style="color: #66cc66;">&#40;</span> MouseEvent.CLICK, pauseHandler, false, <span style="color: #cc66cc;">0</span>, true <span style="color: #66cc66;">&#41;</span>;</span>
<span style="color: #000000;">                seekBtn.addEventListener<span style="color: #66cc66;">&#40;</span> MouseEvent.CLICK, seekHandler, false, <span style="color: #cc66cc;">0</span>, true <span style="color: #66cc66;">&#41;</span>;</span>
&nbsp;
<span style="color: #000000;">                // First create a MediaElement and load some media </span>
<span style="color: #000000;">                mediaElement = new VideoElement<span style="color: #66cc66;">&#40;</span> new NetLoader, new URLResource<span style="color: #66cc66;">&#40;</span> new URL<span style="color: #66cc66;">&#40;</span> REMOTE_PROGRESSIVE <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>;</span>
&nbsp;
<span style="color: #000000;">                // We need a DisplayObject for the video</span>
<span style="color: #000000;">                container = new MediaContainer<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; </span>
<span style="color: #000000;">                // feed the display object a media element</span>
<span style="color: #000000;">                container.addMediaElement<span style="color: #66cc66;">&#40;</span> mediaElement <span style="color: #66cc66;">&#41;</span>; </span>
<span style="color: #000000;">                // Flex requires a DisplayObject to be wrapped in Flex Framework UI Abstraction</span>
<span style="color: #000000;">                videoParent.addChild<span style="color: #66cc66;">&#40;</span> container <span style="color: #66cc66;">&#41;</span>; </span>
&nbsp;
<span style="color: #000000;">                // MediaPlayer is a virtual controller. Assign it a media element and it will autoplay the media by default.</span>
<span style="color: #000000;">                mediaPlayer = new MediaPlayer<span style="color: #66cc66;">&#40;</span> mediaElement <span style="color: #66cc66;">&#41;</span>;</span>
&nbsp;
<span style="color: #000000;">                // We will manually resize the MediaContainer just for kicks</span>
<span style="color: #000000;">                LayoutUtils.setAbsoluteLayout<span style="color: #66cc66;">&#40;</span> mediaElement.metadata, <span style="color: #cc66cc;">640</span>, <span style="color: #cc66cc;">360</span> <span style="color: #66cc66;">&#41;</span>; </span>
<span style="color: #000000;">            <span style="color: #66cc66;">&#125;</span></span>
&nbsp;
<span style="color: #000000;">            private function playHandler<span style="color: #66cc66;">&#40;</span> e:MouseEvent <span style="color: #66cc66;">&#41;</span>:void</span>
<span style="color: #000000;">            <span style="color: #66cc66;">&#123;</span></span>
<span style="color: #000000;">                if <span style="color: #66cc66;">&#40;</span> !mediaPlayer.playing <span style="color: #66cc66;">&#41;</span></span>
<span style="color: #000000;">                <span style="color: #66cc66;">&#123;</span></span>
<span style="color: #000000;">                    mediaPlayer.play<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</span>
<span style="color: #000000;">                <span style="color: #66cc66;">&#125;</span></span>
<span style="color: #000000;">            <span style="color: #66cc66;">&#125;</span></span>
&nbsp;
<span style="color: #000000;">            private function pauseHandler<span style="color: #66cc66;">&#40;</span> e:MouseEvent <span style="color: #66cc66;">&#41;</span>:void</span>
<span style="color: #000000;">            <span style="color: #66cc66;">&#123;</span></span>
<span style="color: #000000;">                if <span style="color: #66cc66;">&#40;</span> mediaPlayer.playing <span style="color: #66cc66;">&#41;</span></span>
<span style="color: #000000;">                <span style="color: #66cc66;">&#123;</span></span>
<span style="color: #000000;">                    mediaPlayer.pause<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</span>
<span style="color: #000000;">                <span style="color: #66cc66;">&#125;</span></span>
<span style="color: #000000;">            <span style="color: #66cc66;">&#125;</span></span>
&nbsp;
<span style="color: #000000;">            private function seekHandler<span style="color: #66cc66;">&#40;</span> e:MouseEvent <span style="color: #66cc66;">&#41;</span>:void</span>
<span style="color: #000000;">            <span style="color: #66cc66;">&#123;</span></span>
<span style="color: #000000;">                var val:Number =  parseFloat<span style="color: #66cc66;">&#40;</span> timeTxt.text <span style="color: #66cc66;">&#41;</span>;</span>
&nbsp;
<span style="color: #000000;">                mediaPlayer.seek<span style="color: #66cc66;">&#40;</span> val <span style="color: #66cc66;">&#41;</span>;</span>
<span style="color: #000000;">            <span style="color: #66cc66;">&#125;</span></span>
<span style="color: #000000;">        <span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span><span style="color: #7400FF;">&gt;</span></span>
    <span style="color: #000000;">&lt;/mx<span style="color: #7400FF;">&gt;</span></span>
    <span style="color: #000000;">&lt;mx :UIComponent id=<span style="color: #ff0000;">&quot;videoParent&quot;</span><span style="color: #7400FF;">/&gt;</span></span>
    <span style="color: #000000;">&lt;mx :Button x=<span style="color: #ff0000;">&quot;10&quot;</span> y=<span style="color: #ff0000;">&quot;400&quot;</span> label=<span style="color: #ff0000;">&quot;play&quot;</span> id=<span style="color: #ff0000;">&quot;playBtn&quot;</span><span style="color: #7400FF;">/&gt;</span></span>
    <span style="color: #000000;">&lt;mx :Button x=<span style="color: #ff0000;">&quot;72&quot;</span> y=<span style="color: #ff0000;">&quot;400&quot;</span> label=<span style="color: #ff0000;">&quot;pause&quot;</span> id=<span style="color: #ff0000;">&quot;pauseBtn&quot;</span><span style="color: #7400FF;">/&gt;</span></span>
    <span style="color: #000000;">&lt;mx :Button x=<span style="color: #ff0000;">&quot;145&quot;</span> y=<span style="color: #ff0000;">&quot;400&quot;</span> label=<span style="color: #ff0000;">&quot;seek&quot;</span> id=<span style="color: #ff0000;">&quot;seekBtn&quot;</span><span style="color: #7400FF;">/&gt;</span></span>
    <span style="color: #000000;">&lt;mx :TextInput x=<span style="color: #ff0000;">&quot;211&quot;</span> y=<span style="color: #ff0000;">&quot;400&quot;</span> width=<span style="color: #ff0000;">&quot;40&quot;</span> id=<span style="color: #ff0000;">&quot;timeTxt&quot;</span> text=<span style="color: #ff0000;">&quot;0&quot;</span> restrict=<span style="color: #ff0000;">&quot;0-9&quot;</span><span style="color: #7400FF;">/&gt;</span></span></pre></div></div>

<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2010/02/10/osmf-flex-example/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
<enclosure url="http://mediapm.edgesuite.net/strobe/content/test/AFaerysTale_sylviaApostol_640_500_short.flv" length="2660334" type="video/x-flv" />
		</item>
		<item>
		<title>Adobe After Effects: 3d Spotlights</title>
		<link>http://www.brooksandrus.com/blog/2010/01/20/adobe-after-effects-3d-spotlights/</link>
		<comments>http://www.brooksandrus.com/blog/2010/01/20/adobe-after-effects-3d-spotlights/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 21:17:53 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[After Effects]]></category>
		<category><![CDATA[Screencasting]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[3d]]></category>
		<category><![CDATA[art]]></category>
		<category><![CDATA[cinematography]]></category>
		<category><![CDATA[lighting]]></category>
		<category><![CDATA[screencasting as art]]></category>
		<category><![CDATA[spotlights]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=1206</guid>
		<description><![CDATA[One of the more frequent questions I&#8217;ve gotten as the result of the Screencasting as Art project is &#8220;how do you pull off those lighting effects.&#8221; It&#8217;s a valid question and one I wanted to do justice by. So here&#8217;s the latest cinematic screencast detailing how to create and manipulate 3d lights in Adobe After [...]]]></description>
			<content:encoded><![CDATA[<p>One of the more frequent questions I&#8217;ve gotten as the result of the <a href="http://www.brooksandrus.com/blog/2009/09/10/screencasting-as-art-exploring-cinematic-techniques/">Screencasting as Art</a> project is &#8220;how do you pull off those lighting effects.&#8221; It&#8217;s a valid question and one I wanted to do justice by. So here&#8217;s the latest cinematic screencast detailing how to create and manipulate 3d lights in Adobe After Effects. Along the way you&#8217;ll learn how to:</p>
<ul>
<li>Configure your After Effects workspace to handle working with elements in 3d space.</li>
<li>Manipulate the x, y, and z position of your lights.</li>
<li>Adjust cone angle, cone feather, light intensity and light color.</li>
<li>Animate the position and light properties.</li>
</ul>
<p>The video runs 7:05 &#8211; feedback welcome.</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_H8MpFdVDnUo&#038;hl=en_US&#038;fs=1&#038;hd=1_1735750483"
			class="flashmovie"
			width="640"
			height="385">
	<param name="movie" value="http://www.youtube.com/v/H8MpFdVDnUo&#038;hl=en_US&#038;fs=1&#038;hd=1" />
	<param name="allowscriptaccess" value="always" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.youtube.com/v/H8MpFdVDnUo&#038;hl=en_US&#038;fs=1&#038;hd=1"
			name="fm_H8MpFdVDnUo&#038;hl=en_US&#038;fs=1&#038;hd=1_1735750483"
			width="640"
			height="385">
		<param name="allowscriptaccess" value="always" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		
<p>    <!-- Begin Alternate Content --></p>
<p>
          <a href="http://adobe.com/go/getflashplayer"><br />
             <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /><br />
          </a><br />
          <a href="http://www.youtube.com/v/H8MpFdVDnUo&#038;hl=en_US&#038;fs=1">Download Video</a>
       </p>
<p>    <!-- End Alternate Content --></p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>Screencasting notes:</p>
<p>In this video, I again focused on narrative structure, pacing and humanizing the videos, but I paid special attention to making the production value of the talking head footage much higher. I once again relied on my trusty Flip Mino HD, but decided to try and frame things up a bit better and feed the Flip some light (the Flip really struggles in low lighting conditions). So after convincing Santa Claus (my wife Nancy) that I needed a soft box or two, I set up in front of a bare section of wall in my living room and filmed a couple of talking head segments off the cuff. They turned out well and, much to Nancy&#8217;s chagrin, have led me to set up shop in the living room permanently.  ;-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2010/01/20/adobe-after-effects-3d-spotlights/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Screencasting as Art: Humanize, Structure, Pace and Production Value</title>
		<link>http://www.brooksandrus.com/blog/2009/12/07/screencasting-as-art-humanize-structure-pace-and-production-value/</link>
		<comments>http://www.brooksandrus.com/blog/2009/12/07/screencasting-as-art-humanize-structure-pace-and-production-value/#comments</comments>
		<pubDate>Mon, 07 Dec 2009 18:33:20 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[After Effects]]></category>
		<category><![CDATA[Screencasting]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[preview]]></category>
		<category><![CDATA[real-time]]></category>
		<category><![CDATA[rendering]]></category>
		<category><![CDATA[screencast]]></category>
		<category><![CDATA[screencasting as art]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=1141</guid>
		<description><![CDATA[In the previous post we began exploring screencasting through a cinematic lens &#8211; how we can use lighting, framing, camera position, window matching, and cutaways to create visual interest and engage our viewers. This article builds on those techniques and begins to explore additional storytelling and cinematic concepts, such as:

Humanizing your video.
Using narrative structure.
The editor&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>In the <a href="http://www.brooksandrus.com/blog/2009/09/10/screencasting-as-art-exploring-cinematic-techniques/">previous post</a> we began exploring screencasting through a cinematic lens &#8211; how we can use lighting, framing, camera position, window matching, and cutaways to create visual interest and engage our viewers. This article builds on those techniques and begins to explore additional storytelling and cinematic concepts, such as:</p>
<ul>
<li>Humanizing your video.</li>
<li>Using narrative structure.</li>
<li>The editor&#8217;s role in pacing and its impact on audience attention.</li>
<li>Lifting production value with sophisticated bumpers / credits.</li>
</ul>
<p> As usual, we&#8217;ll begin with an exploratory screencast and then return to the article for a bit more color on the intent / techniques utilized. </p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_Y71yuHQk1ls&#038;hl=en_US&#038;fs=1&#038;hd=1_733214167"
			class="flashmovie"
			width="640"
			height="385">
	<param name="movie" value="http://www.youtube.com/v/Y71yuHQk1ls&#038;hl=en_US&#038;fs=1&#038;hd=1" />
	<param name="allowscriptaccess" value="always" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.youtube.com/v/Y71yuHQk1ls&#038;hl=en_US&#038;fs=1&#038;hd=1"
			name="fm_Y71yuHQk1ls&#038;hl=en_US&#038;fs=1&#038;hd=1_733214167"
			width="640"
			height="385">
		<param name="allowscriptaccess" value="always" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		
<p>    <!-- Begin Alternate Content --></p>
<p>
          <a href="http://adobe.com/go/getflashplayer"><br />
             <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /><br />
          </a><br />
          <a href="http://www.youtube.com/v/Y71yuHQk1ls&#038;hl=en_US&#038;fs=1&#038;hd=1">Download Video</a>
       </p>
<p>    <!-- End Alternate Content --></p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p></p>
<h1>Humanize</h1>
<p>Screen video alone is not enough. You need to humanize your content by getting in front of the camera and engaging your audience. And no, I&#8217;m not talking about long-winded monologues either. Several 5-7 second talking-head elements can go a long way toward winning over and maintaining the interest of your audience. Let people see your face and don&#8217;t be afraid to be emotive / loose.  Let them see the twinkle in your eyes and the smirk on your face.  As social creatures its how we empathize and bond with each other.</p>
<p>Viewers are most alert at the beginning and end of your screencast (true whether its a meeting, presentation, or screencast). In a recent webinar, noted presenter / storyteller <a href="http://www.agoodmanonline.com/publications/index.html">Andy Goodman</a> emphasized how important it is to take advantage of these naturally occurring periods of high focus. That&#8217;s why its critical to let viewers see your face and make a connection with you at the beginning of the screencast. It&#8217;s also why there&#8217;s a talking-head call to action at end of the screencast (during the closing credits segment).</p>
<h1>Structure</h1>
<p>Screencasts aren&#8217;t just raw data spewing out of an organic database. Make your screencasts accessible by breaking them down into logical elements that together accomplish the emotional, psychological and instructive goals of your narrative. Structure can help you engage your audience, build your brand, send your message, and motivate your viewers to take action. In this screencast, the structure &#8211; <em>intro, bumper, message, bumper</em> &#8211; was deliberately constructed to: <em>create rapport and pique viewer interest, establish credibility and build personal brand, teach software functionality, and build brand while motivating viewers to watch other screencasts</em>. </p>
<p>Making a connection with viewers, getting them to watch, and teaching them something they want to know are obviously the most important elements of this screencast. However, by thoughtfully utilizing structure we can add credibility, build brand, and make calls to action in such a way that they actually reinforce / enhance our top level goals. </p>
<h1>Pacing</h1>
<p>In the context of filmmaking, <a href="http://www.videomaker.com/article/9848/">pacing</a> is the speed or rate at which the narrative happens, transforms, or develops. It&#8217;s important to realize that pacing is more about the viewers sense of narrative speed rather than the actual speed of the event itself. Pacing, then, can be controlled by the rate at which you change what or how the audience is seeing. </p>
<p>In typical filmmaking, lots of &#8220;coverage&#8221; (extra footage) is shot from a variety of different angles and distances. This allows the editor to control how long any single shot is used by cutting to other views of the scene. This cutting can give a sense of activity and motion, or be used to create dramatic impact. All of these elements keep the viewer more interested in the scene than they would otherwise be if a single camera from a fixed position was used.</p>
<p>How does this all apply to this screencast you might ask? Good question. In order get good &#8220;coverage&#8221; I did two things: </p>
<ol>
<li>recorded the entire desktop</li>
<li>filmed all of the actual hand / keyboard interaction.</li>
</ol>
<p>Recording the entire desktop allowed me to create a versatile array of wide, medium and tight shots. If you notice, the majority of the shots are either zoomed in (medium / tight shots) or zoomed out (wide shots) from the actual recording dimensions (you aren&#8217;t limited to just selecting quadrants of the screen at 1:1 scale). Filming the hand / keyboard interactions allowed me to cutaway to an alternate view of the scene (the hands interacting with the keyboard). </p>
<p>In order to control pacing I alternated between wide, medium, tight, and keyboard cutaway shots every 2-8 seconds (2-5 seconds is the optimum range). This technique creates visual interest and lends speed to the narrative by changing the shot frequently. In effect, I never let the viewer&#8217;s eyes get bored by frequently changing what or how they are looking at the scene and I get to &#8220;weight&#8221; the importance / impact of each shot by the length of time the shot is on the screen.</p>
<h1>Production Value</h1>
<p><a href="http://en.wiktionary.org/wiki/production_value">Production value</a>: <em>A method, material, or stagecraft skill used in the production of a motion picture or artistic performance; the technical quality of such a method, material, or skill</em>.</p>
<p>One of the simplest ways to improve the production value of a screencast is to use sophisticated bumpers and closing credits. The quality of these segments affects the perceived value of the enclosed content, reinforces the message, helps establish your credibility as an expert, and, as an added bonus, can help you define your personal brand. </p>
<p>Remember, you&#8217;re not just presenting static information. You&#8217;re selling it. You&#8217;re selling your authority as a subject matter expert. You&#8217;re selling the quality of the content the audience is about to watch. And, all the while, you&#8217;re establishing a style and building your image / brand. </p>
<p>High production values set your screencasts apart and give your audience another reason to believe in their investment in you. At the beginning of a screencast you&#8217;re looking to make your audience believe they should invest their time. At the end, you want to reinforce that the message they just heard was special and significant. Use these elements wisely and you can make all that effort expended recording, editing and compositing worth it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/12/07/screencasting-as-art-humanize-structure-pace-and-production-value/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Screencasting as Art: Exploring Cinematic Techniques</title>
		<link>http://www.brooksandrus.com/blog/2009/09/10/screencasting-as-art-exploring-cinematic-techniques/</link>
		<comments>http://www.brooksandrus.com/blog/2009/09/10/screencasting-as-art-exploring-cinematic-techniques/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 19:41:58 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[Screencasting]]></category>
		<category><![CDATA[After Effects]]></category>
		<category><![CDATA[art]]></category>
		<category><![CDATA[cinematography]]></category>
		<category><![CDATA[learning theory]]></category>
		<category><![CDATA[screencasting as art]]></category>
		<category><![CDATA[text on a path]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[visual literacy]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=1086</guid>
		<description><![CDATA[Screencasting has a problem&#8211;it hasn&#8217;t evolved all that much over the 10 years or so since its inception. We still record the computer screen from a stationary position (dead centered) and we still present this flat, banal presentation to users sitting at their computers, which in and of itself presents problems (you&#8217;re looking at a [...]]]></description>
			<content:encoded><![CDATA[<p>Screencasting has a problem&#8211;it hasn&#8217;t evolved all that much over the 10 years or so since its inception. We still record the computer screen from a stationary position (dead centered) and we still present this flat, banal presentation to users sitting at their computers, which in and of itself presents problems (you&#8217;re looking at a computer screen on a computer screen&#8211;where does one end and the other begin).</p>
<p> It&#8217;s interesting to note that filmmaking itself started out on this same path by merely recording theatre productions from a stationary position in the audience. Viewers were presented with an an unmoving, uninteresting wide shot from a stationary position in the theatre. Fortunately for us, filmmakers quickly realized that this wasn&#8217;t all that interesting for viewers or themselves and thus began the art and science of cinematography.</p>
<blockquote><p><strong><em>cinematography</em></strong> &#8211; the art of making motion pictures, or as <a href="http://www.amazon.com/exec/obidos/ASIN/0240805003/qid=1035175466/sr=2-3/ref=sr_2_3/104-6288686-5779907">Blaine Brown</a> says, &#8220;from the Greek roots meaning, &#8216;writing with motion.&#8217;&#8221;</p></blockquote>
<p>In light of the parallels between early filmmaking and screencasting today I&#8217;ve begun to explore screencasting as an art form. How can we make screencasts more engaging? What can we learn from the masters of visual literacy, cinematographers, about pacing, depth, emotion and visual narrative? These sorts of questions are important to explore if we want people to engage with, learn from and, dare I say, enjoy our screencasts. That&#8217;s the mindset I think we need to establish for screencasting. We&#8217;re not just recording the screen, we&#8217;re telling a story and there is a well established historical record of the art and science behind motion picture narratives.  </p>
<p>The screencast below, a tutorial on creating animated text-on-a-path in Adobe After Effects,  is an early effort to explore this verdant terrain. After watching the video read on for an explanation of the some of the techniques used and the artistic intent behind them.</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_rmV5BFJm7qw&#038;hl=en_US&#038;fs=1&#038;hd=1_845286038"
			class="flashmovie"
			width="640"
			height="385">
	<param name="movie" value="http://www.youtube.com/v/rmV5BFJm7qw&#038;hl=en_US&#038;fs=1&#038;hd=1" />
	<param name="allowscriptaccess" value="always" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.youtube.com/v/rmV5BFJm7qw&#038;hl=en_US&#038;fs=1&#038;hd=1"
			name="fm_rmV5BFJm7qw&#038;hl=en_US&#038;fs=1&#038;hd=1_845286038"
			width="640"
			height="385">
		<param name="allowscriptaccess" value="always" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		
<p>    <!-- Begin Alternate Content --></p>
<p>
          <a href="http://adobe.com/go/getflashplayer"><br />
             <img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /><br />
          </a><br />
          <a href="http://www.youtube.com/v/rmV5BFJm7qw&#038;hl=en_US&#038;fs=1&#038;hd=1">Download Video</a>
       </p>
<p>    <!-- End Alternate Content --></p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p></p>
<p><strong>Cartoon effect</strong>. This effect is one part pure stylization, one part psychological effect on presenter and one part impact on the viewer. The latter two are the more interesting concepts, so I&#8217;ll try to break them down a bit more. </p>
<p>First, we know that many people are very uncomfortable with the sound of their own voice or with seeing themselves on screen and yet one of the best opportunities they have for connecting with their audience is to directly engage them in front of the camera. The cartoon effect (one of many that should be experimented with) takes some of the edge off of the presenter and diminishes the realism of the shot which is strangely reassuring to the presenter. For instance, while looking at the original footage I was super focused on how fat my face was, how pasty white I looked and how the lighting was too intense. After applying the cartoon effect I felt more comfortable with &#8220;me&#8221; being on the screen. This isn&#8217;t unique to regular schmoes like me, A-list hollywood stars often insist on being shot with filters / lighting that softens the skin&#8211;a less realistic viewpoint they&#8217;re comfortable with putting on the screen.</p>
<p>It seems likely that the viewer will more quickly identify with the cartoon effect as well. In fact, I&#8217;m just echoing concepts Scott McCloud puts forward in <a href="http://www.amazon.com/Understanding-Comics-Invisible-Scott-Mccloud/dp/006097625X">Understanding Comics: The Invisible Art</a>. McCloud argues that cartoons are very basic depictions of people (lacking realism) that are much closer to the representation of self we carry around in our heads. Our ultra powerful brains immediately latch onto this representation allowing us to more closely identify with comic book characters. This engagement in turn makes the narrative more compelling. So the comic effect can help presenters be more comfortable and allows viewers to more closely identify with the presenter. Food for thought.</p>
<p><img src="http://www.brooksandrus.com/images/cartoon_effect.jpg" alt="cartoon effect" /></p>
<p><strong>Establishing shot</strong>. Usually a wide or medium shot (sometimes a sequence of wide, medium, tight) that sets the scene and provides context (i.e. this screencast is taking place on a mac laptop at my desk). Notice I used the establishing shot during the intro and immediately after the headshot. There&#8217;s continuity there&#8211;I&#8217;m making sure the viewer doesn&#8217;t have to think about where they are, or how they got there.</p>
<p><img src="http://www.brooksandrus.com/images/establishing_shot.jpg" alt="establishing shot" /></p>
<p><strong>Window matching / door matching</strong> (a cheat technique that assists continuity) is also used. Observe that when we zoom-in to the computer on the desk the office establishing shot fades away, but the desktop remains framed around the edges with what looks like a macbook pro aluminum case. As we move from point of view  to point of view this frame is visible if the edge of the desktop is visible. In film this technique would be called window matching or door matching. For example, establishing shots are often shot on location (a person at a window is shot outside from street level). However, the film will immediately cut to the interior of the building where the character is&#8211;this is typically shot on a sound stage and so they recreate the window or door (or enough to fake it) seen in the previous shot. This provides continuity&#8211;the viewer doesn&#8217;t have to step back from the narrative to try and figure out where they are. We&#8217;re doing the same thing with the pseudo aluminum edges&#8211;whenever the edge of the screen is in view we give the viewer subtle reassurance about where they are rather than just dropping off into black filmspace.  </p>
<p><img src="http://www.brooksandrus.com/images/window_matching.jpg" alt="window matching / door matching" /></p>
<p><strong>Lighting</strong>. First off, the ambient light of all the screen footage is dropped way down. This of course has some impact on the feel of the piece. We want the viewer to feel like they&#8217;re watching something special and so ambient light becomes important (restaurants having been using this technique for ages). It also allows the spot lighting to work just as it does in a darkened photo studio or at a theatre performance. Think about how the lighting at a theatre impacts your attention and immersion&#8211;we&#8217;re trying to replicate that feel. Spot lighting is then used to focus the attention of the viewer and provide stylistic shadows. On a side note look at how <a href="http://www.hulu.com/">Hulu</a> allows you to dim the lights for the entire site&#8211;yep details like this matter&#8230;a lot.</p>
<p><img src="http://www.brooksandrus.com/images/spot_camera.jpg" alt="spot lighting and camera perspective" /></p>
<p><strong>Depth</strong>. Camera angle, framing and lighting are the key elements here. Much of the art and responsibility of the filmmaker is in trying to create, or recreate, 3d in a 2d space. We need to create something that&#8217;s visually interesting if we&#8217;re going to hold our viewers attention. If its a flat representation of a computer desktop that&#8217;s being watched on a computer desktop there&#8217;s nothing there to pull me into the narrative. Remember, we&#8217;re trying to help the viewer engage with the story which means we need to give their brains and eyes a reason to pay attention (there&#8217;s actually quite a bit of learning theory behind this concept). All this leads us to an understanding that we need to add depth. That&#8217;s why perspective is used on every single shot in this piece. Combine perspective (camera angle) with lighting and you start feeling like you&#8217;re not just looking at a flat 2d screen&#8211;you&#8217;re looking at something with depth, something interesting, something that makes your brain sit up and pay attention.</p>
<p><strong>Framing</strong> (what is visible in the viewfinder and therefore the screen). This contributes to depth especially when combined with changing camera point of view. In fact, using wide, medium and tight shots has long been one of the most important narrative tools in the filmmaker&#8217;s bag of tricks. What you see in the frame can give you context, tell you what&#8217;s important and set the emotional tone. It&#8217;s normal to see today&#8217;s filmmakers change camera point of view and framing every three to five seconds unless there&#8217;s a very good reason to stay longer with a shot (a compelling narrative, a climax or emotional scene). Changing point of view and altering framing creates visual interest and can have dramatic impact on the pacing of the story (something hugely important for screencasts). It prevents us from getting bored and moving our eyes and brains on to something that&#8217;s more interesting. </p>
<p><strong>Close-ups</strong> have a huge impact as well. We aren&#8217;t used to seeing the person (substitute application, window or screen area) this close&#8211;it&#8217;s a powerful signal to the brain that it should sit up and pay attention. <a href="http://en.wikipedia.org/wiki/Alfred_Hitchcock">Hitchcock</a> had a rule of thumb that the objects on the screen should fill the frame relative to their importance to the narrative. This is a pretty good guideline for how wide or how close you should be on a particular element (much of the time you just want to be medium to tight). This goes hand in hand with the old photographers saw that for most shots you should, &#8220;first get close, then move closer still.&#8221; Our brains pay attention to close-ups and are remarkably good at sewing together context if medium or wide shots are thrown in occasionally.</p>
<p><img src="http://www.brooksandrus.com/images/close-up.jpg" alt="close-up" /></p>
<p><strong>Cutaways</strong>. In this piece, keyboard shortcuts are cutaway shots. You might think this would break continuity, but the shots actually show the action being described on screen and often the keys being pressed are synched to the audio recording of the keyboard. It takes less time to cutaway to the actual keyboard shortcut action than it would to display a message that the viewer would need to read and interpret. The very act of forcing the viewer to read a keyboard shortcut takes them out of the visual narrative whereas showing them the action via cutaway is an effective cinematic storytelling technique. In this case the first cutaway is actually poorly executed (the camera is moving enough to distract you), but the subsequent cutaways were filmed on a jerry-rigged tripod keeping the shot still (that&#8217;s what allowed us to move in and out of the cutaway very effectively).</p>
<p><img src="http://www.brooksandrus.com/images/cutaway.jpg" alt="cutaway" /></p>
<p>Bumpers. We&#8217;ve become culturally conditioned to seeing cool titling and motion graphics on the front and back of video. The point is, bumpers suck unless they are, again, visually interesting or entertaining. There&#8217;s a huge opportunity to really work on creating cool bumpers viewers will watch that build your personal or corporate brand.</p>
<p>Whew, you made it through this deep dive into screencasting as art. I hope you enjoyed it, and maybe even learned a little something. If you have feedback, comments, insights or artistic quibbles please feel free to rage away in the comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/09/10/screencasting-as-art-exploring-cinematic-techniques/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
<enclosure url="http://www.brooksandrus.com/media/animated_text_on_path_fc_hd.mp4" length="82824504" type="video/mp4" />
		</item>
		<item>
		<title>Animating Text on a Path in Adobe After Effects</title>
		<link>http://www.brooksandrus.com/blog/2009/09/10/animating-text-on-a-path-in-adobe-after-effects/</link>
		<comments>http://www.brooksandrus.com/blog/2009/09/10/animating-text-on-a-path-in-adobe-after-effects/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 19:40:04 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[After Effects]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[screencast]]></category>
		<category><![CDATA[text on a path]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=1112</guid>
		<description><![CDATA[
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_yamp_1678743346"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/yamp.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/animated_text_on_path_fc_hd.mp4&amp;thumb=http://www.brooksandrus.com/media/animated_text_on_path_fc_hd.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=true&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/yamp.swf"
			name="fm_yamp_1678743346"
			width="640"
			height="360">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/animated_text_on_path_fc_hd.mp4&amp;thumb=http://www.brooksandrus.com/media/animated_text_on_path_fc_hd.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=true&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		

Download video.

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
]]></description>
			<content:encoded><![CDATA[
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_yamp_715356343"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/yamp.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/animated_text_on_path_fc_hd.mp4&amp;thumb=http://www.brooksandrus.com/media/animated_text_on_path_fc_hd.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=true&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/yamp.swf"
			name="fm_yamp_715356343"
			width="640"
			height="360">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/animated_text_on_path_fc_hd.mp4&amp;thumb=http://www.brooksandrus.com/media/animated_text_on_path_fc_hd.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=true&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
<p><a href="http://www.brooksandrus.com/media/animated_text_on_path_fc_hd.mp4">Download</a> video.</p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/09/10/animating-text-on-a-path-in-adobe-after-effects/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://www.brooksandrus.com/media/animated_text_on_path_fc_hd.mp4" length="82824504" type="video/mp4" />
		</item>
		<item>
		<title>Retouching Photos With Lightroom&#8217;s Brush Tool</title>
		<link>http://www.brooksandrus.com/blog/2009/07/29/retouching-photos-with-lightrooms-brush-tool/</link>
		<comments>http://www.brooksandrus.com/blog/2009/07/29/retouching-photos-with-lightrooms-brush-tool/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 18:18:26 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[Lightroom]]></category>
		<category><![CDATA[brush]]></category>
		<category><![CDATA[retouch]]></category>
		<category><![CDATA[screencast]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=1080</guid>
		<description><![CDATA[Lightroom&#8217;s brush is an awesome tool that can be used to add stunning visual effects to your composition. Use the brush tool to blur out skyscapes, enrich or change color tones of individual objects, overcome backlighting and much more. The video below explores several techniques for changing the exposure, softening the skin and altering the [...]]]></description>
			<content:encoded><![CDATA[<p>Lightroom&#8217;s brush is an awesome tool that can be used to add stunning visual effects to your composition. Use the brush tool to blur out skyscapes, enrich or change color tones of individual objects, overcome backlighting and much more. The video below explores several techniques for changing the exposure, softening the skin and altering the color characteristics of a single person.</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_yamp_2112913559"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/yamp.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/lightroom_retouch_brush.mp4&amp;thumb=http://www.brooksandrus.com/media/lightroom_retouch_brush.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=true&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/yamp.swf"
			name="fm_yamp_2112913559"
			width="640"
			height="360">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/lightroom_retouch_brush.mp4&amp;thumb=http://www.brooksandrus.com/media/lightroom_retouch_brush.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=true&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
<p><a href="http://www.brooksandrus.com/media/lightroom_retouch_brush.mp4">Download</a> video.</p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/07/29/retouching-photos-with-lightrooms-brush-tool/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://www.brooksandrus.com/media/lightroom_retouch_brush.mp4" length="26379459" type="video/mp4" />
		</item>
		<item>
		<title>Canadian Invasion Brings Michigan to a Standstill</title>
		<link>http://www.brooksandrus.com/blog/2009/06/22/canadian-invasion-brings-michigan-to-a-standstill/</link>
		<comments>http://www.brooksandrus.com/blog/2009/06/22/canadian-invasion-brings-michigan-to-a-standstill/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 13:29:22 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[geese]]></category>
		<category><![CDATA[humor]]></category>
		<category><![CDATA[michigan]]></category>
		<category><![CDATA[tourism]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=1070</guid>
		<description><![CDATA[Here in Michigan we spend our summers battling Canadian tourists:

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_yamp_54816760"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/yamp.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/canadian_invasion.mp4&amp;thumb=http://www.brooksandrus.com/media/canadian_invasion.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/yamp.swf"
			name="fm_yamp_54816760"
			width="640"
			height="360">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/canadian_invasion.mp4&amp;thumb=http://www.brooksandrus.com/media/canadian_invasion.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		

Download video.

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
]]></description>
			<content:encoded><![CDATA[<p>Here in Michigan we spend our summers battling Canadian tourists:</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_yamp_1047034144"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/yamp.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/canadian_invasion.mp4&amp;thumb=http://www.brooksandrus.com/media/canadian_invasion.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/yamp.swf"
			name="fm_yamp_1047034144"
			width="640"
			height="360">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/canadian_invasion.mp4&amp;thumb=http://www.brooksandrus.com/media/canadian_invasion.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
<p><a href="http://www.brooksandrus.com/media/canadian_invasion.mp4">Download</a> video.</p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/06/22/canadian-invasion-brings-michigan-to-a-standstill/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
<enclosure url="http://www.brooksandrus.com/media/canadian_invasion.mp4" length="2433216" type="video/mp4" />
		</item>
		<item>
		<title>Going HD with Jing Pro and YouTube</title>
		<link>http://www.brooksandrus.com/blog/2009/06/16/going-hd-with-jing-pro-and-youtube/</link>
		<comments>http://www.brooksandrus.com/blog/2009/06/16/going-hd-with-jing-pro-and-youtube/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 17:20:29 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[Jing]]></category>
		<category><![CDATA[hd]]></category>
		<category><![CDATA[Screencasting]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=1060</guid>
		<description><![CDATA[YouTube has made huge improvements over the last 6 months that finally make it an awesome one-to-many delivery platform for screen video. The video below (shared via the Jing blog) shows how to use Jing Pro to deliver high quality HD screencasts on YouTube. It&#8217;s also a great opportunity to see just how far I&#8217;ll [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.youtube.com/">YouTube</a> has made huge improvements over the last 6 months that finally make it an awesome one-to-many delivery platform for screen video. The video below (shared via the <a href="http://blog.jingproject.com/2009/06/jing-pro-hd-video-on-youtube-d.html">Jing blog</a>) shows how to use<a href="http://www.jingproject.com/pro/"> Jing Pro</a> to deliver high quality HD screencasts on YouTube. It&#8217;s also a great opportunity to see just how far I&#8217;ll stoop (intro shows me in curlers) to get a giggle.</p>
<p>Go fullscreen <img class="jing-fullscreen-icon" src="http://www.brooksandrus.com/media/jing_fullscreen_icon.png" alt="fullscreen icon" /> to see the video in 720p High Definition.</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_player_201257024"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/player.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/jingtubehd.mp4&amp;thumb=http://www.brooksandrus.com/media/jingtubehd.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=false&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/player.swf"
			name="fm_player_201257024"
			width="640"
			height="360">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/jingtubehd.mp4&amp;thumb=http://www.brooksandrus.com/media/jingtubehd.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=false&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
<p><a href="http://www.brooksandrus.com/media/jingtubehd.mp4">Download</a> video.</p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>It&#8217;s that easy&#8211;time for y&#8217;all to get Jing Pro and set up a screencasting channel for your favorite piece of software or dev project!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/06/16/going-hd-with-jing-pro-and-youtube/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
<enclosure url="http://www.brooksandrus.com/media/jingtubehd.mp4" length="55983198" type="video/mp4" />
		</item>
		<item>
		<title>Cross-Domain Runtime Shared Libraries (RSL)</title>
		<link>http://www.brooksandrus.com/blog/2009/05/21/cross-domain-runtime-shared-libraries-rsl/</link>
		<comments>http://www.brooksandrus.com/blog/2009/05/21/cross-domain-runtime-shared-libraries-rsl/#comments</comments>
		<pubDate>Thu, 21 May 2009 19:00:59 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[rsl]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=1057</guid>
		<description><![CDATA[Chase Brammer shows how to create ActionScript 3 cross-domain RSLs during his session at 360&#124;Flex in Indianapolis (just over 5 minutes).

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_yamp_1477172375"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/yamp.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/crossdomain_rsl_master.mp4&amp;thumb=http://www.brooksandrus.com/media/crossdomain_rsl_master2.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/yamp.swf"
			name="fm_yamp_1477172375"
			width="640"
			height="360">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/crossdomain_rsl_master.mp4&amp;thumb=http://www.brooksandrus.com/media/crossdomain_rsl_master2.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		

Download video.

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
]]></description>
			<content:encoded><![CDATA[<p><a href="http://chasebrammer.com/">Chase Brammer</a> shows how to create ActionScript 3 cross-domain RSLs during his session at 360|Flex in Indianapolis (just over 5 minutes).</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_yamp_37670450"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/yamp.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/crossdomain_rsl_master.mp4&amp;thumb=http://www.brooksandrus.com/media/crossdomain_rsl_master2.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/yamp.swf"
			name="fm_yamp_37670450"
			width="640"
			height="360">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/crossdomain_rsl_master.mp4&amp;thumb=http://www.brooksandrus.com/media/crossdomain_rsl_master2.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
<p><a href="http://www.brooksandrus.com/media/crossdomain_rsl_master.mp4">Download</a> video.</p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/05/21/cross-domain-runtime-shared-libraries-rsl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://www.brooksandrus.com/media/crossdomain_rsl_master.mp4" length="37765347" type="video/mp4" />
		</item>
		<item>
		<title>Optimize Runtime Shared Libraries (RSL)</title>
		<link>http://www.brooksandrus.com/blog/2009/05/21/optimize-runtime-shared-libraries-rsl/</link>
		<comments>http://www.brooksandrus.com/blog/2009/05/21/optimize-runtime-shared-libraries-rsl/#comments</comments>
		<pubDate>Thu, 21 May 2009 18:47:56 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[rsl]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=1053</guid>
		<description><![CDATA[Chase Brammer shows how to optimize ActionScript 3 Runtime Shared Libraries during his session at 360&#124;Flex in Indianapolis (just under 3 minutes).

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_yamp_1664985105"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/yamp.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/optimize_rsl_master.mp4&amp;thumb=http://www.brooksandrus.com/media/optimize_rsl_master2.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/yamp.swf"
			name="fm_yamp_1664985105"
			width="640"
			height="360">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/optimize_rsl_master.mp4&amp;thumb=http://www.brooksandrus.com/media/optimize_rsl_master2.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		

Download video.

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
]]></description>
			<content:encoded><![CDATA[<p><a href="http://chasebrammer.com/">Chase Brammer</a> shows how to optimize ActionScript 3 Runtime Shared Libraries during his session at 360|Flex in Indianapolis (just under 3 minutes).</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_yamp_1969854307"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/yamp.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/optimize_rsl_master.mp4&amp;thumb=http://www.brooksandrus.com/media/optimize_rsl_master2.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/yamp.swf"
			name="fm_yamp_1969854307"
			width="640"
			height="360">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/optimize_rsl_master.mp4&amp;thumb=http://www.brooksandrus.com/media/optimize_rsl_master2.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360&amp;uselargecontrols=false" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
<p><a href="http://www.brooksandrus.com/media/optimize_rsl_master.mp4">Download</a> video.</p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/05/21/optimize-runtime-shared-libraries-rsl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://www.brooksandrus.com/media/optimize_rsl_master.mp4" length="18924230" type="video/mp4" />
		</item>
		<item>
		<title>The Bacon Chronicles: Drawing A Crowd With Bacon Lollipops</title>
		<link>http://www.brooksandrus.com/blog/2009/05/18/the-bacon-chronicles-drawing-a-crowd-with-bacon-lollipops/</link>
		<comments>http://www.brooksandrus.com/blog/2009/05/18/the-bacon-chronicles-drawing-a-crowd-with-bacon-lollipops/#comments</comments>
		<pubDate>Mon, 18 May 2009 18:45:52 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Misc]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[bacon]]></category>
		<category><![CDATA[flex360]]></category>
		<category><![CDATA[techsmith]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=1050</guid>
		<description><![CDATA[I don&#8217;t get the bacon craze, but its descended to new lows. From the TechSmith tent at the local carnival we offer up maple-bacon lollipops for your viewing (and eating) pleasure:

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_player_1621101005"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/player.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/bacon_lollipops.mp4&amp;thumb=http://www.brooksandrus.com/media/bacon_lollipops.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=false&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/player.swf"
			name="fm_player_1621101005"
			width="640"
			height="360">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/bacon_lollipops.mp4&amp;thumb=http://www.brooksandrus.com/media/bacon_lollipops.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=false&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		

Download video.

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
If you&#8217;re [...]]]></description>
			<content:encoded><![CDATA[<p>I don&#8217;t get the bacon craze, but its descended to new lows. From the TechSmith tent at the local carnival we offer up <a href="http://www.lollyphile.com/maple-bacon.php">maple-bacon lollipops</a> for your viewing (and eating) pleasure:</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_player_2065683901"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/player.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/bacon_lollipops.mp4&amp;thumb=http://www.brooksandrus.com/media/bacon_lollipops.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=false&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/player.swf"
			name="fm_player_2065683901"
			width="640"
			height="360">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/bacon_lollipops.mp4&amp;thumb=http://www.brooksandrus.com/media/bacon_lollipops.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=false&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
<p><a href="http://www.brooksandrus.com/media/bacon_lollipops.mp4">Download</a> video.</p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>If you&#8217;re feeling your inner freak coming on stop by the 360Flex TechSmith booth for some organic, cured pork embedded in a salty maple hard candy; on a stick.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/05/18/the-bacon-chronicles-drawing-a-crowd-with-bacon-lollipops/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
<enclosure url="http://www.brooksandrus.com/media/bacon_lollipops.mp4" length="8486370" type="video/mp4" />
		</item>
		<item>
		<title>360Flex Road Trip Begins</title>
		<link>http://www.brooksandrus.com/blog/2009/05/18/flex-360-road-trip-begins/</link>
		<comments>http://www.brooksandrus.com/blog/2009/05/18/flex-360-road-trip-begins/#comments</comments>
		<pubDate>Mon, 18 May 2009 07:10:12 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[roadtrip]]></category>
		<category><![CDATA[techsmith]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=1041</guid>
		<description><![CDATA[For the 4th year in a row Betsy Weber, TechSmith&#8217;s Chief Evangelist, and I are on a spring road trip to visit the Flash community. I picked up a Flip Mino HD a couple of weeks back which means a real stab at some seriously rich lifestreaming&#8230;
The journey begins:

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_player_616624858"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/player.swf" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/player.swf"
			name="fm_player_616624858"
			width="640"
			height="360">
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		]]></description>
			<content:encoded><![CDATA[<p>For the 4th year in a row Betsy Weber, TechSmith&#8217;s Chief Evangelist, and I are on a spring road trip to visit the Flash community. I picked up a Flip Mino HD a couple of weeks back which means a real stab at some seriously rich lifestreaming&#8230;</p>
<p>The journey begins:</p>
<p>[kml_flashembed targetclass="flashmovie" publishmethod="static" movie="http://www.brooksandrus.com/media/player.swf" width="640" height="360" allowfullscreen="true" fversion="9.0.115" fvars="content=http://www.brooksandrus.com/media/flex_360_roadtrip_begins.mp4 ; thumb=http://www.brooksandrus.com/media/flex_360_roadtrip_begins.jpg ; windowbox=true ; analytics=UA-6435642-1 ; showbranding=false ; showendscreen=false ; containerwidth=640 ; containerheight=360"]
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
<p><a href="http://www.brooksandrus.com/media/flex_360_roadtrip_begins.mp4">Download</a> video.</p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>Fast forward to our arrival in Indianapolis 4 hours later and I got a quick chance to ask Betsy and Nick why we were there:</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_player_1090076402"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/player.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/why_360.mp4&amp;thumb=http://www.brooksandrus.com/media/why360.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=false&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/player.swf"
			name="fm_player_1090076402"
			width="640"
			height="360">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/why_360.mp4&amp;thumb=http://www.brooksandrus.com/media/why360.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=false&amp;showendscreen=false&amp;containerwidth=640&amp;containerheight=360" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
<p><a href="http://www.brooksandrus.com/media/why_360.mp4">Download</a> video.</p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>The keynote is at 8:30 AM (just over 5 hours from now as I type). I&#8217;ll update as possible.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/05/18/flex-360-road-trip-begins/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
<enclosure url="http://www.brooksandrus.com/media/flex_360_roadtrip_begins.mp4" length="2921153" type="video/mp4" />
<enclosure url="http://www.brooksandrus.com/media/why_360.mp4" length="14379986" type="video/mp4" />
		</item>
		<item>
		<title>Getting Down and Dirty with XMP and AS3</title>
		<link>http://www.brooksandrus.com/blog/2009/04/13/getting-down-and-dirty-with-xmp-and-as3/</link>
		<comments>http://www.brooksandrus.com/blog/2009/04/13/getting-down-and-dirty-with-xmp-and-as3/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 06:10:05 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[media]]></category>
		<category><![CDATA[metadata]]></category>
		<category><![CDATA[xmp]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=1001</guid>
		<description><![CDATA[One of the best ways to get started using XMP is to take a look at how Adobe is using it to embed speech-to-text data inside video files using Adobe Premiere.
As Flash Platform devs, the easiest way to get access to the XMP data in a video file created by Adobe Premiere is to make [...]]]></description>
			<content:encoded><![CDATA[<p>One of the best ways to get started using <a href="http://www.adobe.com/products/xmp/">XMP</a> is to take a look at how Adobe is using it to <a href="http://www.brooksandrus.com/blog/2008/11/16/the-xmp-revolution-is-here/">embed speech-to-text data</a> inside video files using Adobe Premiere.</p>
<p>As Flash Platform devs, the easiest way to get access to the XMP data in a video file created by Adobe Premiere is to make sure you handle the onXMPData callback that NetStream fires (Flash Player 10 only). One way to do this is by extending NetStream and adding a callback handler method that looks like this:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// callback handler inside a NetStream subclass dispatches a custom event that  </span>
<span style="color: #808080; font-style: italic;">// forwards the xmp data found in the callback handler</span>
<span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> onXMPData<span style="color: #66cc66;">&#40;</span> info:<span style="color: #0066CC;">Object</span> <span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
<span style="color: #66cc66;">&#123;</span>
	dispatchEvent<span style="color: #66cc66;">&#40;</span> <span style="color: #000000; font-weight: bold;">new</span> XMPEvent<span style="color: #66cc66;">&#40;</span> XMPEvent.<span style="color: #006600;">XMP_STRING</span>, info.<span style="color: #0066CC;">data</span>, <span style="color: #000000; font-weight: bold;">true</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>; 
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p></code></p>
<p>Next you need to make sure you&#8217;re listening for the XMPEvent, then load the MPEG-4 AVC / F4V / FLV media:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">// pseudo code</span>
<span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">video</span>:<span style="color: #0066CC;">NetStream</span> = <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #0066CC;">NetStream</span><span style="color: #66cc66;">&#40;</span> connection <span style="color: #66cc66;">&#41;</span>;
<span style="color: #0066CC;">video</span>.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span> XMPEvent.<span style="color: #006600;">XMP_STRING</span>, xmpHandler, <span style="color: #000000; font-weight: bold;">false</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #000000; font-weight: bold;">true</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #0066CC;">video</span>.<span style="color: #0066CC;">play</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;h264_captions.f4v&quot;</span> <span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p></code></p>
<p>Now its time to see what XMP looks like. We&#8217;ll use the <a href="http://labs.adobe.com/technologies/xmplibrary/">AS3 XMP library</a> that Adobe has up on labs:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> xmpHandler<span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">e</span>:XMPEvent <span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
<span style="color: #66cc66;">&#123;</span>
	<span style="color: #808080; font-style: italic;">// XMPMeta is root data structure for xmp data. Pass in the xmp data</span>
	<span style="color: #808080; font-style: italic;">// we received from the NetStream callback</span>
	<span style="color: #000000; font-weight: bold;">var</span> xmp:XMPMeta = <span style="color: #000000; font-weight: bold;">new</span> XMPMeta<span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">e</span>.<span style="color: #006600;">xmp</span> <span style="color: #66cc66;">&#41;</span>;
&nbsp;
	 <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">xml</span>:<span style="color: #0066CC;">XML</span> = xmp.<span style="color: #006600;">serializeToXML</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
	 <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">xml</span>.<span style="color: #006600;">toXMLString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p></code></p>
<p>The output of the previous trace should look something like this (full example xml available <a href="http://www.brooksandrus.com/resources/xmp.xml">here</a>):</p>
<p><img src="http://www.brooksandrus.com/jing2/xmp_sample.png" alt="XMP sample" /></p>
<p>As you can see in the example above the much of the XMP information is stored in the <a href="www.adobe.com/devnet/xmp/pdfs/XMPSpecificationPart2.pdf">Adobe Dynamic Media schema</a> that uses the xmpDM namespace.</p>
<p><img src="http://www.brooksandrus.com/jing2/xmpNamespace.png" alt="xmpDM cust XMP namespace" /></p>
<p>XMP itself builds on top of another metadata framework called <a href="http://www.w3.org/RDF/">RDF</a> (Rich Description Framework). You can think of RDF as the raw building blocks or data structures necessary to generically describe data.</p>
<p><img src="http://www.brooksandrus.com/jing2/xmpRDF.png" alt="XMP uses RDF" /></p>
<p>The gigantic mess of RDF and XMP namespace elements that need to be mixed and matched can be overwhelming, but keep yer cool&#8211;Adobe&#8217;s AS3 XMP library makes it relatively simple to parse, modify or create XMP metadata.</p>
<p>First off let&#8217;s come to a basic understanding of the core RDF elements used in XMP:</p>
<ul>
<li><strong>Description</strong> &#8211; the basic data structure of RDF, this sucka holds just about anything.</li>
<li><strong>Bag</strong> &#8211; an array structure. I just think of these as unordered all purposes arrays.</li>
<li><strong>Seq</strong> &#8211; an array structure that&#8217;s ordinal by nature.</li>
<li><strong>li</strong> &#8211; an item. If yer a Bag or Seq and aren&#8217;t just an empty vessel then plenty of these will be present.</li>
</ul>
<p>Luckily, Adobe&#8217;s AS3 XMP library has a similar ActionScript object data model:</p>
<ul>
<li><strong>XMPStruct</strong> &#8211; the core data structure of XMP.</li>
<li><strong>XMPArray</strong> &#8211; there are bag and seq flavors, but for the most part these are implicitly derived.</li>
</ul>
<p>Let&#8217;s take a look at the speech-to-text data again and see if we can piece together some of the details.</p>
<p><img src="http://www.brooksandrus.com/jing2/markers_tracks_xmp_desc.png" alt="Describing speech to text XMP data types" /></p>
<p>Now lets see how we could use this information to parse the XMP data and extract values:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> xmpHandler<span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">e</span>:XMPEvent <span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">var</span> xmp:XMPMeta = <span style="color: #000000; font-weight: bold;">new</span> XMPMeta<span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">e</span>.<span style="color: #006600;">xmp</span> <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #808080; font-style: italic;">// define a namespace that will allow us to &quot;dot down&quot; into the data</span>
    <span style="color: #808080; font-style: italic;">// the XMP lib provides constants for many of the common XMP schemas</span>
    <span style="color: #000000; font-weight: bold;">var</span> xmpDM:Namespace = XMPConst.<span style="color: #006600;">xmpDM</span>; 
&nbsp;
    <span style="color: #808080; font-style: italic;">// &quot;Tracks&quot; is a Bag array containing XMPStruct types.</span>
    <span style="color: #808080; font-style: italic;">// Let's take a look at how we can parse out the values in</span>
    <span style="color: #808080; font-style: italic;">// first XMPStruct. NOTE: All XMP arrays start at 1 rather than 0.</span>
    <span style="color: #000000; font-weight: bold;">var</span> track1:XMPStruct = xmp.<span style="color: #006600;">xmpDM</span>::Tracks<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span>;
    <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span> track1.<span style="color: #006600;">xmpDM</span>::trackName <span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span> track1.<span style="color: #006600;">xmpDM</span>::frameRate <span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;">// the second struct contains the array of speech-to-text</span>
    <span style="color: #808080; font-style: italic;">// markers that we're interested in.</span>
    <span style="color: #000000; font-weight: bold;">var</span> track2:XMPStruct = xmp.<span style="color: #006600;">xmpDM</span>::Tracks<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#93;</span>;
    <span style="color: #000000; font-weight: bold;">var</span> markers:XMPArray = track2.<span style="color: #006600;">xmpDM</span>::markers;
    <span style="color: #000000; font-weight: bold;">var</span> item:XMPStruct;
&nbsp;
    <span style="color: #b1b100;">for</span> <span style="color: #66cc66;">&#40;</span> <span style="color: #000000; font-weight: bold;">var</span> i:<span style="color: #0066CC;">int</span> = <span style="color: #cc66cc;">1</span>; i <span style="color: #66cc66;">&lt;</span> markers.<span style="color: #0066CC;">length</span> + <span style="color: #cc66cc;">1</span>; i++ <span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
        item = markers<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>; <span style="color: #808080; font-style: italic;">//  a reference to the current marker of type XMPStruct</span>
&nbsp;
        <span style="color: #808080; font-style: italic;">// now we can simply look at all of the property values for each </span>
        <span style="color: #808080; font-style: italic;">// item in the array</span>
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;startTime: &quot;</span> + item.<span style="color: #006600;">xmpDM</span>::startTime <span style="color: #66cc66;">&#41;</span>;
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;duration: &quot;</span> + item.<span style="color: #006600;">xmpDM</span>::<span style="color: #0066CC;">duration</span> <span style="color: #66cc66;">&#41;</span>;
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;name: &quot;</span> + item.<span style="color: #006600;">xmpDM</span>::<span style="color: #0066CC;">name</span> <span style="color: #66cc66;">&#41;</span>;
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;speaker: &quot;</span> + item.<span style="color: #006600;">xmpDM</span>::speaker <span style="color: #66cc66;">&#41;</span>;
        <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">&quot;probability: &quot;</span> + item.<span style="color: #006600;">xmpDM</span>::probability + <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

</pre>
<p></code></p>
<p>Ok, so that wasn&#8217;t too bad was it? Armed with some basic RDF knowledge, the Adobe AS3 XMP lib actually makes it pretty easy to parse out any XMP metadata you&#8217;re likely to run into. But we can do better than that, right? Let&#8217;s use the XMP lib and our reverse engineered knowledge of the Adobe XMP Dynamic Media schema to create some XMP marker data from scratch.</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> createXMPMarkers<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #808080; font-style: italic;">// create an xmp object and create a namespace for the Adobe DynamicMedia schema</span>
    <span style="color: #000000; font-weight: bold;">var</span> xmp:XMPMeta = <span style="color: #000000; font-weight: bold;">new</span> XMPMeta<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #000000; font-weight: bold;">var</span> xmpDM:Namespace = XMPConst.<span style="color: #006600;">xmpDM</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;">// create some markers and set some properties</span>
    <span style="color: #000000; font-weight: bold;">var</span> item1:XMPStruct = <span style="color: #000000; font-weight: bold;">new</span> XMPStruct<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    item1.<span style="color: #006600;">xmpDM</span>::<span style="color: #0066CC;">name</span> = <span style="color: #ff0000;">&quot;XMP Standard Schemas&quot;</span>;
    item1.<span style="color: #006600;">xmpDM</span>::startTime = <span style="color: #cc66cc;">0</span>;
    item1.<span style="color: #006600;">xmpDM</span>::<span style="color: #0066CC;">duration</span> = <span style="color: #cc66cc;">15000</span>;
    item1.<span style="color: #006600;">xmpDM</span>::<span style="color: #0066CC;">type</span> = <span style="color: #ff0000;">&quot;Chapter&quot;</span>;
&nbsp;
    <span style="color: #000000; font-weight: bold;">var</span> item2:XMPStruct = <span style="color: #000000; font-weight: bold;">new</span> XMPStruct<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    item2.<span style="color: #006600;">xmpDM</span>::<span style="color: #0066CC;">name</span> = <span style="color: #ff0000;">&quot;Dublin Core schema&quot;</span>;
    item2.<span style="color: #006600;">xmpDM</span>::startTime = <span style="color: #cc66cc;">0</span>;
    item2.<span style="color: #006600;">xmpDM</span>::<span style="color: #0066CC;">duration</span> = <span style="color: #cc66cc;">9999</span>;
    item2.<span style="color: #006600;">xmpDM</span>::<span style="color: #0066CC;">type</span> = <span style="color: #ff0000;">&quot;Index&quot;</span>;
&nbsp;
    <span style="color: #000000; font-weight: bold;">var</span> item3:XMPStruct = <span style="color: #000000; font-weight: bold;">new</span> XMPStruct<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    item3.<span style="color: #006600;">xmpDM</span>::<span style="color: #0066CC;">name</span> = <span style="color: #ff0000;">&quot;XMP Dynamic Media schema&quot;</span>;
    item3.<span style="color: #006600;">xmpDM</span>::startTime = <span style="color: #cc66cc;">10000</span>;
    item3.<span style="color: #006600;">xmpDM</span>::<span style="color: #0066CC;">duration</span> = <span style="color: #cc66cc;">5000</span>;
    item3.<span style="color: #006600;">xmpDM</span>::<span style="color: #0066CC;">type</span> = <span style="color: #ff0000;">&quot;Index&quot;</span>;
&nbsp;
    <span style="color: #000000; font-weight: bold;">var</span> item4:XMPStruct = <span style="color: #000000; font-weight: bold;">new</span> XMPStruct<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    item4.<span style="color: #006600;">xmpDM</span>::<span style="color: #0066CC;">name</span> = <span style="color: #ff0000;">&quot;Specialized Schema&quot;</span>;
    item4.<span style="color: #006600;">xmpDM</span>::startTime = <span style="color: #cc66cc;">15001</span>;
    item4.<span style="color: #006600;">xmpDM</span>::<span style="color: #0066CC;">duration</span> = <span style="color: #cc66cc;">50000</span>;
    item4.<span style="color: #006600;">xmpDM</span>::<span style="color: #0066CC;">type</span> = <span style="color: #ff0000;">&quot;Chapter&quot;</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;">// create an sequenced array to hold all of the markers</span>
    <span style="color: #000000; font-weight: bold;">var</span> markers:XMPArray = XMPArray.<span style="color: #006600;">newSeq</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    markers.<span style="color: #006600;">append</span><span style="color: #66cc66;">&#40;</span> item1 <span style="color: #66cc66;">&#41;</span>;
    markers.<span style="color: #006600;">append</span><span style="color: #66cc66;">&#40;</span> item2 <span style="color: #66cc66;">&#41;</span>;
    markers.<span style="color: #006600;">append</span><span style="color: #66cc66;">&#40;</span> item3 <span style="color: #66cc66;">&#41;</span>;
    markers.<span style="color: #006600;">append</span><span style="color: #66cc66;">&#40;</span> item4 <span style="color: #66cc66;">&#41;</span>;
&nbsp;
    <span style="color: #808080; font-style: italic;">//Create Tracks Struct</span>
    <span style="color: #000000; font-weight: bold;">var</span> tracks:XMPStruct = <span style="color: #000000; font-weight: bold;">new</span> XMPStruct<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    tracks.<span style="color: #006600;">xmpDM</span>::trackName = <span style="color: #ff0000;">&quot;TOC Markers&quot;</span>;
    tracks.<span style="color: #006600;">xmpDM</span>::markers = markers;
&nbsp;
    <span style="color: #808080; font-style: italic;">// Add the &quot;Tracks&quot; property to the xmp object and set its value equal to the track variable.</span>
    xmp.<span style="color: #006600;">xmpDM</span>::Tracks<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span> = tracks;
&nbsp;
    <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #0066CC;">xml</span>:<span style="color: #0066CC;">XML</span> = xmp.<span style="color: #006600;">serializeToXML</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
    <span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span> <span style="color: #0066CC;">xml</span>.<span style="color: #006600;">toXMLString</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p></code></p>
<p>That&#8217;s it for now kids &#8211; y&#8217;all should be XMP parsing and generating machines by now. Look for an upcoming tutorial on creating and using custom XMP schemas / namespaces to store application specific metadata in your media files.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/04/13/getting-down-and-dirty-with-xmp-and-as3/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ThumbGenie 1.3.0 Update = Designerfied</title>
		<link>http://www.brooksandrus.com/blog/2009/04/12/thumbgenie-130-update-designerfied/</link>
		<comments>http://www.brooksandrus.com/blog/2009/04/12/thumbgenie-130-update-designerfied/#comments</comments>
		<pubDate>Sun, 12 Apr 2009 08:46:20 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[thumbgenie]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[skinning]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=997</guid>
		<description><![CDATA[There&#8217;s an updated version of ThumbGenie in the wild that sports a new skin designed by Nick Gorsline (aka Gorz). It was the first Flex component skin for Nick and first Illustrator-to-Flex workflow for moi. I think after after the experience we&#8217;re both looking forward to some Catalyst.
In addition to the new look, videos are [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s an updated version of <a href="http://www.brooksandrus.com/blog/thumbgenie-an-air-thumbnail-generator/">ThumbGenie</a> in the wild that sports a new skin designed by Nick Gorsline (aka Gorz). It was the first Flex component skin for Nick and first Illustrator-to-Flex workflow for moi. I think after after the experience we&#8217;re both looking forward to some <a href="http://labs.adobe.com/technologies/flashcatalyst/">Catalyst</a>.</p>
<p>In addition to the new look, videos are now scaled in the preview window to match the output dimensions. This should make it easier to get a handle on what thumbnails of various sizes will actually look like.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/04/12/thumbgenie-130-update-designerfied/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating Professional Screencasts With Jing Pro and iMovie</title>
		<link>http://www.brooksandrus.com/blog/2009/04/09/video-creating-professional-screencasts-with-jing-pro-and-imovie/</link>
		<comments>http://www.brooksandrus.com/blog/2009/04/09/video-creating-professional-screencasts-with-jing-pro-and-imovie/#comments</comments>
		<pubDate>Thu, 09 Apr 2009 13:17:04 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[Screencasting]]></category>
		<category><![CDATA[imovie]]></category>
		<category><![CDATA[Jing]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=989</guid>
		<description><![CDATA[In the past I&#8217;ve shown examples of the type of compelling screencast content you can create with the combination of Jing Pro and iMovie. Today, I&#8217;ve created a quick tutorial (7:30) that illustrates how to do the following in iMovie:

Import Jing video.
Create and select clips.
Add transitions.
Use lower thirds.
Introduce your screencast with a title clip.
Create credits.
Export [...]]]></description>
			<content:encoded><![CDATA[<p>In the past I&#8217;ve shown <a href="http://www.brooksandrus.com/blog/2009/02/05/video-polished-screencasts-with-jing-pro-and-imovie/">examples</a> of the type of compelling screencast content you can create with the combination of Jing Pro and iMovie. Today, I&#8217;ve created a quick tutorial (7:30) that illustrates how to do the following in iMovie:</p>
<ul>
<li>Import Jing video.</li>
<li>Create and select clips.</li>
<li>Add transitions.</li>
<li>Use lower thirds.</li>
<li>Introduce your screencast with a title clip.</li>
<li>Create credits.</li>
<li>Export an HD MPEG-4 video.</li>
</ul>
<p>Go fullscreen <img class="jing-fullscreen-icon" src="http://www.brooksandrus.com/media/jing_fullscreen_icon.png" alt="fullscreen icon" /> to see the video in full 1:1 pixel clarity.</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_player_1449288159"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/player.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/jing_imovie_tut.mp4&amp;thumb=http://www.brooksandrus.com/media/jing_imovie_tut.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=true&amp;containerwidth=640&amp;containerheight=360" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/player.swf"
			name="fm_player_1449288159"
			width="640"
			height="360">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/jing_imovie_tut.mp4&amp;thumb=http://www.brooksandrus.com/media/jing_imovie_tut.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=true&amp;containerwidth=640&amp;containerheight=360" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
<p><a href="http://www.brooksandrus.com/media/jing_imovie_tut.mp4">Download</a> video.</p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/04/09/video-creating-professional-screencasts-with-jing-pro-and-imovie/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
<enclosure url="http://www.brooksandrus.com/media/jing_imovie_tut.mp4" length="28824520" type="video/mp4" />
		</item>
		<item>
		<title>Flex Skins with Illustrator CS4</title>
		<link>http://www.brooksandrus.com/blog/2009/04/04/video-flex-skins-with-illustrator-cs4-and-flex-3/</link>
		<comments>http://www.brooksandrus.com/blog/2009/04/04/video-flex-skins-with-illustrator-cs4-and-flex-3/#comments</comments>
		<pubDate>Sat, 04 Apr 2009 08:37:28 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Components]]></category>
		<category><![CDATA[illustrator]]></category>
		<category><![CDATA[skinning]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=983</guid>
		<description><![CDATA[Looking for a quick intro to building Flex components with Illustrator? Check out this short video.
Go fullscreen  to see the video in full 1:1 pixel clarity.

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_player_912877474"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/player.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/illustrator_flex.mp4&amp;thumb=http://www.brooksandrus.com/media/illustrator_flex.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=true&amp;containerwidth=640&amp;containerheight=360" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/player.swf"
			name="fm_player_912877474"
			width="640"
			height="360">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/illustrator_flex.mp4&amp;thumb=http://www.brooksandrus.com/media/illustrator_flex.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=true&amp;containerwidth=640&amp;containerheight=360" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		

Download video.

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
]]></description>
			<content:encoded><![CDATA[<p>Looking for a quick intro to building Flex components with Illustrator? Check out this short video.</p>
<p>Go fullscreen <img class="jing-fullscreen-icon" src="http://www.brooksandrus.com/media/jing_fullscreen_icon.png" alt="fullscreen icon" /> to see the video in full 1:1 pixel clarity.</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_player_57301566"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/player.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/illustrator_flex.mp4&amp;thumb=http://www.brooksandrus.com/media/illustrator_flex.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=true&amp;containerwidth=640&amp;containerheight=360" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/player.swf"
			name="fm_player_57301566"
			width="640"
			height="360">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/illustrator_flex.mp4&amp;thumb=http://www.brooksandrus.com/media/illustrator_flex.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=true&amp;containerwidth=640&amp;containerheight=360" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
<p><a href="http://www.brooksandrus.com/media/illustrator_flex.mp4">Download</a> video.</p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/04/04/video-flex-skins-with-illustrator-cs4-and-flex-3/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
<enclosure url="http://www.brooksandrus.com/media/illustrator_flex.mp4" length="19448530" type="video/mp4" />
		</item>
		<item>
		<title>Embracing Unwanted Change &#8211; Video Quotes From Michael Rosenblum</title>
		<link>http://www.brooksandrus.com/blog/2009/04/02/embracing-unwanted-change-video-quotes-from-michael-rosenblum/</link>
		<comments>http://www.brooksandrus.com/blog/2009/04/02/embracing-unwanted-change-video-quotes-from-michael-rosenblum/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 19:00:27 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[New Media]]></category>
		<category><![CDATA[Jing]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=977</guid>
		<description><![CDATA[Michael Rosenblum is one of my favs&#8211;the man has deep insights into the decline of old media and the ascendency of video on web. I caught a link to a speech he gave to news execs in the UK and just wanted to share a couple of my favorite quotes.
No one wants change&#8211;it screws up [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.rosenblumtv.com/">Michael Rosenblum</a> is one of my favs&#8211;the man has deep insights into the decline of old media and the ascendency of video on web. I caught a link to a <a href="http://vimeo.com/2212523">speech</a> he gave to news execs in the UK and just wanted to share a couple of my favorite quotes.</p>
<p>No one wants change&#8211;it screws up your business, but its inevitable and how you react defines you (1:10):</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_player_1331876991"
			class="flashmovie"
			width="400"
			height="225">
	<param name="movie" value="http://www.brooksandrus.com/media/player.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/rosenblum_change1.mp4&amp;thumb=http://www.brooksandrus.com/media/rosenblum_change1.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=true&amp;containerwidth=400&amp;containerheight=225" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/player.swf"
			name="fm_player_1331876991"
			width="400"
			height="225">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/rosenblum_change1.mp4&amp;thumb=http://www.brooksandrus.com/media/rosenblum_change1.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=true&amp;containerwidth=400&amp;containerheight=225" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
<p><a href="http://www.brooksandrus.com/media/rosenblum_change1.mp4">Download</a> video.</p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>Don&#8217;t just have contigency plans for the Internet&#8211;embrace it (1:17):</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_player_1972398037"
			class="flashmovie"
			width="400"
			height="225">
	<param name="movie" value="http://www.brooksandrus.com/media/player.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/rosenblum_change2.mp4&amp;thumb=http://www.brooksandrus.com/media/rosenblum_change2.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=true&amp;containerwidth=400&amp;containerheight=225" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/player.swf"
			name="fm_player_1972398037"
			width="400"
			height="225">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/rosenblum_change2.mp4&amp;thumb=http://www.brooksandrus.com/media/rosenblum_change2.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=true&amp;containerwidth=400&amp;containerheight=225" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
<p><a href="http://www.brooksandrus.com/media/rosenblum_change2.mp4">Download</a> video.</p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/04/02/embracing-unwanted-change-video-quotes-from-michael-rosenblum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://www.brooksandrus.com/media/rosenblum_change1.mp4" length="1692951" type="video/mp4" />
<enclosure url="http://www.brooksandrus.com/media/rosenblum_change2.mp4" length="1729538" type="video/mp4" />
		</item>
		<item>
		<title>The Power of Constraints &#8211; Why User Generated Web Video Needs to be Twitterfied</title>
		<link>http://www.brooksandrus.com/blog/2009/03/13/the-power-of-constraints-why-user-generated-web-video-needs-to-be-twitterfied/</link>
		<comments>http://www.brooksandrus.com/blog/2009/03/13/the-power-of-constraints-why-user-generated-web-video-needs-to-be-twitterfied/#comments</comments>
		<pubDate>Fri, 13 Mar 2009 08:41:18 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[New Media]]></category>
		<category><![CDATA[Screencasting]]></category>
		<category><![CDATA[Social Media]]></category>
		<category><![CDATA[tweetcast]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=954</guid>
		<description><![CDATA[Constraints are under-appreciated. In fact, it seems its human nature to hold constraints in scorn; to shake our fists at the shackles depriving us of unchecked free will. And yet our survival and dominant position as a species are, in large part, the result of our own physical constraints.  Without these constraints human networks [...]]]></description>
			<content:encoded><![CDATA[<p>Constraints are under-appreciated. In fact, it seems its human nature to hold constraints in scorn; to shake our fists at the shackles depriving us of unchecked free will. And yet our survival and dominant position as a species are, in large part, the result of our own physical constraints.  Without these constraints human networks would never have emerged as transcendent forces. After all, we are not particularly fast, nor armed with tough hides or impressive native weapons. Still, in the face of significant physical disadvantages humans have survived, evolved and eventually come to dominate, in large part, due to our ability to quickly communicate and work together as groups. </p>
<p>Working together in the face of danger from an environment teeming with more physically gifted competitors requires information to flow in rapid asynchronous bursts that allow our massively parallel brains to consume and respond to many near-simultaneous inputs. We need to be able to quickly pass to and interpret messages from each other. Things like facial expressions, eye dilation, body posture and gestures are all asynchronous messages that can be quickly passed by a single individual and just as quickly interpreted by all members of the group that see them. Analyzed carefully, the constraints imposed on this universal language of the human network are <strong><em>speed</em></strong> and <strong><em>asynchronicity</em></strong> &#8211; you can&#8217;t have massively parallel consumption and efficient network cooperation without both. </p>
<p>With its 140 character limit and asynchronous broadcast to self-organizing networks on the web <a href="http://twitter.com/home">Twitter</a> has asynchronous speed messaging in spades. It groks one of the fundamentals of human networks&#8211;the needs of the audience are more important than the desires of the individual. The ability to quickly consume and react is way more important than the individual&#8217;s desire to monopolize and pontificate. This is the lesson that user-generated web video needs to learn&#8211;it needs to be Twitterfied. </p>
<p><a href="http://en.wikipedia.org/wiki/Evan_Williams_(blogger)">Evan Williams</a> on the importance of constraints &#8211; Charlie Rose <a href="http://www.charlierose.com/view/interview/10118">interview</a>.</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_player_374388969"
			class="flashmovie"
			width="640"
			height="360">
	<param name="movie" value="http://www.brooksandrus.com/media/player.swf" />
	<param name="flashvars" value="content=http://www.brooksandrus.com/media/evan_williams_constraints.mp4&amp;thumb=http://www.brooksandrus.com/media/evan_williams_constraints.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=true&amp;containerwidth=640&amp;containerheight=360" />
	<param name="allowfullscreen" value="true" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.brooksandrus.com/media/player.swf"
			name="fm_player_374388969"
			width="640"
			height="360">
		<param name="flashvars" value="content=http://www.brooksandrus.com/media/evan_williams_constraints.mp4&amp;thumb=http://www.brooksandrus.com/media/evan_williams_constraints.jpg&amp;windowbox=true&amp;analytics=UA-6435642-1&amp;showbranding=true&amp;containerwidth=640&amp;containerheight=360" />
		<param name="allowfullscreen" value="true" />
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
<p><a href="http://www.brooksandrus.com/media/evan_williams_constraints.mp4">Download</a> video.</p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>The Web isn&#8217;t about passive broadcast, there are far too many delicious distractions, and even if it were, most don&#8217;t have the tools or narrative capabilities to hold the attention of an audience for any real span of time. This is especially true in the screencasting realm which is why I&#8217;d like to propose the notion of TweetCasts&#8211;120 seconds or less of webcam or screen video. That&#8217;s all the time you get to make your point. If you need more time, break your content into chunks, give viewers a rest between segments and try engaging them through a different medium. </p>
<p>Follow these rules and there&#8217;s huge potential to further humanize the web and empower each other via massive web-based human networks. Remove the audience&#8217;s biggest impediment to engaging with video (long-form passive broadcast boredom) and we&#8217;ll all be motivated to create and watch more user generated video. If that happens I wouldn&#8217;t be surprised to see training / teaching, maybe the entire education system, crowdsourced. Just remember&#8211;whether you&#8217;re a producer, content-creation tool vendor or social media site&#8211;constraints are your friend and we&#8217;ll all be the richer for it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/03/13/the-power-of-constraints-why-user-generated-web-video-needs-to-be-twitterfied/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
<enclosure url="http://www.brooksandrus.com/media/evan_williams_constraints.mp4" length="1006301" type="video/mp4" />
		</item>
		<item>
		<title>Bilinear Resampling, ShaderJob, Pixel Bender And Flash Player</title>
		<link>http://www.brooksandrus.com/blog/2009/03/11/bilinear-resampling-with-flash-player-and-pixel-bender/</link>
		<comments>http://www.brooksandrus.com/blog/2009/03/11/bilinear-resampling-with-flash-player-and-pixel-bender/#comments</comments>
		<pubDate>Thu, 12 Mar 2009 04:09:44 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[bilinear]]></category>
		<category><![CDATA[thumbgenie]]></category>
		<category><![CDATA[thumbnails]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=927</guid>
		<description><![CDATA[*Update*
Sometimes you&#8217;re an idiot and you spend a lot of time reinventing the wheel because you misread one little line of documentation. This is one of those times where I get to be that idiot. I invented a solution for bilinear resampling in Flash Player when I didn&#8217;t need to. You can actually get the [...]]]></description>
			<content:encoded><![CDATA[<p><strong>*Update*</strong></p>
<p>Sometimes you&#8217;re an idiot and you spend a lot of time reinventing the wheel because you misread one little line of documentation. This is one of those times where I get to be that idiot. I invented a solution for bilinear resampling in Flash Player when I didn&#8217;t need to. You can actually get the same results pretty simply using just BitmapData.draw() method with smoothing on (I had read this didn&#8217;t work when down sizing), but it requires creating a temp BitmapData object if the source you&#8217;re feeding the BitmapData.draw() method is not another BitmapData object (i.e. a DisplayObject). Here&#8217;s what that scenario would look like.<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;">            <span style="color: #808080; font-style: italic;">// source in this example is a DisplayObject</span>
            <span style="color: #000000; font-weight: bold;">var</span> temp:BitmapData = <span style="color: #000000; font-weight: bold;">new</span> BitmapData<span style="color: #66cc66;">&#40;</span> sourceWidth, sourceHeight <span style="color: #66cc66;">&#41;</span>;
            temp.<span style="color: #006600;">draw</span><span style="color: #66cc66;">&#40;</span> source <span style="color: #66cc66;">&#41;</span>;
&nbsp;
            <span style="color: #000000; font-weight: bold;">var</span> output:BitmapData = <span style="color: #000000; font-weight: bold;">new</span> BitmapData<span style="color: #66cc66;">&#40;</span> outputWidth, outputHeight <span style="color: #66cc66;">&#41;</span>;
&nbsp;
            <span style="color: #000000; font-weight: bold;">var</span> matrix:Matrix = <span style="color: #000000; font-weight: bold;">new</span> Matrix<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
            matrix.<span style="color: #006600;">scale</span><span style="color: #66cc66;">&#40;</span> outputWidth <span style="color: #66cc66;">/</span> sourceWidth, outputHeight <span style="color: #66cc66;">/</span> sourceHeight <span style="color: #66cc66;">&#41;</span>;
&nbsp;
            output.<span style="color: #006600;">draw</span><span style="color: #66cc66;">&#40;</span> temp, matrix, <span style="color: #000000; font-weight: bold;">null</span>, <span style="color: #000000; font-weight: bold;">null</span>, <span style="color: #000000; font-weight: bold;">null</span>, <span style="color: #000000; font-weight: bold;">true</span> <span style="color: #66cc66;">&#41;</span>;
            temp.<span style="color: #006600;">dispose</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</pre></div></div>

<p></code><br />
<span id="more-927"></span><br />
Many thanks to Felix for leaving a comment that made me question myself and go back to the problem with fresh eyes.</p>
<p>Now I can take some consolation in the fact that I actually learned a lot by going down this path. I dug in to Pixel Bender again and learned how to use ShaderJob. To that end, portions of this &#8220;tutorial&#8221; illustrate how to use a PixelBender shader and a ShaderJob together. ShaderJob, when run with the async flag (false), is as close as you can come to creating new threads in Flash&#8211;that&#8217;s some pretty neat Flash hackery.</p>
<p>So, if you find yourself reading this, you&#8217;re advised to skip down to the code included below and take a look at the embedded filter, Shader / ShaderJob portion. </p>
<p><strong>*End of Update*</strong></p>
<p>If you&#8217;re looking to generate high quality scaled bitmaps in Flash Player / AIR, you&#8217;ll need to do some form of bilinear or bicubic resampling. Why you ask? Because, Flash Player resampling is, by default, nearest neighbor and that looks, well, like ass (see evidence directly below).</p>
<p><img src="http://www.brooksandrus.com/images/nearest_neighbor_controls.jpg" alt="nearest neighbor resample" /><br />
 If you dig around long enough on the net you&#8217;ll find some AS3 libraries (Java ports) like <a href="http://www.clevr.com/blog/2008/resize-actionscript-bicubic-bilinear-interpolation/">clevrlib</a> which will do bilinear or bicubic resampling using BitmapData methods like getPixel / setPixel. As seen below, clevrlib definitely decreases jaggies and improves the legibility of text, but its extremely slow&#8211;scaling a 960&#215;540 BitmapData object to 640&#215;360 takes around 1.5 &#8211; 2 seconds for  bilinear resampling and around 3 &#8211; 5 seconds for bicubic resampling (mileage will vary based on the type of imagery and size of the picture). Also, the results, in some cases, exhibit noticeable resampling artifacts (check out the fullscreen icon in the right corner of the examples immediately below).</p>
<p><img src="http://www.brooksandrus.com/jing2/cleverlib_resampling.png" alt="cleverlib resampling" /></p>
<p>I was looking to implement bilinear resampling in <a href="http://www.brooksandrus.com/blog/thumbgenie-an-air-thumbnail-generator/">ThumbGenie</a>, but, as the old saying goes&#8211;speed kills. I just couldn&#8217;t tolerate 2 or 3 seconds to resample an image&#8211;there had to to be a better way. After a bit of thought I fell on the answer&#8211;<a href="http://labs.adobe.com/technologies/pixelbender/">PixelBender</a>. </p>
<p>Flash Player 10 PixelBender bytecode is designed to manipulate individual pixels in a bitmap super fast. In fact, it executes fast enough to apply real time filter effects to video. This seemed promising and sure enough after reading through the sdk docs and playing around for awhile (read I spent a Saturday evening trying to wrap my little melon around the issue), I was able to find a built-in PixelBender method that does bilinear sampling. Slap a parameter on that biatch (aka kernel) controlling the desired scale of the output  and little ol&#8217; me was rendering silky-smooth, scaled bitmaps out of Flash Player in mere milliseconds (8-13 milliseconds scaling a 960&#215;540 bitmap to 640&#215;360&#8211;take that suckaz).</p>
<p><img src="http://www.brooksandrus.com/images/bilinear_controls.jpg" alt="Pixel Bender bilinear resampling" /></p>
<p>Interested in chasing the same dream? Here&#8217;s, the rough outline you&#8217;ll need to follow:</p>
<ol>
<li>Create Pixel Bender kernel that does bilinear resampling.</li>
<li>Compile Pixel Bender bytecode for Flash Player 10 (.pbj file).</li>
<li>Embed PBJ bytecode in AS3 class.</li>
<li>Generate <a href="http://livedocs.adobe.com/flex/3/langref/flash/display/BitmapData.html">BitmapData</a> from a <a href="http://livedocs.adobe.com/flex/3/langref/flash/display/DisplayObject.html">DisplayObjec</a>t (BitmapData.draw( obj )).</li>
<li>Create an AS3 <a href="http://livedocs.adobe.com/flex/3/langref/flash/display/Shader.html">Shader</a> object, instantiate embedded Pixel Bender bytecode, configure Shader.</li>
<li>Create an output BitmapData object (this will hold the scaled bitmap we create.</li>
<li>Create a <a href="http://livedocs.adobe.com/flex/3/langref/flash/display/ShaderJob.html">ShaderJob</a> &#8211; this is a process that will run the Shader and return its output to an object (as opposed to being applied to a DisplayObject wrapped in a <a href="http://livedocs.adobe.com/flex/3/langref/flash/filters/ShaderFilter.html">ShaderFilter</a>).</li>
<li>Run the ShaderJob by calling the ShaderJob.start( true ) method.</li>
<li>Do something with the BitmapData thumbnail (display, push to server, or encode and save to disk)</li>
</ol>
<p>Ouch, that&#8217;s pretty painful. And believe me, I did some serious bleeding before figuring this one out&#8211;I really had to push the two or three sleep deprived brain cells I have left in order to get the job done. And well, this is just a long-winded way of saying that I&#8217;ll be providing y&#8217;all the Pixel Bender kernel (.pbk) and bytcode (.pbj) plus the AS3 implementation that I developed for <a href="http://www.brooksandrus.com/blog/thumbgenie-an-air-thumbnail-generator/">ThumbGenie</a> (just my way of saying thanks for all of the code you Flash / Flex cats so liberally share all of time).</p>
<p>Whew, you made it this far, now its time for the good stuff. Download the PixelBender source / bytecode <a href="http://www.brooksandrus.com/resources/bilinearresample.zip">here</a> and feel free to peruse / use the implementation seen below.</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="actionscript" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/**
 * Copyright 2009 (c) , Brooks Andrus
 * 
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software to deal in the Software without
 * restriction, including without limitation the rights to use,
 * copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following
 * conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 * 
 */</span>
package com.<span style="color: #006600;">brooksandrus</span>.<span style="color: #006600;">utils</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">BitmapData</span>;
    <span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">DisplayObject</span>;
    <span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">Shader</span>;
    <span style="color: #0066CC;">import</span> flash.<span style="color: #006600;">display</span>.<span style="color: #006600;">ShaderJob</span>;
&nbsp;
    <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">class</span> BilinearResample
    <span style="color: #66cc66;">&#123;</span>
        <span style="color: #66cc66;">&#91;</span>Embed <span style="color: #66cc66;">&#40;</span> source=<span style="color: #ff0000;">&quot;../../../../assets/bilinearresample.pbj&quot;</span>, mimeType=<span style="color: #ff0000;">&quot;application/octet-stream&quot;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#93;</span>
        <span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">var</span> BilinearScaling:<span style="color: #000000; font-weight: bold;">Class</span>;
&nbsp;
        <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> BilinearResample<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#123;</span>
            <span style="color: #0066CC;">super</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
        <span style="color: #66cc66;">&#125;</span>
&nbsp;
        <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> resampleBitmap<span style="color: #66cc66;">&#40;</span> input:BitmapData, desiredWidth:<span style="color: #0066CC;">int</span>, desiredHeight:<span style="color: #0066CC;">int</span>, cleanup:<span style="color: #0066CC;">Boolean</span> = <span style="color: #000000; font-weight: bold;">true</span> <span style="color: #66cc66;">&#41;</span>:BitmapData
        <span style="color: #66cc66;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">var</span> aspectRatio:<span style="color: #0066CC;">Number</span> = input.<span style="color: #0066CC;">width</span> <span style="color: #66cc66;">/</span> input.<span style="color: #0066CC;">height</span>;
&nbsp;
            <span style="color: #000000; font-weight: bold;">var</span> factor:<span style="color: #0066CC;">Number</span> = <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">max</span><span style="color: #66cc66;">&#40;</span> input.<span style="color: #0066CC;">width</span> <span style="color: #66cc66;">/</span> desiredWidth, input.<span style="color: #0066CC;">height</span> <span style="color: #66cc66;">/</span> desiredHeight <span style="color: #66cc66;">&#41;</span>;
&nbsp;
            <span style="color: #808080; font-style: italic;">// create and configure a Shader object</span>
            <span style="color: #000000; font-weight: bold;">var</span> shader:Shader = <span style="color: #000000; font-weight: bold;">new</span> Shader<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
            shader.<span style="color: #006600;">byteCode</span> = <span style="color: #000000; font-weight: bold;">new</span> BilinearScaling<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">// instantiate embedded Pixel Bender bytecode</span>
            shader.<span style="color: #0066CC;">data</span>.<span style="color: #006600;">src</span>.<span style="color: #006600;">input</span> = input; <span style="color: #808080; font-style: italic;">// supply the shader with BitmapData it will manipulate</span>
            shader.<span style="color: #0066CC;">data</span>.<span style="color: #006600;">scale</span>.<span style="color: #006600;">value</span> = <span style="color: #66cc66;">&#91;</span>factor<span style="color: #66cc66;">&#93;</span>; <span style="color: #808080; font-style: italic;">// scale factor. shader params are all stored in arrays.</span>
&nbsp;
            <span style="color: #000000; font-weight: bold;">var</span> outputWidth:<span style="color: #0066CC;">int</span>;
            <span style="color: #000000; font-weight: bold;">var</span> outputHeight:<span style="color: #0066CC;">int</span>;
&nbsp;
            <span style="color: #808080; font-style: italic;">// determine output bitmap dimensions</span>
            <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> input.<span style="color: #0066CC;">width</span> <span style="color: #66cc66;">&gt;</span> input.<span style="color: #0066CC;">height</span> <span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#123;</span>
                outputWidth = desiredWidth;
                outputHeight = desiredWidth <span style="color: #66cc66;">/</span> aspectRatio;
            <span style="color: #66cc66;">&#125;</span>
            <span style="color: #b1b100;">else</span>
            <span style="color: #66cc66;">&#123;</span>
                outputWidth = desiredHeight <span style="color: #66cc66;">*</span> aspectRatio;
                outputHeight = desiredHeight;
            <span style="color: #66cc66;">&#125;</span>
&nbsp;
            <span style="color: #808080; font-style: italic;">// create a bitmap - our shader will return its data (an image) to this bitmap</span>
            <span style="color: #000000; font-weight: bold;">var</span> output:BitmapData = <span style="color: #000000; font-weight: bold;">new</span> BitmapData<span style="color: #66cc66;">&#40;</span> outputWidth, outputHeight <span style="color: #66cc66;">&#41;</span>;
&nbsp;
            <span style="color: #808080; font-style: italic;">// shader jobs are wicked cool</span>
            <span style="color: #000000; font-weight: bold;">var</span> job:ShaderJob = <span style="color: #000000; font-weight: bold;">new</span> ShaderJob<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
            job.<span style="color: #0066CC;">target</span> = output; <span style="color: #808080; font-style: italic;">// ShaderJob returns to this object</span>
            job.<span style="color: #006600;">shader</span> = shader; <span style="color: #808080; font-style: italic;">// The Shader assigned to this job</span>
            job.<span style="color: #0066CC;">start</span><span style="color: #66cc66;">&#40;</span> <span style="color: #000000; font-weight: bold;">true</span> <span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">// true flag runs the job synchronously.</span>
&nbsp;
            <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> cleanup <span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#123;</span>
                input.<span style="color: #006600;">dispose</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
            <span style="color: #66cc66;">&#125;</span>
&nbsp;
            <span style="color: #b1b100;">return</span> output;
        <span style="color: #66cc66;">&#125;</span>
&nbsp;
        <span style="color: #0066CC;">public</span> <span style="color: #000000; font-weight: bold;">function</span> resampleDisplayObject<span style="color: #66cc66;">&#40;</span> source:DisplayObject, desiredWidth:<span style="color: #0066CC;">int</span>, desiredHeight:<span style="color: #0066CC;">int</span> <span style="color: #66cc66;">&#41;</span>:BitmapData
        <span style="color: #66cc66;">&#123;</span>
            <span style="color: #000000; font-weight: bold;">var</span> aspectRatio:<span style="color: #0066CC;">Number</span> = source.<span style="color: #0066CC;">width</span> <span style="color: #66cc66;">/</span> source.<span style="color: #0066CC;">height</span>;
&nbsp;
            <span style="color: #000000; font-weight: bold;">var</span> factor:<span style="color: #0066CC;">Number</span> = <span style="color: #0066CC;">Math</span>.<span style="color: #0066CC;">max</span><span style="color: #66cc66;">&#40;</span> source.<span style="color: #0066CC;">width</span> <span style="color: #66cc66;">/</span> desiredWidth, source.<span style="color: #0066CC;">height</span> <span style="color: #66cc66;">/</span> desiredHeight <span style="color: #66cc66;">&#41;</span>;
&nbsp;
            <span style="color: #000000; font-weight: bold;">var</span> input:BitmapData = <span style="color: #000000; font-weight: bold;">new</span> BitmapData<span style="color: #66cc66;">&#40;</span> source.<span style="color: #0066CC;">width</span>, source.<span style="color: #0066CC;">height</span>, <span style="color: #000000; font-weight: bold;">true</span> <span style="color: #66cc66;">&#41;</span>;
            input.<span style="color: #006600;">draw</span><span style="color: #66cc66;">&#40;</span> source <span style="color: #66cc66;">&#41;</span>;
&nbsp;
            <span style="color: #808080; font-style: italic;">// configure the shader</span>
            <span style="color: #000000; font-weight: bold;">var</span> shader:Shader = <span style="color: #000000; font-weight: bold;">new</span> Shader<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
            shader.<span style="color: #006600;">byteCode</span> = <span style="color: #000000; font-weight: bold;">new</span> BilinearScaling<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
            shader.<span style="color: #0066CC;">data</span>.<span style="color: #006600;">src</span>.<span style="color: #006600;">input</span> = input;
            shader.<span style="color: #0066CC;">data</span>.<span style="color: #006600;">scale</span>.<span style="color: #006600;">value</span> = <span style="color: #66cc66;">&#91;</span>factor<span style="color: #66cc66;">&#93;</span>; <span style="color: #808080; font-style: italic;">// scale factor. shader params are all stored in arrays.</span>
&nbsp;
            <span style="color: #000000; font-weight: bold;">var</span> outputWidth:<span style="color: #0066CC;">int</span>;
            <span style="color: #000000; font-weight: bold;">var</span> outputHeight:<span style="color: #0066CC;">int</span>;
&nbsp;
            <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span> input.<span style="color: #0066CC;">width</span> <span style="color: #66cc66;">&gt;</span> input.<span style="color: #0066CC;">height</span> <span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#123;</span>
                outputWidth = desiredWidth;
                outputHeight = desiredWidth <span style="color: #66cc66;">/</span> aspectRatio;
            <span style="color: #66cc66;">&#125;</span>
            <span style="color: #b1b100;">else</span>
            <span style="color: #66cc66;">&#123;</span>
                outputWidth = desiredHeight <span style="color: #66cc66;">*</span> aspectRatio;
                outputHeight = desiredHeight;
            <span style="color: #66cc66;">&#125;</span>
&nbsp;
            <span style="color: #000000; font-weight: bold;">var</span> output:BitmapData = <span style="color: #000000; font-weight: bold;">new</span> BitmapData<span style="color: #66cc66;">&#40;</span> outputWidth, outputHeight <span style="color: #66cc66;">&#41;</span>;
&nbsp;
            <span style="color: #000000; font-weight: bold;">var</span> job:ShaderJob = <span style="color: #000000; font-weight: bold;">new</span> ShaderJob<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
            job.<span style="color: #0066CC;">target</span> = output;
            job.<span style="color: #006600;">shader</span> = shader;
            job.<span style="color: #0066CC;">start</span><span style="color: #66cc66;">&#40;</span> <span style="color: #000000; font-weight: bold;">true</span> <span style="color: #66cc66;">&#41;</span>; <span style="color: #808080; font-style: italic;">// true flag runs the job synchronously.</span>
&nbsp;
            input.<span style="color: #006600;">dispose</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
            <span style="color: #b1b100;">return</span> output;
        <span style="color: #66cc66;">&#125;</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></div></div>

<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/03/11/bilinear-resampling-with-flash-player-and-pixel-bender/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>ThumbGenie 1.2 Now Supports Bilinear Image Resampling (improved scaling in non-geek speak)</title>
		<link>http://www.brooksandrus.com/blog/2009/03/10/thumbgenie-12-now-supports-bilinear-image-resampling-improved-scaling-in-non-geek-speak/</link>
		<comments>http://www.brooksandrus.com/blog/2009/03/10/thumbgenie-12-now-supports-bilinear-image-resampling-improved-scaling-in-non-geek-speak/#comments</comments>
		<pubDate>Wed, 11 Mar 2009 04:17:08 +0000</pubDate>
		<dc:creator>Brooks</dc:creator>
				<category><![CDATA[thumbgenie]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[bilinear]]></category>
		<category><![CDATA[resampling]]></category>
		<category><![CDATA[thumbnails]]></category>

		<guid isPermaLink="false">http://www.brooksandrus.com/blog/?p=914</guid>
		<description><![CDATA[One of the things that&#8217;s sort of sucked about ThumbGenie has been the quality of scaled thumbnails. The 640&#215;360 image below was generated from a 960&#215;540 video frame.  Notice the edge degradation (jaggies) and poorly rendered text that results from the nearest neighbor scaling.

ThumbGenie 1.2 makes some very noticeable improvements to the quality of [...]]]></description>
			<content:encoded><![CDATA[<p>One of the things that&#8217;s sort of sucked about <a href="http://www.brooksandrus.com/blog/thumbgenie-an-air-thumbnail-generator/">ThumbGenie</a> has been the quality of scaled thumbnails. The 640&#215;360 image below was generated from a 960&#215;540 video frame.  Notice the edge degradation (jaggies) and poorly rendered text that results from the nearest neighbor scaling.<span id="more-914"></span></p>
<p><img src="http://www.brooksandrus.com/images/nearest_neighbor.jpg" alt="ThumbGenie image scaled down using nearest neighbor resampling." /></p>
<p><a href="http://www.brooksandrus.com/blog/thumbgenie-an-air-thumbnail-generator/">ThumbGenie 1.2</a> makes some very noticeable improvements to the quality of scaled thumbnails, as seen below, by doing bilinear resampling using a <a href="http://labs.adobe.com/technologies/pixelbender/">Pixel Bender</a> kernel.</p>
<p><img src="http://www.brooksandrus.com/images/bilinear.jpg" alt="ThumbGenie image generated using bilinear resampling" /></p>
<p>The update also includes some bug fixes:</p>
<ul>
<li>Fixed bug that caused aspect ratio to be incorrectly displayed in the output dimensions field when &#8220;retain&#8221; was checked and video of a different aspect ratio was loaded. Because this bug has been fixed the &#8220;R&#8221; reset button has been removed from the UI.</li>
<li>FIxed bug that prevented text from being pasted into the embed code window when the the keyboard shortcut for paste was used.</li>
</ul>
<p>If you&#8217;re dying to get your hands on ThumbGenie, or have no idea what it is, check out its home page for an overview and some helpful videos:</p>
<p><a href="http://www.brooksandrus.com/blog/thumbgenie-an-air-thumbnail-generator/">http://www.brooksandrus.com/blog/thumbgenie-an-air-thumbnail-generator/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.brooksandrus.com/blog/2009/03/10/thumbgenie-12-now-supports-bilinear-image-resampling-improved-scaling-in-non-geek-speak/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
