<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Giuseppe Guerrasio</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/</link><description>Building the next web platform</description><dc:language>en-US</dc:language><generator>Telligent Evolution Platform Developer Build (Build: 5.6.50428.7875)</generator><item><title>Using a global audio player and EE4 for live audio Smooth Streaming on Windows Phone 7</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/06/22/using-a-global-audio-player-and-ee4-for-live-audio-smooth-streaming-on-windows-phone-7.aspx</link><pubDate>Wed, 22 Jun 2011 14:43:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10177087</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10177087</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/06/22/using-a-global-audio-player-and-ee4-for-live-audio-smooth-streaming-on-windows-phone-7.aspx#comments</comments><description>&lt;p&gt;After my &lt;a href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/06/using-smooth-streaming-media-element-for-windows-phone-7.aspx"&gt;previous post&lt;/a&gt; about Smooth Streaming on Windows Phone 7 I received questions about Live Audio Streaming on Windows Phone 7. In particular the most recurrent questions are:&lt;/p&gt;
&lt;p&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Is it possible to create a global audio player that works in every page of my application?&lt;/p&gt;
&lt;p&gt;-&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Is it possible use Expression Encoder 4 for Audio only Live Smooth Streaming?&lt;/p&gt;
&lt;p&gt;I would try to respond to these questions starting from the first.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Is it possible to create a global audio player that works in every page of my application?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I assuming that you are familiar with &amp;nbsp;Smooth Streaming Media Element on Windows Phone, in the case that you want learn more about how use &amp;nbsp;it you can read &lt;a href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/06/using-smooth-streaming-media-element-for-windows-phone-7.aspx" target="_blank"&gt;my previous blog post&amp;nbsp;about this&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Smooth Streaming Media Element (SSME) is a UI control. In order to works it is necessary insert this in the visual tree of your page. If you insert this in the visual Tree of a page and after that your application navigates in other pages, SSME stopped. If you would create a global SSME for audio streaming that continue to works in every page of your application, the most simple thing that you can do is put it in the template of the page and take a reference to it in a property on the App object.&lt;/p&gt;
&lt;p&gt;In order to understand &amp;nbsp;how&amp;nbsp;it is&amp;nbsp;possible do this, you&amp;nbsp;can create a simple Windows Phone Visual Studio project . You can start a new Windows Phone 7 project from Visual Studio using the specific template project:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/6114.wp71.PNG"&gt;&lt;img style="display: block; max-width: 550px; margin-left: auto; margin-right: auto;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/6114.wp71.PNG" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;And after that you can add a reference to Microsoft.Web.Media.SmoothStreaming.dll for WP7 (look&amp;nbsp;&lt;a href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/06/using-smooth-streaming-media-element-for-windows-phone-7.aspx" target="_blank"&gt;my previous blog post&amp;nbsp;about this&lt;/a&gt; for more info ):&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;a href="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/6266.wp72.PNG"&gt;&lt;img style="display: block; max-width: 550px; margin-left: auto; margin-right: auto;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/6266.wp72.PNG" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;In order to insert the Smooth Streaming Media Element in the template of the page, you have to create a new template and insert it in the app.xaml as a resource.&amp;nbsp; To add the SSME to this template you have to add this reference to the app.xaml, in &amp;nbsp;the &amp;lt;Application &amp;nbsp;tag:&lt;/p&gt;
&lt;p&gt;xmlns:SSME="clr-namespace:Microsoft.Web.Media.SmoothStreaming;assembly=Microsoft.Web.Media.SmoothStreaming"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;After that, you can add this new control template inside the &amp;lt;Application.Resources&amp;gt; tag in app.xaml:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;em&gt;&amp;lt;ControlTemplate x:Key="AudioPlayerContentTemplate"&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid x:Name="MediaElementContainer"&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- The Smooth Streaming media element used to play&amp;nbsp;audio --&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;ssme:SmoothStreamingMediaElement&amp;nbsp; Loaded="OnMediaLoaded" Height="1" Width="1"&amp;nbsp; /&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- Added for the normal content --&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid x:Name="ClientArea"&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ContentPresenter /&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Grid&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ControlTemplate&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;We use this control template to substitute the default template that the Phone use for the &amp;nbsp;Root Phone Page. In the App.cs file add the code to inject the template in the method CompleteInitializePhoneApplication :&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;private void CompleteInitializePhoneApplication(object sender, NavigationEventArgs e)&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Set the root visual to allow the application to render&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (RootVisual != RootFrame&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RootVisual = RootFrame;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Remove this handler since it is no longer needed&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RootFrame.Navigated -= CompleteInitializePhoneApplication;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;// Add this to inject the smooth streaming media element Control template&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RootFrame.Template = App.Current.Resources["AudioPlayerContentTemplate"]&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; as ControlTemplate;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;/b&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In App.cs we can also add a property that can permit to access to the SSME loaded in the template and the event to load it from the template that we have declared in the template xaml listed before. We set also the SmoothStreamingPlaybackMode&amp;nbsp; to PlaybackMode.AudioOnly, in order to ask to SSME to download only audio chunk and ignore video tracks that could be presents in the manifest: &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;private static SmoothStreamingMediaElement _globalMediaElement = null;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public static SmoothStreamingMediaElement GlobalMediaElement&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; get { return _globalMediaElement; }&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void OnMediaLoaded(object sender, RoutedEventArgs e)&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_globalAudioElement == null)&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _globalAudioElement = sender as SmoothStreamingMediaElement;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _globalAudioElement.SmoothStreamingPlaybackMode = PlaybackMode.AudioOnly;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;After that, you can access from every page of the page&amp;nbsp; to App.GlobalMediaElement and use it to set the SmoothStreamingSource and control Play and Stop.&lt;/p&gt;
&lt;p&gt;For example you can add this to the LoadedEvent in the mainpage of your application, in order to start the stream:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ((App.GlobalAudioElement.CurrentState == SmoothStreamingMediaElementState.Stopped) || (App.GlobalAudioElement.CurrentState == SmoothStreamingMediaElementState.Closed))&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; App.GlobalAudioElement.SmoothStreamingSource = new Uri(&lt;a href="http://server/live/audiolivestream/Manifest"&gt;http://server/live/audiolivestream.isml/Manifest&lt;/a&gt;);&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Is it possible use Expression Encoder 4 for Audio only Live Smooth Streaming?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yes,&amp;nbsp; it is possible use Expression Encoder 4 Pro Sp1 to stream audio only live Smooth Streaming. You can also use others encoders compatible with Smooth Streaming for delivering&amp;nbsp;Live&amp;nbsp;Audio&amp;nbsp;with this type of streaming.&amp;nbsp;The current version of&amp;nbsp;Smooth Streaming&amp;nbsp; supports the adaptive streaming capability&amp;nbsp; only for the&amp;nbsp;video tracks. You can insert more audio&amp;nbsp;tracks but&amp;nbsp;these tracks can't&amp;nbsp; be used for adapt the quality to the avaliable bandwith but only as alternative tracks that the user can select ( &lt;a href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/01/08/multi-language-audio-with-iis-smooth-streaming-an-example-from-radiovaticana-live-streaming.aspx" target="_blank"&gt;for example different languages tracks&lt;/a&gt; ). EE4 SP1 doesn't support multi audio track and if you need to insert more track you have to use a different encoder&amp;nbsp;that support this or you can create more streams with separate manifests with EE4.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;The current version of EE4 Pro Sp1 dosen't permit to create a live smooth streaming project without a video track,&amp;nbsp; but you can insert a&amp;nbsp;black screen video track and ignore it&amp;nbsp;on a client side.&amp;nbsp;In order to do that you have to select in the live project only the audio input and inserting in the manifest also one video track, that stream a black screen with a low bitrate. In the player based on SSME on the Windows Phone, or on in Silverlight for PC&amp;nbsp;if you set the property SmoothStreamingPlaybackMode to PlaybackMode.AudioOnly, before to set the SmoothStreamingSource property, Smooth Streaming Media Element download only the audio track and ignore the video track that you have inserted in the manifest.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;In order to configure EE4 Pro SP1 to deliver&amp;nbsp;this in order to use Audio only live Smooth Streaming with IIS Media Services&amp;nbsp;you need to use a PC with IIS Media Services 4 and EE4 Pro SP1.If you aren't familiar with Live Smooth Streaming, you can find more information about how configure IIS Media Services and Expression Encoder 4Pro SP1 for Live Smooth Streaming &lt;a href="http://learn.iis.net/page.aspx/620/getting-started-with-iis-live-smooth-streaming/" target="_blank"&gt;in this tutorial &lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You&amp;nbsp;can start a new EE4 project and select a Live Broadcasting project:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/0676.ee41.JPG"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/0676.ee41.JPG" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Add a Live Source:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/5516.ee42.JPG"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/5516.ee42.JPG" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Select only the audio device input:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/7485.EE43.JPG"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/7485.EE43.JPG" width="380" height="242" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Select from the preset for the project the H264 IIS Smooth Streaming for Windows Phone 7&amp;nbsp;presets&amp;nbsp;and reduce the video tracks to only one wher you select a low resolution with a low frame rate:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/6278.EE44.JPG"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/6278.EE44.JPG" width="296" height="827" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;connect the output of EE4 to a publishing point on IIS Media Services and start the encoding ( if you aren't familiar with Live Smooth Streaming, &amp;nbsp;you can find more information about&amp;nbsp; how configure IIS Media Services and Expression Encoder 4Pro SP1 for Live Smooth Streaming &amp;nbsp;&lt;a href="http://learn.iis.net/page.aspx/620/getting-started-with-iis-live-smooth-streaming/" target="_blank"&gt;in this tutorial &lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/0045.ee41.JPG"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/5037.EE45.JPG"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/5037.EE45.JPG" width="316" height="708" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Now you can set the url of the publishing point in the SSME player on Windows Phone 7 and pay attention to&amp;nbsp;&amp;nbsp;set the property SmoothStreamingPlaybackMode to PlaybackMode.AudioOnly, before to set the SmoothStreamingSource property, and you are able to Play the Live Audio only Smooth Streaming.&lt;/p&gt;
&lt;p&gt;Enjoy !!!&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10177087" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IIS7/">IIS7</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Media/">Media</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/WP7/">WP7</category></item><item><title>Monitoring and Management services in IIS Transform Manager  1.0  Beta </title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/06/17/monitoring-and-management-services-in-iis-transform-manager-1-0-beta.aspx</link><pubDate>Fri, 17 Jun 2011 15:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10176274</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10176274</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/06/17/monitoring-and-management-services-in-iis-transform-manager-1-0-beta.aspx#comments</comments><description>&lt;p&gt;IIS Transform Manager 1.0 &amp;ndash; Beta refresh is &lt;a href="http://www.iis.net/download/TransformManager"&gt;available for download&lt;/a&gt;. IIS Transform Manager (IIS TM) is a new component of the next version of the IIS Media Services platform and provides a simple integrated video encoding/encrypting and batch conversion and transformation of video files. IIS Transform Manager integrates directly with Expression Encoder 4 to allow you to use "watch folders" to queue up multiple encode jobs on your server and deliver them directly to IIS Media Services 4.0 Web folders as IIS Smooth Streaming presentations. Transform Manager offers also an SDK that permits developers to write custom Task plug-ins that can be used with Transform Manager to support custom actions, third-party encoders, or your own custom workflows.&amp;nbsp; IIS TM&amp;nbsp; can permit to you an easly scalability for your transformations workflow because you could leverage Windows server HPC (&lt;a href="http://www.microsoft.com/hpc/"&gt;High Performance Computing&lt;/a&gt;)&amp;nbsp; and scale out your encoding\trans-mux tasks on a grid of servers in easy way. In the next picture you can see the typical architecture that you can implement&amp;nbsp;using IIS TM:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/4152.iistm1.jpg"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/4152.iistm1.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As I have written in others articles in Italy we have some important customers that use today IIS TM Beta in some&amp;nbsp;relevant video service like &lt;a href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/07/25/replaytv-service-on-rai-tv-web-site-with-silverlight-and-iis-smooth-streaming.aspx"&gt;RAI Replay TV&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/02/05/iis-media-services-4-integrated-media-platform-streaming-for-pc-windows-phone-and-iphone-ipad-with-a-single-platform-a-good-example-from-mediaset-rti-new-media.aspx"&gt;Video Mediaset web site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can learn more about IIS TM starting from &lt;a href="http://www.iis.net/download/TransformManager"&gt;the page dedicated to this new service on IIS Media Sevices Web site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With this new Beta coming some new interesting features in IIS TM like the new Notifications service and the Monitoring and Management API.&lt;/p&gt;
&lt;p&gt;Notifications service can permit to you to send notifications as a POST web requests with job status changes to a remote web application or service. This enables web developers to build a custom Transform Manager job-monitoring system. You can learn more about notifications in IIS TM &lt;a href="http://learn.iis.net/page.aspx/1031/sending-transform-manager-job-status-notifications-to-a-remote-web-application/"&gt;in this tutorial&lt;/a&gt; on IIS Media Web site.&lt;/p&gt;
&lt;p&gt;The new Monitoring and Management API can permit to manage Jobs using custom code. You can directly use the same API that the Management Console application uses, in order to create custom code to manage and monitoring Jobs Status and IIS TM configuration. You can send any command to IIS TM from your code and execute operation like stopping or resubmiting a Job. These API are available as WCF endpoints. You have to use a process that runs in the context of a user with administrative privilege to use these endpoints.&lt;/p&gt;
&lt;p&gt;Before to start to use IIS TM and this features make sure that you have downloaded the latest IIS TM Beta build (build 1151.5) &amp;nbsp;from the Microsoft download center in order to have the right build where this API works with the right behavior.&lt;/p&gt;
&lt;p&gt;The interfaces of this API are described in the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.web.media.transformmanager.transformmanagerservice(v=VS.90).aspx"&gt;IIS TM SDK&lt;/a&gt; and these offering a large numbers of methods useful to manage and monitoring Jobs and IIS TM configurations.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;You can consume these WCF Endpoints in a very simple way using Visual Studio 2010. For example you can build in a very&amp;nbsp;simple way a WPF app that is able to consume these API.&lt;/p&gt;
&lt;p&gt;In order to do this you can open Visual Studio using &amp;ldquo;run as Administrator&amp;rdquo; in order to have the right permissions to consume management and monitoring API:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/3362.iistm2.png"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/3362.iistm2.png" width="347" height="423" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;From Visual Studio you have to create a new WPF project:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/8204.iistm3.jpg"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/8204.iistm3.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the Solution Explorer you can add a Service reference to the management and monitoring API on the PC where you running the IIS TM and Visual Studio:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/3108.iistm4.jpg"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/3108.iistm4.jpg" width="500" height="382" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The addresses of the WCF endpoints are:&lt;/p&gt;
&lt;p&gt;net.tcp://localhost:59999/TransformManager/Management/Monitoring&lt;/p&gt;
&lt;p&gt;&amp;nbsp;net.tcp://localhost:59999/TransformManager/Management/Management&lt;/p&gt;
&lt;p&gt;&amp;nbsp;and the metadata URL where is available the WSDL is:&lt;/p&gt;
&lt;p&gt;net.tcp://localhost:59999/TransformManager/Management/mex&lt;/p&gt;
&lt;p&gt;You can use the metadata URL and insert it in the service reference wizard that creates for you the WCF proxy code to access to the services endpoints:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/1526.iistm5.jpg"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/1526.iistm5.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;After the creation of the WCF proxy, you can add a reference to the WCF proxy namespace to your WPF window code, in my case ia called the namespace of the project IISTMTest and the namespace of the proxy ServiceReference1:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;using IISTMTest.ServiceReference1;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;and you can use the proxy classes ManagementServiceClient and&amp;nbsp; MonitoringServiceClient in order to consume the IIS TM services.&lt;/p&gt;
&lt;p&gt;For Example , you can add a Button and a ListBox with a DataTemplate &amp;nbsp;to the WPF Window &amp;nbsp;in order to show some details from the Jobs:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;Window x:Class="IISTMTest.MainWindow"&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Title="MainWindow" Height="350" Width="525"&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="22,12,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ListBox&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Height="100" HorizontalAlignment="Left" Margin="12,73,0,0" Name="listBox1" VerticalAlignment="Top" Width="479" &amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ListBox.ItemTemplate&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DataTemplate&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid.ColumnDefinitions&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ColumnDefinition Width="Auto"/&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ColumnDefinition Width="Auto"/&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ColumnDefinition Width="Auto"/&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid.ColumnDefinitions&amp;gt;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBlock Margin="10,0,0,0" Grid.Column="0" &amp;nbsp;Text="{Binding JobSchedulerId}"/&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBlock &amp;nbsp;Margin="10,0,0,0" Grid.Column="1" Text="{Binding JobSchedulerName}"/&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBlock &amp;nbsp;Margin="10,0,0,0" Grid.Column="2" &amp;nbsp;Text="{Binding EndTime}"/&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DataTemplate&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ListBox.ItemTemplate&amp;gt;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ListBox&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;/Window&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;and in the click event of the button you can write this code:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;nbsp;private void button1_Click(object sender, RoutedEventArgs e)&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MonitoringServiceClient svc = new MonitoringServiceClient();&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int num=svc.GetJobCountByStatus(JobStatus.Finished);&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; JobDetails[]&amp;nbsp; jobs =svc.GetJobDetails(JobStatus.Finished,JobDetailsField.JobSchedulerId, true, 0, num);&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listBox1.ItemsSource = jobs;&amp;nbsp;&amp;nbsp;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And in this way you could list all the finished Jobs and show some properties about these in the ListBox.&lt;/p&gt;
&lt;p&gt;In the IIS TM SDK you can find all the methods available from&amp;nbsp; &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.web.media.transformmanager.imanagementservice(v=VS.90).aspx" target="_blank"&gt;IManagementService&lt;/a&gt; and&amp;nbsp;&amp;nbsp; &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.web.media.transformmanager.imonitoringservice(v=VS.90).aspx" target="_blank"&gt;IMonitoringService&lt;/a&gt; that you can call using the WCF Proxy classes created from the WSDL of the IIS TM service&amp;nbsp;using the Visual Studio service reference wizard.&lt;/p&gt;
&lt;p&gt;Because the methods from the services require that the process that call the services run in the context of a user with administrative elevated privilege, in order to&amp;nbsp; run the exe compiled, you have also to add a .manifest file with the configuration that required the administrative privilege for the .exe. For this reason you have to add&amp;nbsp; a new item to the project&amp;nbsp; and insert an app.manifest file:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/8228.iistm6.jpg"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" border="0" alt="" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/communityserver-blogs-components-weblogfiles/00-00-00-61-67/8228.iistm6.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In the manifest file you have to configure the requestedExecutionLevel in order to require administrative privilege:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp; &amp;lt;assemblyIdentity version="1.0.0.0" name="MyApplication.app"/&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp; &amp;lt;trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;security&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- UAC Manifest Options&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If you want to change the Windows User Account Control level replace the&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; requestedExecutionLevel node with one of the following.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;requestedExecutionLevel&amp;nbsp; level="asInvoker" uiAccess="false" /&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;requestedExecutionLevel&amp;nbsp; level="requireAdministrator" uiAccess="false" /&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;requestedExecutionLevel&amp;nbsp; level="highestAvailable" uiAccess="false" /&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Specifying requestedExecutionLevel node will disable file and registry virtualization.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If you want to utilize File and Registry Virtualization for backward&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; compatibility then delete the requestedExecutionLevel node.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;&amp;nbsp;&amp;nbsp; &amp;lt;requestedExecutionLevel level="requireAdministrator" uiAccess="false" /&amp;gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/requestedPrivileges&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;lt;/security&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp; &amp;lt;/trustInfo&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;/asmv1:assembly&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;After this you can run directly the .exe file.&lt;/p&gt;
&lt;p&gt;Enjoy this new API from IIS TM and start to build great applications for managing videos workflow !!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10176274" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Architecture/">Architecture</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Silverlight/">Silverlight</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IIS7/">IIS7</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Media/">Media</category></item><item><title>JSDay Talks</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/05/12/jsday-talks.aspx</link><pubDate>Thu, 12 May 2011 11:59:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10163750</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10163750</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/05/12/jsday-talks.aspx#comments</comments><description>&lt;p&gt;JSDay Talks:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;&lt;span style="font-size: small;"&gt;Using today HTML5 Video &lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The new HTML5 video and audio tags from the HTML5 specification offer a new powerful way to deliver multimedia content using directly HTML and JS . How we can start to use this new features in our web sites ? In this session we will analyze how to use them to play media in modern browsers and on mobile devices. Learn the most advanced techniques and best practices, including encoding and distribution, custom skinnable players, full screen workarounds, seeking settings and fallback scenarios for legacy browsers.. &lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://cid-d82de3153feb12ed.office.live.com/view.aspx/Public/pinningdemo/video-jsday.pptx"&gt;download slides&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;span style="font-size: small;"&gt;&lt;strong&gt;HTML5, CSS3 &amp;ndash; Opening A Whole New World&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;New web standards like HTML5, CSS3, and ECMAScript, web designers and developers now have a whole new set of tools they can use to build a new class of web applications that are graphically rich and have more immersive experiences than ever before. But do you really know what this new class of HTML5 web applications is capable of? What&amp;rsquo;s in HTML5 that lets us take our sites to the next level? Let&amp;rsquo;s find out! &lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://cid-d82de3153feb12ed.office.live.com/view.aspx/Public/pinningdemo/html5-jsday.pptx"&gt;download slides&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;&lt;strong&gt;&lt;span style="font-size: small;"&gt;&amp;nbsp;The new Internet Explorer: Standards, Performance, Security and the new JavaScript Engine&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Internet Explorer 9 is here and it is a big step forward for Windows&amp;rsquo;s browser. Main areas of improvements for IE9 are: Standards, Performance and Security. In this session we will see how Internet Explorer 9 allows developers to build new and exciting web sites using open web standards like HTML5, CSS3 and more. Today&amp;rsquo;s websites and browsers only use 10% of what your PC offers, but with Internet Explorer 9 you can tap into the power of Windows and your whole PC so your websites look and perform as if they were native to Windows with GPU accelerations and the new JavaScript engine. And because it&amp;rsquo;s build on standards, the same markup you write not only works across the web, but runs faster and delivers a richer experience through Windows and Internet Explorer 9 and 10!. &lt;/p&gt;
&lt;p&gt;&lt;a target="_blank" href="http://cid-d82de3153feb12ed.office.live.com/view.aspx/Public/pinningdemo/IE-jsday.pptx"&gt;download slides&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10163750" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IE/">IE</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/HTML5/">HTML5</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/CSS3/">CSS3</category></item><item><title>W3C Navigation timing raggiunge lo stato di Candidate Raccomandation</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/03/25/w3c-navigation-timing-raggiunge-lo-stato-di-candidate-raccomandation.aspx</link><pubDate>Fri, 25 Mar 2011 09:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10144699</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10144699</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/03/25/w3c-navigation-timing-raggiunge-lo-stato-di-candidate-raccomandation.aspx#comments</comments><description>&lt;p&gt;Sono trascorse solo poche settimane &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/11/17/internet-explorer-9-misurare-le-performance-nelle-pagine-web.aspx"&gt;dal post che ho scritto&lt;/a&gt; relativamente alle API &amp;nbsp;&lt;a target="_blank" href="https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/NavigationTiming/Overview.html"&gt;Navigation Timing&lt;/a&gt; che abbiamo gi&amp;agrave; la specifica in candidate raccomandation, &lt;a target="_blank" href="http://blogs.msdn.com/b/ie/archive/2011/03/18/a-web-standard-quickly-w3c-navigation-timing-reaches-candidate-recommendation.aspx"&gt;come scrive anche il blog ufficiale di IE&lt;/a&gt; a volte le specifiche negli enti di standardizzazione riescono a viaggiare velocemente ed a trovare una convergenza rapida all'interno del working group che le segue (Web Performance working group). Solo sei mesi fa la specifica era nello stato di &lt;a target="_blank" href="http://blogs.msdn.com/b/ie/archive/2010/09/13/web-standards-from-working-draft-to-recommendation.aspx"&gt;Working Draft to&amp;nbsp;Raccomandation&lt;/a&gt;&amp;nbsp;e in poco tempo tutti gli attori del&amp;nbsp;working group da&amp;nbsp;rappresentanti di Opera ,&amp;nbsp;Google, Mozilla e Microsoft hanno lavorato convergendo sulla specifica.&amp;nbsp;Lo stato di Candidate Raccomandation significa appunto che il working group considera la specifica stabile e sufficientemente matura per l'implementazione. &lt;/p&gt;
&lt;p&gt;A partire dalla RC di IE9 la Navigation Timing interface &amp;egrave; implementata senza pi&amp;ugrave; il prefisso del vendor e potete provarla su &lt;a target="_blank" href="http://ie.microsoft.com/testdrive/Performance/msPerformance/Default.html"&gt;questa pagina &lt;/a&gt;del IE Test Drive&lt;/p&gt;
&lt;p&gt;Il working group sta gi&amp;agrave; lavorando a due nuove interfacce &lt;a target="_blank" href="http://test.w3.org/webperf/specs/ResourceTiming/"&gt;Resource Timing&lt;/a&gt;&amp;nbsp;e &lt;a target="_blank" href="http://test.w3.org/webperf/specs/UserTiming/"&gt;User Timing&lt;/a&gt;&amp;nbsp;che aggiungeranno delle&amp;nbsp;&lt;span title="Click for alternate translations" class="hps"&gt;funzionalit&amp;agrave;&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;che&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;consentiranno agli sviluppatori di&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;misurare&lt;/span&gt; ulteriorment &lt;span title="Click for alternate translations" class="hps"&gt;le&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;prestazioni delle singole risorse&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;.&lt;/span&gt; &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10144699" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IE/">IE</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/HTML5/">HTML5</category></item><item><title>Determinare in modo corretto la versione del browser in Internet Explorer 9</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/03/21/determinare-in-modo-corretto-la-versione-di-internet-explorer.aspx</link><pubDate>Mon, 21 Mar 2011 20:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10143775</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10143775</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/03/21/determinare-in-modo-corretto-la-versione-di-internet-explorer.aspx#comments</comments><description>&lt;p&gt;Implementare codice dipendente dalla versione del browser e quindi effettuare quella che si chiama "browser detection code" &amp;egrave; una modalit&amp;agrave; di sviluppo assolutamente da evitare, fonte di complicazioni ed errori&amp;nbsp;come ben messo in evidenza &lt;a target="_blank" href="http://blogs.msdn.com/b/ie/archive/2010/04/14/same-markup-writing-cross-browser-code.aspx"&gt;in questo post sul blog di IE&lt;/a&gt;&amp;nbsp;e come ho anche illustrato&lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/10/13/internet-explorer-9-css-3-opacity-e-alpha-e-browser-detection-code.aspx"&gt; in questo post sul mio blog&lt;/a&gt; che mostra appunto un&amp;nbsp;esempio dei possibil errori derivanti dall'utilizzo di&amp;nbsp;questa tecnica. Ci sono per&amp;ograve; casi in cui&amp;nbsp;pu&amp;ograve; essere&amp;nbsp;utile determinare la &amp;nbsp;versione del browser in uso. Uno dei problemi tipici che mi capita di incontrare relativamente a script sviluppati Internet Explorer &amp;egrave; relativo appunto&amp;nbsp;alla parte di codice che viene utilizzata per determinare la versione di IE. In&amp;nbsp;molti casi gli sviluppatori non tengono in considerazione il comportamento di IE9 relativo alle funzionalit&amp;agrave; di compatibilit&amp;agrave; e quindi dei differenti document mode che il browser supporta e la modalit&amp;agrave; con cui si applicano, scrivendo del codice che produce degli errori nel riconoscimento della versione.&lt;/p&gt;
&lt;p&gt;Per determinare la versione del browser via JS si utilizzano genericamente&amp;nbsp;le API&amp;nbsp;&amp;nbsp;navigator.appVersion, navigator.userAgent e&amp;nbsp;navigator.appName&amp;nbsp;ma spesso nel codice che viene scritto , non si tiene conto delle differenti modalit&amp;agrave; di document mode che Internet Explorer applica, generando quindi degli script che non determinano correttamente la versione del browser. Internet Explorer pu&amp;ograve; infatti, applicare versioni di&amp;nbsp;document mode diverse&amp;nbsp;in base alla struttura del DOCTYPE della pagina&amp;nbsp;e quando&amp;nbsp;viene abilitata la compatibility view, pu&amp;ograve; anche inviare al Web Server uno user agent differente anche nell'header della richiesta HTTP e quindi non soltanto nelle&amp;nbsp;API JS dell'oggetto navigator. &lt;/p&gt;
&lt;p&gt;In &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/cc288325(v=vs.85).aspx"&gt;questo articolo su MSDN trovate&lt;/a&gt; un'ottima descrizione dei differenti document mode di Internet Explorer &lt;a target="_blank" href="http://blogs.msdn.com/b/ie/archive/2010/06/16/ie-s-compatibility-features-for-site-developers.aspx"&gt;ed in questo post&lt;/a&gt;&amp;nbsp;una descrizione del browser mode, del ruolo della compatibility view e del document mode. Determinare il document mode che si applica nell'esecuzione di un a pagina &amp;egrave; molto importante non solo per la versione del browser, ma anche perch&amp;egrave; le funzionalit&amp;agrave; di HTML5 in IE9 vengono implementate solo con l'applicazione del document mode IE9 Standard. E' possibile determinare con facilit&amp;agrave; quale document mode o browser mode viene applicato nella navigazione con IE9 su un sito, utilizzando la developer toolbar. Facendo F12 dopo aver caricato la pagina, comparir&amp;agrave; la developer toolbar e tra i men&amp;ugrave; disponibili troverete anche il browser mode e il document mode che indicano le modalit&amp;agrave; in quel momento in uso, come potete vedere nell'immagine di seguito:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/8712.browsermode.JPG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;i men&amp;ugrave; permettono anche di forzare l'applicazione di uno specifico browser mode o document mode.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Moltissimi script che usano la navigator.appVersion , fanno detect del numero di versione senza tener presente che in caso si applichino document mode precedenti, nella app version viene indicato come primo elemento la versione del browser verso cui il&amp;nbsp;browser sta applicando la compatibilt&amp;agrave;, oltre all'indicazione appunto, della versione&amp;nbsp;del browser.&amp;nbsp;Ad esempio nel caso di rendering di una pagina senza DOCTYPE il browser andr&amp;agrave; a caricarla in&amp;nbsp;quirks mode e avremo per il valore di navigator.appVersion:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;"5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; OfficeLiveConnector.1.4; OfficeLivePatch.1.3; .NET4.0C; .NET4.0E; InfoPath.3; MS-RTC LM 8; Zune 4.7)" &lt;/p&gt;
&lt;p&gt;&amp;nbsp;dove vedete indicato per primo&amp;nbsp;il valore 5.0 proprio perch&amp;egrave; si applica il document mode corrispondente appunto alla modalit&amp;agrave; quirk e viene indicata la versione di IE9 in modalit&amp;agrave; compatibile.&lt;/p&gt;
&lt;p&gt;Per poter determinare correttamente via JavaScript la versione dl browser e distinguerla anche dal document mode in uso nella pagina &amp;egrave; consigliabile usare una funzione come quella indicata di seguito, valida anche per le versioni precedenti e che continuer&amp;agrave; a funzionare anche per le successive versioni di IE&amp;nbsp;:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;function getInternetExplorerVersion()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; var rv = -1;&amp;nbsp;&lt;br /&gt;&amp;nbsp; if (navigator.appName == 'Microsoft Internet Explorer')&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var ua = navigator.userAgent;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var re&amp;nbsp; = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (re.exec(ua) != null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rv = parseFloat( RegExp.$1 );&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; return rv;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;La funzione ritorna -1 nel caso in cui il browser non &amp;egrave; Internet Explorer, altrimenti riporta la versione del browser indipendentemente dal document mode in uso nell'esecuzione della pagina.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10143775" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IE/">IE</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/HTML5/">HTML5</category></item><item><title>HTML5:Manipolare i Pixel con il Canvas</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/02/16/html5-manipolare-i-pixel-con-il-canvas.aspx</link><pubDate>Wed, 16 Feb 2011 09:24:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10129565</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10129565</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/02/16/html5-manipolare-i-pixel-con-il-canvas.aspx#comments</comments><description>&lt;p&gt;Nei precedenti post sul Canvas ho&lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/20/html5-introduzione-al-canvas.aspx"&gt; introdotto le API fondamentali&lt;/a&gt; del context 2D e &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/01/14/html5-canvas-e-animazioni.aspx"&gt;come gestire le animazioni&lt;/a&gt; con questo elemento&amp;nbsp; HTML5 che&amp;nbsp; Internet Explorer 9 possiamo sfruttare avvalendoci della accelerazione grafica garantita dal nuovo browser. &lt;/p&gt;
&lt;p&gt;Un'altra interessante potenzialit&amp;agrave; del Canvas che a partire dalla &lt;a target="_blank" href="http://blogs.msdn.com/b/italy/archive/2011/02/10/internet-explorer-9-rc-disponibile-per-il-download-standard-velocit-224-e-sicurezza.aspx"&gt;RC di IE9&lt;/a&gt; &amp;egrave; stata completata e migliorata significativamente dal punto di vista delle performance, riguarda la possibilit&amp;agrave; di utilizzare le API del Canvas che consentono via JavaScript di manipolare direttamente a livello di Pixel con un approccio RGBA il contenuto del Canvas, consentendo l'applicazione di trasformazioni e manipolazioni del contenuto, utili per costruire interessanti effetti grafici nelle nostre applicazioni Web. La principale API disponibile sul context 2D del Canvas che consente l'accesso ai pixel &amp;egrave; il metodo &lt;strong&gt;getImageData(posX,posY,imgWidth,imgHeight)&lt;/strong&gt;. Questo metodo restituisce un &lt;strong&gt;CanvasPixelsArray&lt;/strong&gt; che contiene essenzialmente i pixel dell'immagine estratta&amp;nbsp;nella propriet&amp;agrave; data&amp;nbsp;alla posizione e con le dimensioni passate al metodo. E' possibile accedere e modificare il contenuto dell'array contenente i pixel e&amp;nbsp;riapplicare l'arrai con le modifiche&amp;nbsp;ad un Canvas in una specifica posizione&amp;nbsp;con il metodo &lt;strong&gt;putImageData(pixelsArray,posX,posY)&lt;/strong&gt; .&lt;/p&gt;
&lt;p&gt;Il &lt;strong&gt;CanvasPixelsArray&lt;/strong&gt; consente di accedere ai pixel come abbiamo detto, con una struttura rgba.Contiene praticamente per ogni pixel 4 posizioni,&amp;nbsp; 3 contengono rispettivamente i valori da 0 a 255 RGB e una contiene l'alpha . Ad esmpio per accedere al parametro alpha del primo pixel estratto con getImageData, occorre accedere all'elemento nella posizione 3 dell'Array, mentre ad esempio nella posizione 4 troviamo il valore R del secondo pixel estratto.&lt;/p&gt;
&lt;p&gt;Di seguito abbiamo un semplice esempio che illustra praticamente l'utilizzo delle API. Nell'esempio viene&amp;nbsp;caricata un immagine in un Canvas e poi accedendo ai pixel, invertito il valore del R di tutti i pixel e ridisegnata l'immagine manipolata nel Canvas:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;lt;!DOCTYPE html /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;html lang="en"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript" language="javascript"&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.onload = function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var myCanvas = document.getElementById('myCanvas');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (myCanvas.getContext) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var ctx = myCanvas.getContext("2d");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var img = new Image();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; img.src = "IELogo.png";&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; img.onload = function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.canvas.height = img.height;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.canvas.width = img.width;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.drawImage(img, 0, 0);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var pixelsArray = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var data = pixelsArray.data;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var i = 0; i &amp;lt; data.length; i += 4) {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data[i+1] = 255 - data[i]; //invert G in&amp;nbsp;pixel&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.putImageData(pixelsArray, 0, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;canvas id="myCanvas"&amp;gt;&lt;br /&gt;&amp;nbsp;Canvas is not supported.&lt;br /&gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Altra interessante API del Canvas che permette di estrarre i pixel e salvarli anche in un file o rileggerli come un immagine direttamente &amp;egrave; il metodo &lt;strong&gt;toDataURL("image/png")&lt;/strong&gt;&amp;nbsp; . La specifica prevede il supporto del formato png con questo metodo e utilizzando questa API si pu&amp;ograve; direttamente estrarre l'immagine. Ad esempio, rimanipolando l'esempio precedente possiamo aggiungere un tag image e quindi , dopo aver impostato a display:none il canvas, disegnare nel tag image il risultato della modifica dell'immagine:&lt;/p&gt;
&lt;p&gt;&amp;lt;!DOCTYPE html /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;html lang="en"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript" language="javascript"&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.onload = function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var myCanvas = document.getElementById('myCanvas');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var im = document.getElementById('im');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (myCanvas.getContext) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var ctx = myCanvas.getContext("2d");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var img = new Image();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; img.src = "IELogo.png";&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; img.onload = function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.canvas.height = img.height;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.canvas.width = img.width;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.drawImage(img, 0, 0);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var pixelsArray = ctx.getImageData(0, 0, ctx.canvas.width, ctx.canvas.height);&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var data = pixelsArray.data;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var i = 0; i &amp;lt; data.length; i += 4) {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data[i + 1] = 255 - data[i]; //invert G&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.putImageData(pixelsArray, 0, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; im.src&amp;nbsp; = ctx.canvas.toDataURL("image/png");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;canvas id="myCanvas" style="display: none"" &amp;gt;&lt;br /&gt;&amp;nbsp;Canvas is not supported.&lt;br /&gt;&amp;lt;/canvas&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;img id="im" /&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;E' possibile anche manipolare i contenuti partendo dal catturare le immagini&amp;nbsp;da un video in riproduzione in un tag video.&amp;nbsp; Di seguito&amp;nbsp; un esempio di utilizzo di questa API per ridisegnare un video che ha uno sfondo uniforme, su uno sfondo differente. Viene usata una funzione js con un interval che ogni&amp;nbsp;50 millisecondi disegna il frame corrente del video in riproduzione su un canvas nascosto e accedendo con &lt;b&gt;getImage()&lt;/b&gt; ad ogni singolo pixel, porta a zero l'alpha&amp;nbsp;dei pixel completamente blu . La funzione&amp;nbsp; prende poi l'immagine manipolata e la ridisegna su un canvas visibile dove viene impostata una immagine differente come background, producendo cos&amp;igrave; la riproduzione del video nel&amp;nbsp;Canvas&amp;nbsp;su un background differente, utilizzando direttamente le API del browser del canvas e del tag video. &lt;/p&gt;
&lt;p&gt;Di seguito il codice della pagina:&lt;/p&gt;
&lt;p&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;style&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; body&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; background: black;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; color: #CCCCCC;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #c2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; background-image: url('Background.jpg');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; background-repeat: no-repeat;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; div&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; float: left;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; border: 1px solid #444444;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; padding: 10px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; margin: 10px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; background: #3B3B3B;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var processor = {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; timerCallback: function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (this.video.paused || this.video.ended) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.computeFrame();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var self = this;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setTimeout(function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.timerCallback();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, 50);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; doLoad: function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.video = document.getElementById("video");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.c1 = document.getElementById("c1");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.ctx1 = this.c1.getContext("2d");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.c2 = document.getElementById("c2");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.ctx2 = this.c2.getContext("2d");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var self = this;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.video.addEventListener("play", function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.width = self.video.videoWidth / 2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.height = self.video.videoHeight / 2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.timerCallback();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; computeFrame: function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.ctx1.drawImage(this.video, 0, 0, this.width, this.height);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var frame = this.ctx1.getImageData(0, 0, this.width, this.height);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var l = frame.data.length / 4;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var data = frame.data;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var i = 0; i &amp;lt; l; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var r = data[i * 4 + 0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var g = data[i * 4 + 1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var b = data[i * 4 + 2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (g == 0 &amp;amp;&amp;amp; r == 0 &amp;amp;&amp;amp; b == 255)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data[i * 4 + 3] = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.ctx2.putImageData(frame, 0, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body onload="processor.doLoad()"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;video id="video" src="video.mp4" controls width="336" height="256"&amp;nbsp; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;canvas id="c1" width="336" height="256" style="display: none"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;canvas id="c2" width="336" height="256"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;
&lt;p&gt;e qui il risultato nel browser:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/4087.videoeffect.jpg" border="0" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10129565" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IE/">IE</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/HTML5/">HTML5</category></item><item><title>IIS Media Services 4 Integrated Media Platform, Streaming for PC, Windows Phone and iPhone™ / iPad™ with a Single Platform : A good example from Mediaset RTI New Media</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/02/05/iis-media-services-4-integrated-media-platform-streaming-for-pc-windows-phone-and-iphone-ipad-with-a-single-platform-a-good-example-from-mediaset-rti-new-media.aspx</link><pubDate>Sat, 05 Feb 2011 15:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10124436</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10124436</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/02/05/iis-media-services-4-integrated-media-platform-streaming-for-pc-windows-phone-and-iphone-ipad-with-a-single-platform-a-good-example-from-mediaset-rti-new-media.aspx#comments</comments><description>&lt;p&gt;One of the missions of IIS Media Services&amp;nbsp; 4.0 (IIS MS) is to offer an &lt;a target="_blank" href="http://www.iis.net/overview/IntegratedMediaPlatform"&gt;Integrated Media Platform&lt;/a&gt; that allows users to use a single encoder and a single backend to serve video content live and on-demand to a large numbers of client devices spanning from PC , MAC, Windows Phone 7 and iPhone&lt;sup&gt;TM&lt;/sup&gt;\iPad&lt;sup&gt;TM&lt;/sup&gt; .&lt;/p&gt;
&lt;p&gt;A good example of this capability, currently available in Italy, is from RTI New Media - Mediaset. Mediaset is one of the top broadcasters in Italy and RTI New Media inside Mediaset Group is responsible for their web video platform and in particular for video.mediaset.it web site. Video.mediaset.it publishes free live and on demand video content supported by an advertising model from main Mediaset TV channels. In addition, on the same web site RTI new media publishes daily all of the video news content for the TGCOM web site and for SportMediaset web site that are top tier web sites in Italy in terms of importance and number of visitors. Below is an image from the Mediaset web site :&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/3312.MEDIASET.jpg" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Content from the &lt;a href="http://video.mediaset.it"&gt;http://video.mediaset.it&lt;/a&gt;&amp;nbsp; and&amp;nbsp; &lt;a href="http://www.tgcom.mediaset.it/"&gt;http://www.tgcom.mediaset.it/&lt;/a&gt;&amp;nbsp; web site is available on PC and Mac and for news content videos are available also on Windows Phone 7 and iPhone&lt;sup&gt;TM&lt;/sup&gt; / iPad&lt;sup&gt;TM&lt;/sup&gt; devices with a downloadable application. Below is an image from the Windows Phone 7 application:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/0285.screen_5F00_tgcom.jpg" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;The video platform in use on this Web Site is based on the IIS Media Services platform which permits the delivery of &amp;nbsp;adaptive HTTP streaming and progressive download . Key features of the service include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;SnackTV content that delivers free short videos from main Mediaset TV channels and leverages .mp4 and .fv4 content, delivered via IIS Media Services progressive download and &lt;a href="http://www.iis.net/download/BitRateThrottling"&gt;Bit Rate Throttling&lt;/a&gt; capability in IIS Media Services. &lt;/li&gt;
&lt;li&gt;Full episode area (puntate intere) that deliver content from TV shows, fictions, etc. from the main Mediaset TV channels, that leverage IIS Media Services and IIS &lt;a href="http://www.iis.net/download/SmoothStreaming"&gt;Smooth Streaming&lt;/a&gt; and Silverlight for deliver of high quality content with the best experience for customers. Some content is also securely delivered using &lt;a href="http://www.microsoft.com/playready/"&gt;Microsoft Playready&lt;/a&gt; DRM for content protection. &lt;/li&gt;
&lt;li&gt;Moto GP and Sport that also leverage IIS &lt;a href="http://www.iis.net/download/SmoothStreaming"&gt;Smooth Streaming&lt;/a&gt; , Silverlight and &lt;a href="http://www.microsoft.com/playready/"&gt;Microsoft Playready&lt;/a&gt; DRM for secure delivery of premium content. &lt;/li&gt;
&lt;li&gt;News videos live and on demand that also leverages IIS Media Services and IIS &lt;a href="http://www.iis.net/download/SmoothStreaming"&gt;Smooth Streaming&lt;/a&gt; and Windows Media Services.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As I described before, some video content in particular from the news area are also available on Windows Phone 7 and Apple Devices. For delivery of &amp;nbsp;this type of content on mobile devices, RTI New Media uses &lt;a href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/11/iis-media-services-4-integrated-media-platform-streaming-for-pc-windows-phone-tv-and-iphone-ipad-with-a-single-platform.aspx"&gt;IIS Media Services features&lt;/a&gt; . On Windows Phone 7 the application is built using the IIS &lt;a&gt;&lt;/a&gt;&lt;a href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/11/iis-media-services-4-integrated-media-platform-streaming-for-pc-windows-phone-tv-and-iphone-ipad-with-a-single-platform.aspx"&gt;Smooth Streaming Client&lt;/a&gt; and Silverlight.&amp;nbsp; This&amp;nbsp; combinationgives the phone the ability to stream live and on-demand adaptive HTTP content in the IIS Smooth Streaming format On Apple Devices, RTI leverage IIS Media Services new capabilities to deliver Apple HTTP live streaming format for both live and on-demand.&lt;/p&gt;
&lt;p&gt;The content was encoded in Smooth Streaming format using the H.264 video codec and AAC audio, and was transmuxed (repackaged from one file format to another without re-encoding) to Apple HTTP live streaming format using the&amp;nbsp; &lt;a href="http://www.iis.net/download/TransformManager"&gt;IIS Transform Manager&lt;/a&gt; (currently in Beta) , leveraging a single encoding and delivery platform.&lt;/p&gt;
&lt;p&gt;IIS Transform Manager (IIS TM) &amp;nbsp;is a new component of the next version of the IIS Media Services platform and provides not only &amp;nbsp;Iphone/Ipad support but also a simple integrated video encoding/encrypting and batch conversion and transformation of video files. IIS Transform Manager integrates directly with Expression Encoder 4 to allow you to use "watch folders" to queue up multiple encode jobs on your server and deliver them directly to IIS Media Services 4.0 Web folders as IIS Smooth Streaming presentations. Transform Manager offer also an SDK that permits developers to write custom Task plug-ins that can be used with Transform Manager to support custom actions, third-party encoders, or your own custom workflows. Transform Manager comes with a specific task that RTI New Media leverage to convert IIS Smooth Streaming presentations directly into MPEG-2 Transport Streams in the Apple HTTP live streaming format for delivering content to Apple devices and publish it with IIS Media Services 4.0.&lt;/p&gt;
&lt;p&gt;The video platform on video.mediaset.it also benefits from the use of &lt;a href="http://www.iis.net/download/ApplicationRequestRouting"&gt;IIS Application Request Routing ( IIS ARR)&lt;/a&gt; in order to implement a flexible and scalable HTTP edge server infrastructure. Edge caching in the HTTP delivery infrastructure provides a level of caching able to amplify content delivery capability on video.mediaset.it with the right and flexible scalability.&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Below you can see a high level picture of the video delivery architecture:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/0118.mediasetarch.jpg" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;The services delivered on video.mediaset.it from RTI new media are a great example of the integrated media platform capabilities of IIS Media Services and shows how quick it is to implement a robust and interoperable solution that simplifies the delivery of video content for both live and on-demand to a large numbers of different client devices on a single platform.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;If you are looking for more details &amp;nbsp;about the latest support for iPhone\iPad in IIS Media Services and&amp;nbsp; IIS Transform Manager you can reference this online &lt;a target="_blank" href="http://learn.iis.net/page.aspx/857/encode-and-deliver-on-demand-smooth-streams-with-iis-transform-manager-and-iis-media-services-4/"&gt;tutorial, "Encode and Deliver On-Demand Smooth Streams with IIS Transform Manager and IIS Media Services 4&lt;/a&gt;&lt;span style="text-decoration: underline;"&gt;"&lt;/span&gt; &amp;nbsp;and for details on Live Streaming, read this &lt;a href="http://learn.iis.net/page.aspx/854/apple-http-live-streaming-with-iis-media-services/"&gt;tutorial on Live Streaming for iPhone/iPad with IIS MS 4.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To download the latest release of the IIS Media Services platform and learn more, visit &lt;a href="http://iis.net/media"&gt;http://iis.net/media&lt;/a&gt;&amp;nbsp;and stay tuned for the Beta of IIS TM that coming soon&amp;nbsp;in march\april timeframe&amp;nbsp;!!!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10124436" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Silverlight/">Silverlight</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IIS7/">IIS7</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Media/">Media</category></item><item><title>HTML5: Un database per il browser con IndexedDB per andare oltre il Web Storage</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/01/21/html5-labs-un-database-per-il-browser-con-indexed-db.aspx</link><pubDate>Fri, 21 Jan 2011 08:20:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10118049</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10118049</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/01/21/html5-labs-un-database-per-il-browser-con-indexed-db.aspx#comments</comments><description>&lt;p&gt;La possibilit&amp;agrave; di gestire localmente nel browser uno storage per le applicazioni accessibile direttamente via JavaScript &amp;egrave; sicuramente una delle funzionalit&amp;agrave;&amp;nbsp;tra le pi&amp;ugrave; desiderate e potenzialmente utili per arricchire le applicazioni Web, incrementarne le performance,&amp;nbsp;gestire sempre pi&amp;ugrave; la possibilit&amp;agrave; di scenari di offline. Un primo importante passo nelle specifiche HTML5 verso la possibilit&amp;agrave; di utilizzare uno storage client locale &amp;egrave; rappresentato dalle specifiche del &lt;a href="http://www.w3.org/TR/webstorage/" target="_blank"&gt;WebStorage&lt;/a&gt; che sono ampiamente supportate nei diversi browser e presenti anche in IE a partire dalla versione 8 . Il WebStorage permette per&amp;ograve; di gestire la persistenza di elementi in modo simile a quanto possibile fare con cookie superando per&amp;ograve; le limitazioni ed in particolare la complicazione non indifferente nella gestione dei cookie stessi.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Le API del Web Storage offrono essenzialmente due oggetti il &lt;em&gt;sessionStorage &lt;/em&gt;e il &lt;em&gt;localStorage&lt;/em&gt; che consentono di gestire un meccanismo di persistenza per dominio in modalit&amp;agrave; per sessione o persistente. L'utilizzo &amp;egrave; molto semplice, si usano i metodi &lt;em&gt;setItem &lt;/em&gt;e &lt;em&gt;removeItem&lt;/em&gt; per inserire e cancellare item utilizzando un meccanismo chiave valore . Ad esempio per inserire un valore:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;localStorage.setItem("keyName","keyValue");&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;per rimuoverlo:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;localStorage.removeItem("keyName");&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Disponibili anche una buona serie di librerie che consentono di gestire il fallback sui browser che non supportano il Web Storage come ad esempio la libreria&amp;nbsp;&lt;a href="http://gist.github.com/350433" target="_blank"&gt;storage polyfill&lt;/a&gt; di Remy Sharp.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Ampia e continua la discussione nel W3C per ampliare il supporto nel browser per lo storage locale,&amp;nbsp;allargandolo anche alla presenza di un vero e proprio&amp;nbsp;database semplificato&amp;nbsp;che consenta di memorizzare e gestire dati in modo strutturato e apra la strada a scenari di sincronizzazione di dati. Tra le specifiche proposte abbiamo la Web SQL Database API e la parte di &lt;a href="http://www.w3.org/TR/IndexedDB/" target="_blank"&gt;IndexedDB &lt;/a&gt;. Quest'ultima &amp;egrave; la specifica proposta da Oracle , Microsoft e Mozilla, su cui stanno convergendo la maggior parte dei membri del W3C, &lt;a href="http://news.cnet.com/8301-30685_3-20000376-264.html?tag=mncol;title" target="_blank"&gt;convergenza gi&amp;agrave;&amp;nbsp;in corso come tendenza da alcuni mesi &lt;/a&gt;e che comincia a concretizzarsi&amp;nbsp;anche in annunci di implementazione nei browser&amp;nbsp;&lt;a href="http://news.cnet.com/8301-30685_3-20028379-264.html?tag=mncol;1n" target="_blank"&gt;come ad esempio per firefox&lt;/a&gt;. Anche per chrome sta succedendo altrettanto&amp;nbsp; con l'avvio dell'implementazione di IndexedDB e nella parte di &lt;a href="http://www.w3.org/TR/webdatabase/" target="_blank"&gt;Web SQL Database nelle specifiche del W3C si legge&lt;/a&gt; oramai formalmente nello status del documento: "Beware. This specification is no longer in active maintenance and the WebApplications Working Group does not intend to maintain it further"&amp;nbsp;ed &amp;egrave; quindi oramai IndexedDB la specifica candidata&amp;nbsp;per l'implementazione da parte della maggior parte dei browser. Stiamo comunque parlando di specifiche di standard ancora in definizione e quindi&amp;nbsp;immature&amp;nbsp;per un utilizzo di applicazioni reali e che quindi vanno utilizzate con cautela, come anche i diversi vendor di browser segnalano. Ad esempio &lt;a href="http://hacks.mozilla.org/2011/01/indexeddb-in-firefox-4/" target="_blank"&gt;in questo post sull'implementazione&amp;nbsp;nella beta di&amp;nbsp;firefox&lt;/a&gt; leggiamo "Keep in mind that IndexedDB is brand new and is not uniformly supported by all browsers, and please file bugs for any behavior that seems to contradict the specification!".&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span id="result_box" lang="it"&gt;&lt;span class="hps" title="Click for alternate translations"&gt;Il&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;Web&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;&amp;egrave; una&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;piattaforma&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;in continua evoluzione&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;,&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;e&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;ci&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;sar&amp;agrave; sempre&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;una tensione&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;tra&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;gli sviluppatori&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;che desiderano&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;utilizzare le&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;tecnologie&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;pi&amp;ugrave; recenti e &lt;/span&gt;&lt;span class="hps" title="Click for alternate translations"&gt;le specifiche ufficiali&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;ancora non&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;consentono&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;, e&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;gli sviluppatori&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;di&amp;nbsp; applicazioni di business&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;che&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;vogliono&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;costruire&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;qualcosa&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;per&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;una specifica&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;che si aspettano stabile e supportata&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Click for alternate translations"&gt;per un&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;decennio&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;.&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;Non in tutte le situazioni&amp;nbsp;&amp;egrave; possibile &lt;/span&gt;&lt;span class="hps" title="Click for alternate translations"&gt;aggiornare&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;i&amp;nbsp;b&lt;/span&gt;&lt;span class="hps" title="Click for alternate translations"&gt;rowser&lt;/span&gt; e le applicazioni &lt;span class="hps" title="Click for alternate translations"&gt;ogni notte&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;o&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;anche&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;ogni settimana, ma al tempo stesso &amp;egrave; anche importante avere la possibilit&amp;agrave; di valutare l'implementazione di specifiche ancora non complete e di stimolare e partecipare all'implemetazione delle stesse&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;&lt;/span&gt;&lt;/span&gt;Per permettere il test&amp;nbsp;delle specifiche in evoluzione e garantire&amp;nbsp;allo stesso tempo, una chiara e netta suddivisione tra le specifiche stabili ed utilizzabili e la parte di specifiche sperimentali, Microsoft sta adottando nello sviluppo di IE un approccio differente rispetto ad altri&amp;nbsp;browser che inserisco e modificano le implementazioni direttamente nelle build , generando anche situazioni di confusione come successo recentemente con i websocket (&lt;a href="http://hacks.mozilla.org/2010/12/websockets-disabled-in-firefox-4/"&gt;http://hacks.mozilla.org/2010/12/websockets-disabled-in-firefox-4/&lt;/a&gt;)&amp;nbsp;. Nelle preview e nelle beta ed a maggior ragione nelle release finali delle varie versioni di IE, vengono inserite soltanto le implementazioni delle specifiche che sono sufficientemente mature, documentate e che hanno la garanzia di un comportamento uniforme&amp;nbsp;nelle diverse implementazioni nei vari browser. Per consentire invece, la sperimentazione anche della parte di specifiche in evoluzione e che sono candidate ad una futura implementazione uniforme, sono stati appunto creati gli &lt;a href="http://blogs.msdn.com/b/italy/archive/2010/12/21/htlm5-labs-sviluppare-i-siti-di-oggi-e-sperimentare-da-subito-le-specifiche-html-di-domani.aspx" target="_blank"&gt;HTML5 Labs&lt;/a&gt; . Attraverso gli HTML5 Labs si possono aggiungere al browser delle implementazioni sperimentali delle nuove specifiche e cominciare a provarle utilizzandole in modo controllato, avendo cos&amp;igrave; una netta separazione tra gli elementi stabili da quelli in forte evoluzione, garantendo pienamente gli sviluppatori rispetto alla stabilit&amp;agrave; e la compatibilit&amp;agrave; delle implementazioni supportate nel browser.&lt;/p&gt;
&lt;p&gt;Tra le specifiche disponibili come componenti aggiuntivi su HTML5 Labs abbiamo appunto l'implementazione di &lt;a href="http://html5labs.interoperabilitybridges.com/prototypes/indexeddb/indexeddb/info" target="_blank"&gt;IndexedDB che possiamo scaricare&lt;/a&gt; dal sito e registrare localmente sul nostro PC per sperimentarla utilizzando IE 9. Si come gi&amp;agrave; detto, di una implementazione per test&amp;nbsp; realizzata attraverso un ActiveX.&amp;nbsp;Nel package scaricato da HTML5 Labs troviamo un readme introduttivo che spiega come configurare e registrare il componente aggiuntivo , un file js di base che carica il componente nella pagina e genera delle variabili per consentire un utilizzo diretto dei metodi dell'ActiveX da JS e una serie di esempi che illustrano il funzionamento delle API implementate al momento secondo&amp;nbsp;.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;IndexedDB prevede essenzialmente delle API con due modalit&amp;agrave; di utilizzo: sincrono e asincrono. Si possono creare dei database locali comuni ad uno specifico dominio. Attraverso le API&amp;nbsp;&lt;span id="result_box" lang="it"&gt;&lt;span class="hps" title="Click for alternate translations"&gt;si possono gestire&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Click for alternate translations"&gt;&lt;span class="hps" title="Click for alternate translations"&gt;gestione&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;dei dati&lt;/span&gt;&amp;nbsp;&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;avanzate attraverso la&amp;nbsp;gestione di&amp;nbsp;indici per l'accesso ai dati. Si possono anche utilizzare delle&amp;nbsp;&lt;/span&gt;&lt;span class="hps" title="Click for alternate translations"&gt;transazioni per la gestione di pi&amp;ugrave; operazioni sui dati&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Click for alternate translations"&gt;e vengono usati&amp;nbsp;dei &lt;/span&gt;&lt;span class="hps" title="Click for alternate translations"&gt;di&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;dati&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;persistenti&lt;/span&gt; in una struttura &lt;span class="hps" title="Click for alternate translations"&gt;B&lt;/span&gt;&lt;span class="atn" title="Click for alternate translations"&gt;-&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;tree&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;che permettono in modo &lt;/span&gt;&lt;span class="hps" title="Click for alternate translations"&gt;efficace&lt;/span&gt;&amp;nbsp; &lt;span class="hps" title="Click for alternate translations"&gt;l'inserimento,&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;cancellazione&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;,&amp;nbsp;e&lt;/span&gt;&amp;nbsp;&lt;span class="hps" title="Click for alternate translations"&gt;accesso&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;in&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;-order&lt;/span&gt; anche &lt;span class="hps" title="Click for alternate translations"&gt;di&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;un numero elevato&lt;/span&gt;&lt;span class="hps" title="Click for alternate translations"&gt;&amp;nbsp;di record&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;di dati&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div id="gt-res-tools" class="g-section"&gt;Di seguito riporto un semplice esempio di creazione\accesso ad un database locale con la parte di API sincrone:&lt;/div&gt;
&lt;div class="g-section"&gt;&lt;/div&gt;
&lt;div class="g-section"&gt;&lt;em&gt;try &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var db = indexedDBSync.open(indexedDBName, indexedDBDescription);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (db) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; db.setVersion("1.0");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var sName = db.name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var dVersion = db.version;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var dTableNames = db.objectStoreNames;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var strNames = "IndexedDB name: "&amp;nbsp; + sName &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + "; version: " + dVersion + "; object stores: ";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var i = 0; i &amp;lt; dTableNames.length; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; strNames = strNames + dTableNames[i] + ", ";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(strNames);&lt;/em&gt;&lt;/div&gt;
&lt;div class="g-section"&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; db.close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (e) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert("Error: " + e.message);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/em&gt;&lt;/div&gt;
&lt;div class="g-section"&gt;&lt;/div&gt;
&lt;div class="g-section"&gt;&lt;/div&gt;
&lt;div class="g-section"&gt;&lt;/div&gt;
&lt;div class="g-section"&gt;Si possono poi creare degli indici e inserire contenuti ed accederci direttamente attrraverso l'indice stesso ed il semplice esempio descrittivo che trovate nella specifica e che riporto di seguito da un idea della modalit&amp;agrave; di utilizzo:&lt;/div&gt;
&lt;div class="g-section"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class="g-section"&gt;&lt;em&gt;var db = indexedDB.open('books', 'Book store', false);&lt;br /&gt;if (db.version !== '1.0') {&lt;br /&gt;&amp;nbsp; var olddb = indexedDB.open('books', 'Book store');&lt;br /&gt;&amp;nbsp; olddb.createObjectStore('books', 'isbn');&lt;br /&gt;&amp;nbsp; olddb.createIndex('BookAuthor', 'books', 'author', false);&lt;br /&gt;&amp;nbsp; olddb.setVersion("1.0");&amp;nbsp; &lt;br /&gt;}&lt;br /&gt;// db.version === "1.0";&amp;nbsp; &lt;br /&gt;var index = db.openIndex('BookAuthor');&lt;br /&gt;var matching = index.get('fred');&lt;br /&gt;if (matching)&lt;br /&gt;&amp;nbsp; report(matching.isbn, matching.name, matching.author);&lt;br /&gt;else&lt;br /&gt;&amp;nbsp; report(null);&lt;/em&gt;&lt;/div&gt;
&lt;div class="g-section"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class="g-section"&gt;Nel caso di utilizzo delle API asincrone si possono impostare direttamente le funzioni su cui essere richiamati ad esecuzione ultimata come nel seguente esempio tratto sempre dal documento della specifica:&lt;/div&gt;
&lt;div class="g-section"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class="g-section"&gt;&lt;em&gt;function findFred() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var store = db.objectStore('books');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var index = store.index('BookAuthor');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var req = index.get('fred');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; req.onsuccess = function(event) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var matching = event.result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; report(matching.isbn, matching.name, matching.author);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; req.onerror = function(event) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; report(null);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;/em&gt;&lt;/div&gt;
&lt;div class="g-section"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class="g-section"&gt;&lt;/div&gt;
&lt;div class="g-section"&gt;&lt;/div&gt;
&lt;div class="g-section"&gt;&lt;/div&gt;
&lt;div class="g-section"&gt;&lt;/div&gt;
&lt;div class="g-section"&gt;Scaricando &lt;a href="http://html5labs.interoperabilitybridges.com/prototypes/indexeddb/indexeddb/" target="_blank"&gt;l'implementazione di test da HTML5 Labs&lt;/a&gt;, trovate ulteriori esempi per poter approfondire l'utilizzo di questa specifica in elaborazione.&lt;/div&gt;
&lt;div class="g-section"&gt;&lt;/div&gt;
&lt;div class="g-section"&gt;UPDATED 4-feb-2011:&lt;/div&gt;
&lt;div class="g-section"&gt;Aggiornata l'implementazione su HTML5 Labs di Indexed DB . Informazioni sull'aggiornamento nel blog &lt;a href="http://blogs.msdn.com/b/interoperability/archive/2011/02/03/the-indexeddb-prototype-gets-an-update.aspx"&gt;http://blogs.msdn.com/b/interoperability/archive/2011/02/03/the-indexeddb-prototype-gets-an-update.aspx&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10118049" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IE/">IE</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/HTML5/">HTML5</category></item><item><title>HTML5:Canvas e animazioni</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/01/14/html5-canvas-e-animazioni.aspx</link><pubDate>Fri, 14 Jan 2011 10:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10114635</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10114635</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/01/14/html5-canvas-e-animazioni.aspx#comments</comments><description>&lt;p&gt;Nel precedente &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/20/html5-introduzione-al-canvas.aspx"&gt;post sul Canvas&lt;/a&gt; ho descritto l'utilizzo del nuovo tag HTML5 e le API JavaScript che permettono di programmarlo. &lt;span class="long_text" lang="it" id="result_box"&gt;&lt;span&gt;Per riassumere quello che abbiamo discusso nel precedente post:&lt;br /&gt;&lt;/span&gt;&lt;span&gt;- il Canvas fornisce una superficie di disegno immediato&lt;br /&gt;&lt;/span&gt;&lt;span&gt;- gli sviluppatori Web utilizzano le API JS esposte dal Canvas per disegnare varie primitive grafiche direttamente sulla superfice del Canvas stesso&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;Cercher&amp;ograve; ora di introdurre le modalit&amp;agrave; con cui &amp;egrave; possibile gestire con JS delle animazioni sfruttando il context 2D del Canvas. La gestione delle animazioni con il Canvas pu&amp;ograve; essere effettuata attraverso la modifica diretta del suo contenuto, sfruttando delle funzioni JS richiamate ad intervalli specifici, con una frequenza determinata in base al frame rate che si vuole ottenere nella gestione del ridisegno del movimento. Si procede in pratica &amp;nbsp;ad intervalli con:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;- cancellare&amp;nbsp;l'area canvas coinvolta&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;- ridisegnare l'elemento nella nuova posizione&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;Di seguito un semplice esempio di animazione dove abbiamo una pagina contenente un canvas&amp;nbsp;e una funzione draw che ogni 10 millisecondi ridisegna il canvas, producendo un'animazione di scorrimento di una immagine. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;Il processo di avvio dell'intervallo di ridisegno, viene&amp;nbsp;eseguito solo dopo il load dell'immagine per avere tutti gli elementi, scaricati localmente e quindi utilizzabili per l'esecuzione dell'animazione.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;em&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;em&gt;&amp;lt;html lang="en"&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;br /&gt;&lt;em&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title title="test anim"&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;meta charset="utf-8" /&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;em&gt;&amp;nbsp;&amp;lt;script language="javascript" type="text/javascript"&amp;gt; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var myCanvas, ctx;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var x1=10,y1=10, distance=5;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var img;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var imgWidth;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var imgHeight;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;window.addEventListener("DOMContentLoaded", Main, false); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;function Main(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;myCanvas = document.getElementById("myCanvas");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (myCanvas.getContext) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx = myCanvas.getContext("2d");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;img = new Image();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;img.addEventListener("load", function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imgWidth = 100;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imgHeight = 100;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastFrameTime = new Date().getTime();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setInterval(draw, 16);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}, false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;img.src = "IELogo.png";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/em&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;function draw() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;y1 += distance; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// make image show up again when it falls of the page&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (y1 &amp;gt; (ctx.canvas.height - imgHeight)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y1 = 10;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.fillText("Sample Animation", x1, 10);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.drawImage(img, x1, y1, imgWidth, imgHeight);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;lt;canvas id="myCanvas" width="500" height="500"&amp;gt;&lt;br /&gt;&amp;nbsp;Canvas is not supported.&lt;br /&gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Come si vede dal codice contenuto nella funzione draw, viene usata una variabile per mantenere la posizione dell'ultimo ridisegno all'interno del canvas e, dopo aver cancellato il canvas, con le&amp;nbsp;API del context 2D si ridisegna l'elemento&amp;nbsp;nella nuova posizione. Richiamando la funzione draw con un intervallo di 16 millisecondi , si produce una animazione&amp;nbsp;con teoricamente 60 frame al secondo, dipendente ovviamente dalla velocit&amp;agrave; con&amp;nbsp;cui il browser esegue la funzione di ridisegno.&amp;nbsp;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;E' anche possibile applicare delle trasformazioni usando le&amp;nbsp;API specifiche&amp;nbsp;&amp;nbsp;del canvas&amp;nbsp;(rotate, translate, transform ) durante un'&lt;/span&gt;&lt;/span&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;animazione per gestire il funzionamento&amp;nbsp;della stessa. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;Oltre alla precedente modalit&amp;agrave; di cancellazione e riscrittura, le API del canvas offrono la possibilit&amp;agrave; di gestire lo stato del contenuto prima di applicare un nuovo disegno. Attraverso i metodi &lt;em&gt;save&lt;/em&gt; e &lt;em&gt;restore&lt;/em&gt; &amp;egrave; possibile gestire lo stato e salvarlo prima di applicare una trasformazione e con save, riportarlo nello stato precedente, funzione molto utile nel caso in cui si debba, ad esempio, ridisegnare pi&amp;ugrave; elementi in una animazione. Ad esempio se si devono disegnare pi&amp;ugrave; elementi in sequenza si pu&amp;ograve; utilizzare questa funzionalit&amp;agrave;:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;for(var a=1;i&amp;lt;10;i++)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;ctx.save();&lt;br /&gt;&amp;nbsp;ctx.translate(a,a);&lt;br /&gt;&amp;nbsp;drawSomething();&lt;br /&gt;&amp;nbsp;ctx.restore();&lt;br /&gt;}&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;Nel caso di&amp;nbsp; IE9 nelle animazioni&amp;nbsp;di immagini, il ridisegno delle stesse sfrutta le capacit&amp;agrave; della GPU e consente di ottenere delle per eccellenti, sfruttando intervalli di ridisegno che consentono di ottenere un elevatissimo numero di frame al secondo con una eccellente esperienza utente ed un ottima fluidit&amp;agrave; nelle animazioni. Un bel esempio di animazioni lo trovate nel &lt;a target="_blank" href="http://ie.microsoft.com/TEStdrive/"&gt;Test Drive Center &lt;/a&gt;&amp;nbsp;come ad esempio l'applicazione &lt;a target="_blank" href="http://ie.microsoft.com/TEStdrive/Performance/FishIETank/Default.html"&gt;fishIETank&lt;/a&gt; e &lt;a target="_blank" href="http://ie.microsoft.com/TEStdrive/Performance/Galactic/Default.html"&gt;Galactic&lt;/a&gt; . Anche nel gi&amp;agrave; citato &lt;a target="_blank" href="http://ie.microsoft.com/TEStdrive/Graphics/CanvasPad/Default.html"&gt;Canvas Pad&lt;/a&gt; trovate un esempio di animazione utile per approfondire l'utilizzo del canvas per questo tipo di operazione.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;Una delle&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;fasi&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;dell'animazione&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;&amp;egrave; quello di&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;rendere&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;una immagine&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps atn"&gt;(&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;o&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;una cella&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;singola animazione&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;)&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;nella&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;posizione&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;specifica&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;e ci sono&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;due&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;principali tecniche&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;di&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;calcolo della&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;posizione specifica.&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;Queste&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;tecniche di&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;animazione&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;sono&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span title="Click for alternate translations" class="hps"&gt;- Animazione&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;frame&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;-based&lt;/span&gt;&lt;br /&gt;&lt;span title="Click for alternate translations" class="hps"&gt;- Animazioni&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;time-based&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span title="Click for alternate translations" class="hps"&gt;Nell'&lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;animazione&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;frame&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;-based&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;oggetti&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;vengono spostati&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;lo stesso numero&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;di&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;pixel&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;in&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;ogni aggiornamento.&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;Nelle&lt;/span&gt;&amp;nbsp;time-based lo spostamento &amp;egrave;&amp;nbsp;&lt;span title="Click for alternate translations" class="hps"&gt;basato sul tempo e&lt;/span&gt;&amp;nbsp;&lt;span title="Click for alternate translations" class="hps"&gt;vengono spostati&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;lo stesso numero&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;di&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;pixel per&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;unit&amp;agrave;&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;di&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;tempo&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;. Ognuno dei due approcci ha vantaggi e svantaggi ed &amp;egrave; pi&amp;ugrave; idoneo in determinati scenari.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;span title="Click for alternate translations"&gt;&amp;nbsp;L'animazione frame-based&amp;nbsp;&lt;span title="Click for alternate translations" class="hps"&gt;&amp;egrave; semplice da&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;implementare&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;ma &amp;egrave; fortemente&amp;nbsp;dipendente dalla velocit&amp;agrave; del PC cos&amp;igrave; come lo spazio percorso dall'animazione non &amp;egrave; costante e per tanto questo tipo di tecnica &amp;egrave; poco usata nei giochi e di pi&amp;ugrave; per animazioni che non hanno dei percorsi di dimensione predefinita in una specifica unit&amp;agrave; di tempo. Di seguito un semplice esempio di frame-base animation, dove ctx &amp;egrave; il context 2d del canvas,&amp;nbsp;che in questo caso cancella completamente il canvas perch&amp;egrave; abbiamo un unico oggetto presente nell'animazione:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;span title="Click for alternate translations"&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;em&gt;var distance=5 lastFrameTime = 0;&lt;br /&gt;setInterval(drawTimeBased, 16);&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;span title="Click for alternate translations"&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;em&gt;function drawFrameBased() {&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;span title="Click for alternate translations"&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;em&gt;y1 += distance; &lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;span title="Click for alternate translations"&gt;&lt;span title="Click for alternate translations" class="hps"&gt;ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);&lt;br /&gt;ctx.drawImage(img, x1, y1, imgWidth, imgHeight);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;span title="Click for alternate translations"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;span title="Click for alternate translations"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Di seguito abbiamo un esempio di questo&amp;nbsp;tipo di animazione &amp;nbsp;applicata ad un canvas sovrapposto ad un video, che illustra la flessibilit&amp;agrave; con cui il canvas pu&amp;ograve; essere usato anche per gestire animazioni in overlay ad un video, come ad esempio banner pubblicitari o altri elementi interattivi:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;video id="myVideo" src="fish.mp4"&amp;nbsp; height="480" width="640"autoplay controls loop&amp;gt;&lt;br /&gt;&amp;nbsp;Video is not supported.&lt;br /&gt;&amp;lt;/video&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;canvas id="myCanvas"&amp;nbsp; height="480" width="640" style="left: 0px; top: 0px; position: absolute;" &amp;gt;&lt;br /&gt;&amp;nbsp;Canvas is not supported&lt;br /&gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;script language="javascript"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; window.addEventListener("load", Main, false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var y1 = 10, distance = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var customText = "Canvas text on top of video";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var ctx;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var msg;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function Main() {&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg = document.getElementById("msg");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myCanvas = document.getElementById("myCanvas");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (myCanvas.getContext) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx = myCanvas.getContext("2d");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.shadowOffsetX = 5;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.shadowOffsetY = 5;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.shadowBlur = 5;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.shadowColor = "grey";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.fillStyle = "black";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.font = '35px "Segoe UI" bold';&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setInterval(draw, 16);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function draw() {&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (distance &amp;lt; 0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; distance = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y1 += distance;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // make text show up again when it falls of the page&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (y1 &amp;gt; (ctx.canvas.height - 35)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y1 = 10;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.fillText(customText, 60, y1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button" id="gt-res-listen"&gt;&lt;span lang="it" id="result_box"&gt;&lt;span title="Click for alternate translations" class="hps"&gt;L'Animazione&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;time-based &lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&amp;egrave;&amp;nbsp;&lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;pi&amp;ugrave; complicata&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;da implementare.&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;In questo&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;tipo di&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;animazione&lt;/span&gt; la &lt;span title="Click for alternate translations" class="hps"&gt;distanza&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;per spostare&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;una specifica immagine&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;&amp;egrave;&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;calcolato su&lt;/span&gt; l'&lt;span title="Click for alternate translations" class="hps"&gt;unit&amp;agrave; di&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;tempo.&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;Questo tipo&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;di&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;animazione&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;non&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;&amp;egrave;&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;dipendente&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;della macchina&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;e pu&amp;ograve;&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;essere usata&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;nei giochi&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;.&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;Nei giochi in genere&amp;nbsp;&lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;tutti i giocatori&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;hanno&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;la stessa quantit&amp;agrave; di&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;tempo&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;da spendere per&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;il&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;certo livello&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;,&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;a prescindere&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;macchina&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;utilizzata&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;per&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;giocare&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;una partita&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;-&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;quindi&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;abbiamo&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;bisogno di&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;animazione&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;indipendente&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;macchina&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;. La fluidit&amp;agrave; dell'animazione &amp;egrave; dipendente dalle performance del PC su cui si esegue ma le distanze sono costanti nell'unit&amp;agrave; di tempo.&amp;nbsp;Ecco di seguito un esempio di codice di utilizzo di un'animazione time-based:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;&lt;em&gt;var speed = 250, lastFrameTime = 0;&lt;br /&gt;setInterval(drawTimeBased, 16);&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;&lt;em&gt;function drawTimeBased() {&lt;br /&gt;// time since last frame&lt;br /&gt;var now = new Date().getTime();&lt;br /&gt;dt = (now - lastFrameTime) / 1000;&lt;br /&gt;lastFrameTime = now;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;&lt;em&gt;y2 += speed * dt;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;&lt;em&gt;ctx.clearRect(x2, 0, ctx.canvas.width, ctx.canvas.height);&lt;br /&gt;ctx.drawImage(img, x2, y2, imgWidth, imgHeight);&lt;br /&gt;}&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;span title="Click for alternate translations" class="hps"&gt;In questo caso l'oggetto&amp;nbsp;non viene spostato di una distanza predeterminata ad ogni intervallo di ridisegno dell'animazione, ma viene i&lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;nvece calcolato lo spostamento, in base al&lt;/span&gt;&amp;nbsp;&lt;span title="Click for alternate translations" class="hps"&gt;tempo&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;trascorso&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;dal&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;precedente&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;ciclo&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;di rendering&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;.&lt;/span&gt; &lt;br /&gt;&lt;span title="Click for alternate translations" class="hps"&gt;Ricordando&amp;nbsp;che&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;la distanza&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;&amp;egrave;&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;uguale&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;velocit&amp;agrave;&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;moltiplicata per&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;il tempo, che l&lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;a velocit&amp;agrave; &amp;egrave;&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;una costante&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;che&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;abbiamo&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;fissato&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;da qualche parte&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;nel&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;codice&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps atn"&gt;(&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;250&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;pixel&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;nel nostro caso&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;)&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;, e che &lt;/span&gt;&amp;nbsp;&lt;span title="Click for alternate translations" class="hps"&gt;dt&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;&amp;egrave; calcolato&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;in&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;ciascun&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;ciclo&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;, &lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;possiamo&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;facilmente&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;calcolare&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;la distanza&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;necessaria per&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;muovere&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;il nostro&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;oggetto&lt;/span&gt; in ogni step dell'animazione&lt;span title="Click for alternate translations"&gt;.&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;Tutto quello che dobbiamo&lt;/span&gt; fare &amp;egrave; &lt;span title="Click for alternate translations" class="hps"&gt;moltiplicare&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;la velocit&amp;agrave;&lt;/span&gt; per &lt;span title="Click for alternate translations" class="hps"&gt;il delta del &lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;tempo, ottenendo i pixel da applicare al movimento&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;span title="Click for alternate translations"&gt;&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;Di seguito un semplice esempio delle due tipologie di animazione applicate sullo stesso canvas a coordinate differenti:&lt;/span&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;span title="Click for alternate translations"&gt;&lt;em&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;span title="Click for alternate translations"&gt;&lt;em&gt;&amp;lt;html lang="en"&amp;gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span title="Click for alternate translations"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;em&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title title="test anim"&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;meta charset="utf-8" /&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;em&gt;&amp;nbsp;&amp;lt;script language="javascript" type="text/javascript"&amp;gt; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var myCanvas, ctx;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var x1=10,y1=10,x2=200,y2=10, distance=5, speed = 250;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var img;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var imgWidth;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var imgHeight;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var lastFrameTime = 0;&amp;nbsp;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;window.addEventListener("load", Main, false); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;function Main(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;myCanvas = document.getElementById("myCanvas");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (myCanvas.getContext) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx = myCanvas.getContext("2d");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;img = new Image();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;img.addEventListener("load", function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imgWidth = 100;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imgHeight = 100;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastFrameTime = new Date().getTime();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setInterval(draw, 16);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}, false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;img.src = "IELogo.png";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;function draw() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;drawFrameBased();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;drawTimeBased();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;function drawFrameBased() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;y1 += distance; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// make image show up again when it falls of the page&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (y1 &amp;gt; (ctx.canvas.height - imgHeight)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y1 = 10;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.fillText("Frame Based Animation", x1, 10);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.drawImage(img, x1, y1, imgWidth, imgHeight);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;function drawTimeBased() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// time since last frame&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;var now = new Date().getTime();&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;dt = (now - lastFrameTime) / 1000;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastFrameTime = now;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;y2 += speed * dt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;// make image show up again when it falls of the page&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (y2 &amp;gt; (ctx.canvas.height - imgHeight)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y2 = 10;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.clearRect(x2, 0, ctx.canvas.width-(x1+imgWidth), ctx.canvas.height);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.fillText("Time Based Animation", x2, 10);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.drawImage(img, x2, y2, imgWidth, imgHeight);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/em&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;em&gt;&amp;nbsp;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;canvas id="myCanvas" width="500" height="500"&amp;gt;&lt;br /&gt;&amp;nbsp;Canvas is not supported.&lt;br /&gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&amp;nbsp;Come potete vedere nell'esempio precedente le due animazioni vengono eseguite assieme ed in questo caso, viene cancellato prima del ridisegno solo la porzione del canvas che contiene la posizione dell'elemento su cui si esegue l'animazione, utilizzando il metododo del context &lt;em&gt;clearRect&lt;/em&gt;&amp;nbsp; utilizzando come parametri&amp;nbsp;le specifiche coodinate e dimensioni&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;span title="Click for alternate translations"&gt;Nel caso di animazioni complesse con elementi che durante il movimento , simulano anche altri tipi di movimento&amp;nbsp;come ad esempio l'applicazione &lt;a target="_blank" href="http://ie.microsoft.com/TEStdrive/Performance/FishIETank/Default.html"&gt;FishIETank&lt;/a&gt; che simula un acquario con i pesci che si muovono&amp;nbsp;nello spazio e che cambiano direzione e muovono la coda per simulare il nuoto:&lt;/span&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;span title="Click for alternate translations"&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/2287.schermo1.PNG" border="0" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;span title="Click for alternate translations"&gt;o come il bellissimo esempio\gioco implementato in HTML5 &lt;a s_oidt="0" s_oid="http://www.pirateslovedaisies.com/" href="http://www.pirateslovedaisies.com/"&gt;&lt;span style="color: #ca491d;"&gt;Pirates Love Daises&lt;/span&gt;&lt;/a&gt;&amp;nbsp;:&lt;/span&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;span title="Click for alternate translations"&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/8686.pirate.JPG" border="0" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;span title="Click for alternate translations"&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;span title="Click for alternate translations"&gt;Dove ci sono vari personaggi animati su canvas.&lt;/span&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;span title="Click for alternate translations"&gt;Per gestire &amp;nbsp;animazioni di questo tipo e garantire le migliori performance possibili, sfruttando in particolare su IE9 l'accelerazione grafica, si utilizzano genericamente delle tecniche&amp;nbsp; ( &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Sprite_(computer_graphics)"&gt;sprite animation&lt;/a&gt; ) che accorpano in un unica immagine gli stati degli elementi durante le animazioni, che vengono suddivisi in celle con delle specifiche coordinate, utilizzate poi nelle funzioni che ridisegnano gli oggetti.&lt;/span&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;span title="Click for alternate translations"&gt;&amp;nbsp;Ad esempio nel caso dell'acquario del &lt;a target="_blank" href="http://ie.microsoft.com/TEStdrive/Performance/FishIETank/Default.html"&gt;FishIETank&lt;/a&gt;&amp;nbsp; abbiamo, una immagine di background che viene applicata al canvas e una immagine in cui sono contenuti tutti gli stati necessari all'animazione dei pesci e le diverse "razze" di pesci che vengono poi divise in celle che permettono attraverso le coordinate definite di ridisegnare una specifica cella sul canvas:&lt;/span&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;span title="Click for alternate translations"&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/7607.fish.JPG" border="0" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&amp;nbsp;Di seguito un esempio della funzione che sintetizza l'utilizzo delle immagini all'interno&amp;nbsp;dell'animazione:&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;em&gt;&amp;lt;img id="imageStrip" src="fishstrip.png" style="display: none" tabIndex="-1"&amp;gt; &lt;/em&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;em&gt;//&amp;nbsp;rif allo&amp;nbsp;strip di img&lt;br /&gt;imageStrip = document.getElementById('imageStrip');&lt;/em&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;em&gt;ctx.drawImage (&lt;/em&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;em&gt;// informazioni source image &lt;/em&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;em&gt;FishImageStrip, // source&lt;br /&gt;fishW * cell, // sX&amp;nbsp;della cella&lt;br /&gt;fishH * species, // SY&amp;nbsp; della cella&lt;br /&gt;fishW, // larghezza della cella&lt;br /&gt;fishH, // altezza della cella&lt;/em&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&lt;em&gt;// Canvas destinazione&lt;br /&gt;x, // X dove&amp;nbsp;disegnare il pesce&lt;br /&gt;y, // Y dove&amp;nbsp;disegnare il pesce&lt;br /&gt;fishW, // larghezza&amp;nbsp;&lt;br /&gt;fishH, // altezza&amp;nbsp;&lt;br /&gt;);&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p class="gt-icon-c" tabindex="0" role="button"&gt;&amp;nbsp;Come si vede nel codice precedente, viene caricata l'intera immagine &amp;egrave; poi utilizzate le coordinate della cella per indicare la porzione di immagine (cella) da disegnare nel canvas di destinazione ad una specifica coordinata, con delle dimensioni definite.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Il particolare nell'applicazione FishIETank dell'acquario viene essenzialmente:&lt;/p&gt;
&lt;p&gt;1-&lt;span title="Click for alternate translations" class="hps"&gt;Caricato ed impostato lo sfondo dell'acquario&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span title="Click for alternate translations" class="hps"&gt;2- &lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;caricata l'intera &lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;sprite&lt;/span&gt;&amp;nbsp;image&lt;/p&gt;
&lt;p&gt;3- applicare al canvas le trasformazioni per disegnare il pesce, salvando prima lo stato del canvas, per riapplicarlo ripetendo poi le operazioni per ogni pesce &lt;/p&gt;
&lt;p&gt;&lt;span title="Click for alternate translations" class="hps"&gt;Questa demo di acquario, utilizza una animazione Time-Based. &lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;Di seguito un esempio semplificato della funzione di disegno dei pesci:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;em&gt;var myCanvas = document.getElementById('myCanvas');&lt;br /&gt;var ctx = myCanvas.getContext("2d");&lt;br /&gt;&amp;hellip;&lt;br /&gt;ctx.save();&lt;br /&gt;ctx.translate(x, y);&lt;br /&gt;ctx.scale(scale, scale); &lt;br /&gt;ctx.transform(flip, 0, 0, 1, 0, 0);&lt;br /&gt;ctx.drawImage(imageStrip, fishW * cell, fishH * species, fishW, fishH, -fishW / 2, -fishH / 2, fishW, fishH);&lt;br /&gt;scale = nextScale;&lt;br /&gt;ctx.restore();&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;span lang="it" id="result_box"&gt;&lt;span title="Click for alternate translations" class="hps"&gt;Proprio&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;come&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;ho&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;spiegato&lt;/span&gt; prima, viene salvato lo stato&amp;nbsp;del canvas&lt;span title="Click for alternate translations"&gt;,&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;applicata la trasformazione e disegnata la cella corretta in base allo stato dell'animazione e&lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&amp;nbsp;quindi&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;ripristinato&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;lo stato.&lt;/span&gt;&amp;nbsp;Viene applicata anche una&amp;nbsp;&lt;span title="Click for alternate translations" class="hps"&gt;trasformazione personalizzata&lt;/span&gt;&amp;nbsp;&lt;span title="Click for alternate translations" class="hps"&gt;dove&amp;nbsp;&lt;/span&gt;&amp;nbsp;i&lt;span title="Click for alternate translations" class="hps"&gt;l&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;primo parametro&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps atn"&gt;(&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;flip&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;)&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;&amp;egrave; 1&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;o&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;-1&amp;nbsp;serve per eventualmente&amp;nbsp;riflettere&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;pesce&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;in&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;una direzione diversa in base alla direzione che il pesce ha nell'acquario. Le &lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;trasformazioni nel canvas in IE9 vengono svolte sfruttando completamente&amp;nbsp;&lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;la&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;GPU con&amp;nbsp; l'accelerazione grafica offerta dal browser, garantendo delle perfomance eccellenti nell'animazione&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;Approfondendo il funzionamento dell'applicazione nel test drive di IE9,&amp;nbsp;trovate&amp;nbsp;&amp;nbsp;di seguito una porzione del codice della applicazione &lt;a target="_blank" href="http://ie.microsoft.com/TEStdrive/Performance/FishIETank/Default.html"&gt;fishIETank&lt;/a&gt; che potete anche trovare online&amp;nbsp;&amp;nbsp; :&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;
&lt;p&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;&lt;em&gt;//set up the canvas&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var tempCtx = document.createElement("canvas");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tempCtx.id = "canvas1";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tempCtx.setAttribute('width', WIDTH);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tempCtx.setAttribute('height', HEIGHT);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tempCtx.setAttribute('tabIndex', -1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.body.insertBefore(tempCtx, document.body.firstChild);&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var tempCtx3 = document.createElement("canvas");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tempCtx3.id = "background";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tempCtx3.setAttribute('width', WIDTH);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tempCtx3.setAttribute('height', HEIGHT);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tempCtx3.setAttribute('tabIndex', -1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.body.insertBefore(tempCtx3, document.body.firstChild);&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx = tempCtx.getContext("2d");&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;&lt;span lang="IT"&gt;&lt;span style="font-size: x-small;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;p&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx3 = tempCtx3.getContext("2d");&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //draw the background&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; backgroundImage = document.getElementById('backgroundImage');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; drawBackground();&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //create the fish&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; imageStrip = document.getElementById('imageStrip');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; createFish(startFish);&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //start animation&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setInterval(function () { draw(); }, 16);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; window.addEventListener("resize", OnWindowResize, false);&lt;/em&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id="gt-res-dict"&gt;Vengono creati i canvas utilizzati nella parte grafica, impostato il background dell'acquario e creati gli oggetti che rappresentano i pesci ed avviato l'intervallo che chiama la funzione che si occupa di ridisegnare l'acquario e implementare quindi le animazioni. La funzione draw essenzialmente effettua un ciclo nella collezione di oggetti che rappresentano i pesci, creati nella funzione createFish&amp;nbsp;e che consarvano lo stato in cui si trovano all'interno dell'acquario e chiama il metodo swim, che fa essenzialmente ridisegnare l'acquario:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;function draw() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //clear the canvas&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.clearRect(0, 0, WIDTH, HEIGHT);&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //set velocity of fish as a function of FPS&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;var fps = fpsMeter.meterFps;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; power = Math.min(fps, 60);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(isNaN(power)) power = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //velocity = 100 + 100 * (power * power / 3600); //exponential curve between 100-200&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; velocity = Math.floor((power * power * .5) / 3) &amp;lt; 1 ? 1 : Math.floor((power * power * .5) / 3);&amp;nbsp; //exponential curve between 1 and 600.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Draw each fish&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (var fishie in fish) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fish[fishie].swim();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp; &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//draw fpsometer with the current number of fish&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fpsMeter.Draw(fish.length);&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;la funzione swim, essenzialmente ridisegna il pesce dopo aver calcolato le coordinate della posizione del pesce. Il cuore nella funzione lo vedete di seguito:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;//draw the fish&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //locate the fish&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.save();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.translate(x, y);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.scale(scale, scale); // make the fish bigger or smaller depending on how far away it is.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.transform(flip, 0, 0, 1, 0, 0); //make the fish face the way he's swimming.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.drawImage(imageStrip, fishW * cell, fishH * species, fishW, fishH, -fishW / 2, -fishH / 2, fishW, fishH); //draw the fish&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.save();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; scale = nextScale // increment scale for next time &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.restore();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.restore();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //increment to next state&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = nextX;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = nextY;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; z = nextZ;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (cell &amp;gt;= cellCount-1 || cell &amp;lt;= 0) { cellReverse = cellReverse * -1; } //go through each cell in the animation&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cell = cell + 1 * cellReverse; //go back down once we hit the end of the animation&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Che come descritto prima, essenzialmente salva il contesto del canvas, posiziona e disegna il pesce e ripristina lo stato e incrementa le variabili per il successivo ridisegno. Nella demo &lt;a target="_blank" href="http://ie.microsoft.com/TEStdrive/Performance/FishIETank/Default.html"&gt;FishIETank&lt;/a&gt; potete vedere ed apporfondire il resto dell'esempio di animazione con il canvas realizzata.&lt;/p&gt;
&lt;/p&gt;
&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10114635" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IE/">IE</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/HTML5/">HTML5</category></item><item><title>Multi-language audio with IIS Smooth Streaming:  An example from Radiovaticana Live Streaming</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/01/08/multi-language-audio-with-iis-smooth-streaming-an-example-from-radiovaticana-live-streaming.aspx</link><pubDate>Sat, 08 Jan 2011 14:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10113280</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10113280</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/01/08/multi-language-audio-with-iis-smooth-streaming-an-example-from-radiovaticana-live-streaming.aspx#comments</comments><description>&lt;p&gt;One of many useful features that comes with IIS Media Services 4.0 and Smooth Streaming is the ability to stream live and on-demand content with multiple language audio tracks that are selectable by the viewer. &amp;nbsp;An example of this capability is the recent schedule of events that Vatican Radio (&lt;a target="_blank" href="http://www.radiovaticana.org/"&gt;http://www.radiovaticana.org/&lt;/a&gt;) delivered &amp;nbsp;during the last month. Vatican Radio delivered several events, such as Christmas night liturgical celebrations presided over by the Holy Father, World Day of Peace on January 1&lt;sup&gt;st&lt;/sup&gt;,&amp;nbsp;Jannuary 9 at 09.30 CET we have another event with the Pope, &amp;nbsp;and other events with multiple audio tracks (Natural Audio, Italian, English, French, German, Spanish, Portuguese and Arabic) was delivered during the last month.&amp;nbsp;The player used for these events was based on the &lt;a target="_blank" href="http://smf.codeplex.com/"&gt;Silverlight Media Framework&lt;/a&gt; (SMF) and provides the viewer with the ability to select which audio track to listen to. Below is an image of the player with the audio tracks selector shown:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/7848.vaticanplayer.JPG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Leveraging the integrated media platform capabilities of IIS Media Services (IIS MS) 4.0, the Vatican was also able to deliver the same events, using the same encoders and media server infrastructure, to Apple devices.&amp;nbsp; Note that in this case only 1 audio track is available because these devices do not natively support multiple audio tracks.&lt;/p&gt;
&lt;p&gt;You can see the architecture implemented for these events below:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/7002.vaticanarchitecture.JPG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The Digital Rapids encoders received as inputs 8 audio signals from Vatican Radio channels and a video signal from the Vatican TV center. &amp;nbsp;They generated 8 audio tracks in sync with 6 video tracks at different bit rates (quality levels) and pushed all the audio and video tracks to a publishing point on an IIS MS 4.0 ingest server.&amp;nbsp; A subset of the video tracks and a single audio track went to a second publishing point for Apple devices on the same IIS MS 4.0 ingest server. The ingest server pushed the content of both publishing points to the origin server.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;The first publishing point on the IIS MS origin server provided a client manifest (.ismc file) of all the available tracks and the actual content to Silverlight media players. The second origin server publishing point had the Apple Devices Adaptive Streaming feature selected.&amp;nbsp; This enabled the origin server to do on-the-fly trans-muxing (repackaging from one file format to another) from the fragmented MP4 streams used by the Smooth Streaming format to the Apple HTTP Live Adaptive Streaming (HLS) format compatible with iPhone and iPad. It also created and published an HLS-compatible client manifest (.m3u8 file).&amp;nbsp; An HTTP CDN (content delivery network) pulled the content from the origin publishing points and distributed it to viewers on their Silverlight or iPhone/iPad clients. &lt;/p&gt;
&lt;p&gt;The Silverlight client player, based on &lt;a target="_blank" href="http://smf.codeplex.com/"&gt;SMF&lt;/a&gt;, read all tracks published in the manifest and transparently adapted the video quality as needed, based on the bandwidth available and video rendering capabilities of each client.&amp;nbsp; The player also offered the possibility to the viewer to choose the audio track.&lt;/p&gt;
&lt;p&gt;If you are interested in more details about Smooth Streaming architectures for Live Streaming, you can start with &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/10/27/iis-media-service-live-smooth-streaming-fault-tolerance-and-architecture.aspx"&gt;this blog post&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;As I mentioned before, the multiple audio tracks feature is available not only for live streaming, but also for on-demand scenarios. In the case of on-demand you have more flexibility, as you could add more audio tracks to existing assets. The Smooth Streaming format permits to you to add additional audio tracks at any time without re-encoding the assets. This is because the Smooth Streaming format uses a server manifest to describe to the streaming server the available tracks and file sources that are available in the assets, and the client manifest is used to describe to the client the available tracks.&lt;/p&gt;
&lt;p&gt;If you are looking more information about smooth streaming files you can read &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2009/05/15/move-forward-internet-video-streaming-iis7-media-service-and-smooth-streaming.aspx"&gt;this post&lt;/a&gt; and the &lt;a target="_blank" href="http://learn.iis.net/page.aspx/626/smooth-streaming-technical-overview/"&gt;Technical Overview of Smooth Streaming&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Smooth Streaming is built on top of technologies that Microsoft has released via the &lt;a target="_blank" href="http://go.microsoft.com/?linkid=9740297"&gt;Community Promise Initiative&lt;/a&gt;, including the Protected Interoperable File Format (PIFF) and the IIS Smooth Streaming Transport Protocol (SSTP). The &lt;a target="_blank" href="http://go.microsoft.com/?linkid=9740298"&gt;Protected Interoperable File Format (PIFF) Specification&lt;/a&gt; defines a standard file format for multimedia content delivery and playback. It includes the audio-video container, stream encryption, and metadata to support content delivery for multiple bit rate adaptive streaming, optionally using a standard encryption scheme that can support multiple digital rights management (DRM) systems. The &lt;a target="_blank" href="http://go.microsoft.com/?linkid=9740299"&gt;IIS Smooth Streaming Transport Protocol Specification&lt;/a&gt; describes how live and on-demand Smooth Streaming audio/video content is distributed and cached over an HTTP network. It enables third parties to build their own client implementations that interoperate with IIS Media Services.&lt;/p&gt;
&lt;p&gt;At any time you can encode a new PIFF (Protected Interoperable File Format) asset, creating a fragmented MP4 file (.ismv, or .isma in the case of an audio-only file) that contains the additional audio tracks. You can update the manifests to describe the additional tracks to the server and client.&amp;nbsp; Ideally, you would synchronize the new audio track with the existing video track.&lt;/p&gt;
&lt;p&gt;Here is an example of a server manifest (.ism extension) with two video tracks and one audio track:&lt;/p&gt;
&lt;p&gt;&amp;lt;smil xmlns="http://www.w3.org/2001/SMIL20/Language"&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;lt;head&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;lt;meta&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name="clientManifestRelativePath"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; content="big_buck_bunny_1080p_surround.ismc" /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;metadata&amp;nbsp;&amp;nbsp;&amp;nbsp; id="meta-rdf"&amp;gt;&lt;/p&gt;
&lt;p&gt;----omitted-------&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;lt;/head&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;lt;body&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;switch&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;video&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; src="big_buck_bunny_1080p_surround_330.ismv"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; systemBitrate="330000"&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name="trackID"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value="2"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; valuetype="data" /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name="trackName"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value="video"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; valuetype="data" /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name="timeScale"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value="10000000"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; valuetype="data" /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/video&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;video&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; src="big_buck_bunny_1080p_surround_230.ismv"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; systemBitrate="230000"&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name="trackID"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value="2"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; valuetype="data" /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name="trackName"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value="video"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; valuetype="data" /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name="timeScale"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value="10000000"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; valuetype="data" /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/video&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;audio&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; src="big_buck_bunny_1080p_surround_6000.ismv"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; systemBitrate="128000"&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name="trackID"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value="1"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; valuetype="data" /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name="trackName"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value="audio1"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; valuetype="data" /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name="timeScale"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value="10000000"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; valuetype="data" /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/audio&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/switch&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;lt;/body&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/smil&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;As you can see, this file describes to the server how many video and audio tracks are available and the location of the physical PIFF file where the content is available.&lt;/p&gt;
&lt;p&gt;Here is an example of a client manifest file (.ismc extension) for the same asset:&lt;/p&gt;
&lt;p&gt;&amp;lt;SmoothStreamingMedia&lt;/p&gt;
&lt;p&gt;&amp;nbsp; MajorVersion="2"&lt;/p&gt;
&lt;p&gt;&amp;nbsp; MinorVersion="1"&lt;/p&gt;
&lt;p&gt;&amp;nbsp; Duration="5964800000"&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;lt;StreamIndex&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type="video"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name="video"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chunks="312"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; QualityLevels="2"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Url="QualityLevels({bitrate})/Fragments(video={start time})"&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;QualityLevel&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Index="0"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bitrate="6000000"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FourCC="WVC1"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MaxWidth="1920"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MaxHeight="1080"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CodecPrivateData="250000010FDBBE3BF21B8A3BF8EFF18044800000010E5A0040" /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;QualityLevel&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Index="1"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bitrate="4176000"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;FourCC="WVC1"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MaxWidth="1920"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MaxHeight="1080"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CodecPrivateData="250000010FDBBE3BF21B8A3BF8EFF18044800000010E5A0040" /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;QualityLevel&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Index="0"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bitrate="330000"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FourCC="WVC1"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MaxWidth="480"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MaxHeight="272"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CodecPrivateData="250000010FDB8A3BF21B8A3BF8EFF18044800000010E5A0040" /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;QualityLevel&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Index="1"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bitrate="230000"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FourCC="WVC1"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MaxWidth="320"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MaxHeight="180"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CodecPrivateData="250000010FDB863BF21B8A3BF8EFF18044800000010E5A0040" /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;c&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d="19999968"/&amp;gt;&lt;/p&gt;
&lt;p&gt;-----omitted-------&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;lt;/StreamIndex&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;lt;StreamIndex&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type="audio"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Index="0"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name="audio"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Chunks="299"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; QualityLevels="1"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Url="QualityLevels({bitrate})/Fragments(audio={start time})"&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;QualityLevel&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FourCC="WMAP"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bitrate="128000"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SamplingRate="44100"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Channels="2"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BitsPerSample="16"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PacketSize="5945"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AudioTag="354"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CodecPrivateData="1000030000000000000000000000E0000000" /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;c&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d="20433560" /&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; ----omitted ------&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &amp;lt;/StreamIndex&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/SmoothStreamingMedia&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;As you can see, this file describes to the client the video and audio tracks and fragments ("chunks") available.&lt;/p&gt;
&lt;p&gt;Again, if you would like to add an additional audio track, you can encode the track in a separate PIFF file and add it to the video asset by editing the server and client manifests to indicate the new track. Very flexible!!!&lt;/p&gt;
&lt;p&gt;The job delivered from Vatican Radio Web Team&amp;nbsp;is a very good example of how you can use the robust features and flexibility of IIS Smooth Streaming to deliver a compelling and more engaging experience to more viewers.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10113280" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Architecture/">Architecture</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Silverlight/">Silverlight</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Media/">Media</category></item><item><title>Video Sessione Ottimizzare i siti per Internet Explorer 9 e Video sessioni Evento Internet Explorer 9 Beta</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/23/video-sessione-ottimizzare-i-siti-per-internet-explorer-9-e-video-evento-internet-explorer-9-beta.aspx</link><pubDate>Thu, 23 Dec 2010 08:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10108050</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10108050</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/23/video-sessione-ottimizzare-i-siti-per-internet-explorer-9-e-video-evento-internet-explorer-9-beta.aspx#comments</comments><description>&lt;p&gt;Alcuni giorni fa in un evento Community ad Ancona organizzato da DotNetMarche ho partecipato come speaker con 2 sessioni, una&amp;nbsp;dedicata alla preparazione dei nostri&amp;nbsp;siti per&amp;nbsp;Internet Explorer 9 &amp;egrave; l'altra dedicata a l'introduzione allo sviluppo per Windows Phone 7. &lt;/p&gt;
&lt;p&gt;Per chi &amp;egrave; interessato ai contenuti delle sessioni su IE9 e WP7 &amp;egrave; possibile &lt;a target="_blank" href="http://vimeo.com/17710712"&gt;rivedere la registrazione della sessione qui&lt;/a&gt;&amp;nbsp; e da qui potete &lt;a target="_blank" href="http://cid-d82de3153feb12ed.office.live.com/self.aspx/Public/pinningdemo/slidecommunityIE9-wp7.zip"&gt;scaricare le slide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Disponibile anche il video dell'evento di fine ottobre dedicato a Internet Exporer &amp;nbsp;&lt;a target="_blank" href="http://www.microsoft.com/italy/beit/Generic.aspx?video=fda246f5-817d-49f7-b1d2-5e45ddbd6d48"&gt;che potete rivedere qui&lt;/a&gt;. Questo evento contiene le seguenti sessioni che &lt;a target="_blank" href="http://www.microsoft.com/italy/beit/Generic.aspx?video=fda246f5-817d-49f7-b1d2-5e45ddbd6d48"&gt;sono nel video dell'evento&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;nbsp; Keynote relativa a Internet Explorer 9 Beta&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Sessione sul&amp;nbsp;IE9 Pinning , Jump list&amp;nbsp; e Windows 7 Experience (&lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/16/internet-explorer-9-implementare-i-pinned-site-e-la-windows-7-experience.aspx"&gt;ulteriori info&amp;nbsp;in questo post&lt;/a&gt; )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- Sessione Introduzione a&amp;nbsp;HTML5&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Sessione su IE9 Developer Tools e Compatibility in IE9&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Le slide dell'evento potete scaricarle &lt;a target="_blank" href="http://cid-d82de3153feb12ed.office.live.com/self.aspx/Public/pinningdemo/ie9slide.zip"&gt;da qui&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10108050" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IE/">IE</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/HTML5/">HTML5</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/CSS3/">CSS3</category></item><item><title>HTML5: Introduzione al tag video</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/22/html5-introduzione-al-tag-video.aspx</link><pubDate>Wed, 22 Dec 2010 00:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10107167</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10107167</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/22/html5-introduzione-al-tag-video.aspx#comments</comments><description>&lt;p&gt;Un altro interessante elemento dell'HTML5&amp;nbsp; &amp;egrave; rappresentato dal &lt;a href="http://www.w3.org/TR/html5/video.html#video" target="_blank"&gt;tag video descritto nella specifica HTML5 del W3C &lt;/a&gt;. In Internet Explorer 9 abbiamo il supporto anche per questo elemento in aderenza alle specifiche del W3C a cui collabora anche Microsoft stessa&amp;nbsp;ed anche in questo caso il nuovo engine di IE9 consente di sfruttare l'accelerazione grafica anche per questo elemento. Un esempio di utilizzo del tag video per lo sviluppo di applicazioni multimediali lo trovate &lt;a href="http://ie.microsoft.com/testdrive/Graphics/VideoPanorama/Default.html" target="_blank"&gt;in questo esempio&lt;/a&gt; dedicato a questo aspetto del supporto HTML5 di IE9 nel test drive center di Internet Explorer.&lt;/p&gt;
&lt;p&gt;Il tag video consente di inserire direttamente nell'HTML della nostra pagina un elemento di tipo video e permette di controllarne la riproduzione attraverso il JavaScript. I vari browser che implementando il tag offrono anche direttamente una pulsantiera di controlli per i classici controlli di riproduzione(play, pause, etc) ed &amp;egrave; possibile anche gestire la costruzione di una barra di comandi personalizzata.&lt;/p&gt;
&lt;p&gt;Come prima cosa voglio specificare che il tag video ad oggi permette di gestire in modo standard solo gli scenari di progressive download e non tutti i browser implementando la stessa tipologia di&amp;nbsp;formato video&amp;nbsp;in quanto nella specifica non sono indicati gli aspetti relativi appunto al formato, anche se al momento il formato maggiormente diffuso &amp;egrave;&amp;nbsp;H264/AAC in un container .mp4 . Non c'&amp;egrave; supporto nella parte standard per lo streaming Live o per protocolli adattativi come ad esempio lo Smooth Stremaming,&amp;nbsp; e&amp;nbsp; per la protezione dei contenuti video. Per tanto con questo tag si possono gestire al momento solo alcuni&amp;nbsp;tipi di scenario nella riproduzione del video, per scenari avanzati dove si vuole costruire una maggiore esperienza utente o gestire eventi live o contenuti protetti, si pu&amp;ograve; utilizzare Silverlight e lo Smooth Streaming. Una introduzione allo Smooth Streaming la trovate in &lt;a href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2009/05/15/move-forward-internet-video-streaming-iis7-media-service-and-smooth-streaming.aspx" target="_blank"&gt;questo post&lt;/a&gt; ed in &lt;a href="http://learn.iis.net/page.aspx/941/smooth-streaming-primer/" target="_blank"&gt;questo articolo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Inserire il tag video in una pagina HTML &amp;egrave; semplice &amp;egrave; pu&amp;ograve; essere fatto come indicato nel seguente esempio:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;video id="videoElement1"&amp;nbsp; src=sample.mp4&amp;nbsp;&amp;nbsp;&amp;nbsp; width=320&amp;nbsp;&amp;nbsp; height=240&amp;nbsp;&amp;nbsp; controls&amp;nbsp; poster=sample.jpg&amp;gt;&lt;/em&gt;&lt;em&gt;Video not supported&amp;lt;/video&amp;gt;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Attraverso la propriet&amp;agrave; &lt;em&gt;src &lt;/em&gt;si pu&amp;ograve; indicare l'url del video da riprodurre. Con la propriet&amp;agrave; &lt;em&gt;autoplay&lt;/em&gt;&amp;nbsp; si imposta l'avvio automatico del file (basta scrivere autoplay non &amp;egrave; necessario inserire autoplay="true" sono equivalenti), con &lt;em&gt;poster&lt;/em&gt; si indica l'url dell'immagine da mostrare caricata nel tag video prima del play del video, con &lt;em&gt;controls&lt;/em&gt; si chiede al player di mostrare i controlli per play\pause ect , con &lt;em&gt;loop&lt;/em&gt; si pu&amp;ograve; mandare in loop la riproduzione del video, con &lt;em&gt;height &lt;/em&gt;e &lt;em&gt;width&lt;/em&gt; si impostano le dimensioni , con &lt;em&gt;preload&lt;/em&gt; si pu&amp;ograve; stabilire il tipo di preload che il browser fa del video&amp;nbsp;&amp;nbsp;( none nessun preload, metadata solo i metadati, auto il browser pu&amp;ograve; avviare il download dell'intero file).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Si pu&amp;ograve; accedere ai metodi ed alle propriet&amp;agrave; dell'elemento&amp;nbsp;anche via JavaScript accedendo direttamente all'oggetto nel DOM ad esempio con un getElementById. Relativamente al tag precedente a cui abbiamo dato il nome videoElement1 per eseguire un play sull'elemento per far partire il video si pu&amp;ograve; usare il seguente codice:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;var myVideo = document.getElementById("myVideo");&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;myVideo.play();&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Oppure ad esempio, si pu&amp;ograve; spostare la posizione del video attraverso la propriet&amp;agrave; currentTime ad un valore specifico :&lt;/p&gt;
&lt;p&gt;&lt;em&gt;var myVideo = document.getElementById("myVideo");&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;myVideo.currentTime = document.getElementById ("time").value;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;o con la propriet&amp;agrave; duration si pu&amp;ograve; accedere alla durata del video caricato nell'elemento. La stessa propriet&amp;agrave; currentTime pu&amp;ograve; essere utilizzata, ad esempio, per mostrare dei contenuti solo durante degli intervalli specifici di tempo durante la riproduzione del video, per gestire ad esempio, dei sottotitoli o delle inserzioni pubblicitarie. Di seguito un banale esempio di utilizzo che&amp;nbsp;moetra un div solo in uno specifico intervallo di tempo, usanto un interval che punta&amp;nbsp;ad usa funzione specifica:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;div&amp;nbsp;style="visibility:hidden"&amp;nbsp; id=msg&amp;gt;Messaggio&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;var starttime=2; var endtime=3;&lt;br /&gt;var video = document.getElementsByTagName('video')[0];&lt;br /&gt;var&amp;nbsp;msg = document.getElementById('msg');&lt;br /&gt;var msgstart = msg.getAttribute('starttime');&lt;br /&gt;var msgend = msg.getAttribute('endtime');&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;setInterval(function() {&lt;br /&gt;&amp;nbsp; var hasHidden = msg.hasAttribute('hidden');&lt;br /&gt;&amp;nbsp; if (video.currentTime &amp;gt; msgstart &amp;amp;&amp;amp; video.currentTime &amp;lt; msgend) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg.style.visibility="visible"&amp;nbsp; } &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg.style.visibility='"hidden";&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}, 100);&lt;br /&gt;&amp;lt;/script&amp;gt;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Si tratta ovviamente di un esempio molto semplice per spiegare il concetto di utilizzo della propriet&amp;agrave; currentTime per questo tipo di scenari , che poi pu&amp;ograve; ovviamente ssere esteso e generalizzato in applicazioni pi&amp;ugrave; complesse o che , ad esempio , utilizzano un canvas sovrapposto al video per permettere ad esempio, la comparsa di banner pubblicitari animati , in specifici momenti della riproduzione del video.&lt;/p&gt;
&lt;p&gt;Attraverso la propriet&amp;agrave; &lt;em&gt;error&lt;/em&gt; si pu&amp;ograve; accedere all'errore incontrato durante la riproduzione del video e con la propriet&amp;agrave; &lt;em&gt;readyState&lt;/em&gt;&amp;nbsp;si pu&amp;ograve; accedere allo stato del tag video.&lt;/p&gt;
&lt;p&gt;Si possono controllare le dimensioni del video con le propriet&amp;agrave; classiche dell'elemento width and height e con le stesse si pu&amp;ograve; gestire il full screen allargando il video all'intera dimensione del browser.&lt;/p&gt;
&lt;p&gt;L'elemento espone anche una serie eventi che possono essere usati come ad esempio &lt;em&gt;onplay &lt;/em&gt;che ci permette di agganciare una funzione da eseguire all'inizio del play, abbiamo poi ad esempio &lt;em&gt;onended &lt;/em&gt;che permette di ricevere l'evento di fine video &lt;em&gt;onseeking&lt;/em&gt; e &lt;em&gt;onseeked&lt;/em&gt; che permette di capire quando &amp;egrave; in corso un seeking sul video e quando &amp;egrave; terminato e molti altri eventi ancora.&lt;/p&gt;
&lt;p&gt;Ad esempio per agganciare l'evento di fine video alla funzione&amp;nbsp;test direttamente inline:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;lt;video src="fish.mp4" autoplay controls onerror="fallback(this)" onended="test(this)"&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;oppure si pu&amp;ograve; ovviamente farlo agganciando l'evento direttamente via JavaScript con &lt;em&gt;addEventListener&lt;/em&gt; .&lt;/p&gt;
&lt;p&gt;Per un elenco esaustivo delle propriet&amp;agrave;&amp;nbsp; , metodi e degli eventi vi consiglio di riferirvi direttamente alla specifica .&lt;/p&gt;
&lt;p&gt;Come vedete dall'esempio precedente anche per questo tag html5&amp;nbsp;si possono inserire all'interno del&amp;nbsp; tag i contenuti alternativi per i browser che non supportano il tag video. In particolare per gestire il fallback per i browser che non implementano il tag video si pu&amp;ograve; inserire un player alternativo come ad esempio un player basato su Silverlight.&lt;/p&gt;
&lt;p&gt;Genericamente si imposta anche il metodo onerror per gestire anche le eccezioni che si possono generare su quei browser che implementano il tag ma ad esempio non sono compatibili con il codec utilizzato nel video e quindi si pu&amp;ograve; gestire il fallback in questo modo:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;style type="text/css"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; html, body {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; height: 100%;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; overflow: auto;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; body {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; padding: 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; margin: 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #silverlightControlHost {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; height: 100%;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; text-align:center;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/style&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type="text/javascript" src="Silverlight.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function onSilverlightError(sender, args) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var appSource = "";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sender != null &amp;amp;&amp;amp; sender != 0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; appSource = sender.getHost().Source;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var errorType = args.ErrorType;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var iErrorCode = args.ErrorCode;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (errorType == "ImageError" || errorType == "MediaError") {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var errMsg = "Unhandled Error in Silverlight Application " + appSource + "\n";&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; errMsg += "Code: " + iErrorCode + "&amp;nbsp;&amp;nbsp;&amp;nbsp; \n";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; errMsg += "Category: " + errorType + "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \n";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; errMsg += "Message: " + args.ErrorMessage + "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \n";&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (errorType == "ParserError") {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; errMsg += "File: " + args.xamlFile + "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \n";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; errMsg += "Line: " + args.lineNumber + "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \n";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; errMsg += "Position: " + args.charPosition + "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \n";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (errorType == "RuntimeError") {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (args.lineNumber != 0) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; errMsg += "Line: " + args.lineNumber + "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \n";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; errMsg += "Position: " + args.charPosition + "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \n";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; errMsg += "MethodName: " + args.methodName + "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; \n";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; throw new Error(errMsg);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function fallback(video) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (video.firstChild) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (video.firstChild instanceof HTMLSourceElement) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; video.removeChild(video.firstChild);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; video.parentNode.insertBefore(video.firstChild, video);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; video.parentNode.removeChild(video);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp; &amp;lt;video src="fish.mp4" autoplay controls onerror="fallback(this)"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div id="silverlightControlHost"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param name="source" value="ProgressiveDownloadPlayer.xap"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param name="onError" value="onSilverlightError" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param name="background" value="white" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param name="minRuntimeVersion" value="4.0.50401.0" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param name="autoUpgrade" value="true" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;param name="InitParams" value="mediaurl=fish.mp4" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="&lt;/em&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=149156&amp;amp;v=4.0.50401.0"&gt;&lt;em&gt;http://go.microsoft.com/fwlink/?LinkID=149156&amp;amp;v=4.0.50401.0&lt;/em&gt;&lt;/a&gt;&lt;em&gt;" style="text-decoration:none"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;img src="&lt;/em&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=161376"&gt;&lt;em&gt;http://go.microsoft.com/fwlink/?LinkId=161376&lt;/em&gt;&lt;/a&gt;&lt;em&gt;" alt="Get Microsoft Silverlight" style="border-style:none"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/a&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/object&amp;gt;&amp;lt;iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/div&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/video&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Nel caso&amp;nbsp; in cui il browser non supporta il tag video, viene caricato automaticamente il player Silverlight e sar&amp;agrave; lui ad effettuare la riproduzione dle video. Nel caso in cui il browser supporta il tag video ma, ade sempio, non supporta il&amp;nbsp;formato del video, il tag video genera&amp;nbsp;l'evento onerror e&amp;nbsp;viene quindi eseguita la funzione &lt;em&gt;fallback&lt;/em&gt;&amp;nbsp; che rimuove il tag video dal DOM e fa caricare il player alternativo che riprodurr&amp;agrave; cos&amp;igrave; il video.&lt;/p&gt;
&lt;p&gt;E' eventualmente possibile utilizzare il JavaScript e delle specifiche API per poter determinare via script se il tag video &amp;egrave; supportato o meno :&lt;/p&gt;
&lt;p&gt;&lt;em&gt;function supports_video() { &lt;br /&gt;&amp;nbsp;return !!document.createElement('video').canPlayType; &lt;br /&gt;&amp;nbsp; }&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Come abbiamo gi&amp;agrave; detto prima &lt;span id="result_box" lang="it"&gt;&lt;span class="hps" title="Click for alternate translations"&gt;per poter riprodurre il video il nostro tag video&amp;nbsp;deve &lt;/span&gt;&lt;span class="hps" title="Click for alternate translations"&gt;fare almeno&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;tre&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;cose&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;contemporaneamente:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="it"&gt;&lt;span class="hps" title="Click for alternate translations"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="it"&gt;&lt;span class="hps" title="Click for alternate translations"&gt;1.Interpretare&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;il formato&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;contenitore&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;per scoprire&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;quali&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;tracce video e&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;audio&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;sono disponibili&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;, e&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;il modo in cui&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;sono memorizzati&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;all'interno del&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;file&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;in modo che possa&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;trovare i&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;dati&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;necessari&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;per&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;decodificare&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;prossimo&lt;/span&gt;&lt;br /&gt;&lt;span class="hps" title="Click for alternate translations"&gt;2.Decoding&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;il flusso&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;video&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;e la visualizzazione di&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;una serie di&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;immagini&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;sullo schermo&lt;/span&gt;&lt;br /&gt;&lt;span class="hps" title="Click for alternate translations"&gt;3.Decoding&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;il flusso&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;audio&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;e l'invio del&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;suono&lt;/span&gt; &lt;span class="hps" title="Click for alternate translations"&gt;agli altoparlanti&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;I principali formati che sono implementati non tutti allo stesso tempo, dai diversi browser che implementano in tag video HTML5 sono tre e sono i seguenti:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- &lt;em&gt;H.264 video + AAC audio in an MP4 container &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;- &lt;em&gt;Ogg Theora (video)&amp;nbsp;+ Vorbis (audio)&amp;nbsp;in&amp;nbsp; Ogg container &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;- &lt;em&gt;Wbem VP8(video) + Vorbis (audio) in wbem container&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Internet Explorer 9 supporta nativamente il primo e con l'istallazione di codec aggiuntivi permette di riprodurre i contenuti anche negli altri formati. Il formato pi&amp;ugrave; comune e oggi su Internet anche oltre il tag video HTML5 &amp;egrave; sicuramente il formato&amp;nbsp;&lt;em&gt;H.264 video + AAC audio in an MP4 container&amp;nbsp;&lt;/em&gt; .&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Per determinare i formati video supportati dal browser su cui si esegue la nostra pagina, il tag video&amp;nbsp;espone anche un metodo &lt;em&gt;canPlayType&lt;/em&gt; &amp;nbsp;che consente di verificare se uno specifico&amp;nbsp;formato &amp;egrave; supportato dal browser :&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;em&gt;videoElement1.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"'); &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il metodo torna indietro =="" in caso di formato non supportato e =="probably" quando il browser &amp;egrave; confidente di poter riprodurre il formato. E' opportuno anche in caso di risposta di probabile possibilit&amp;agrave; di riproduzione del contenuto proposto, agganciare l'evento enerror e gestire il fallback con il player basato su pluging come ad esempio Silverlight&amp;nbsp; in quanto non &amp;egrave; comunque sicura la riproduzione , dato uno specifico codec, possono esserci problemi di coincompatibilit&amp;agrave; o limiti nella risoluzione , nel numero di frame o nel livello di bitrate del file. Di seguito abbiamo un esempio di funzione della verifica del probabile supporto di un formato h264 baseline da parte del browser che esegue la nostra pagina:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;function supports_h264_baseline_video() { &lt;br /&gt;&amp;nbsp;if (!supports_video()) { return false; } &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;var v = document.createElement("video"); &lt;br /&gt;&amp;nbsp;return v.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"'); &lt;br /&gt;}&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In maniera simile a quanto abbiamo visto per il canvas, possiamo anche utilizzare la libreria Modernzr sia per verificare il supporto del tag video sia per la verifica dei codec. Di seguito un esempio di utilizzo:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;if (Modernizr.video) { &lt;br /&gt;&amp;nbsp;if (Modernizr.video.webm) {&lt;br /&gt;&amp;nbsp;// try WebM &lt;br /&gt;} &lt;br /&gt;else if (Modernizr.video.ogg) &lt;br /&gt;{ // try Ogg Theora + Vorbis in an Ogg container } &lt;br /&gt;else if (Modernizr.video.h264){ &lt;br /&gt;// try H.264 video + AAC audio in an MP4 container } &lt;br /&gt;}&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Per gestire la riproduzione&amp;nbsp; in maniera da poter&amp;nbsp;supportare browser che implementano formati diversi ,oltre al fallback&amp;nbsp;sul plugin,&amp;nbsp;si pu&amp;ograve; anche decidere di codificare il video in formati diversi e di appendere pi&amp;ugrave; src ai differenti formati come da esempio:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;br /&gt;&lt;em&gt;&amp;lt;video width="400" height="300" poster="frame.png" autoplay controls loop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;source src="video.mp4" type='video/mp4; codecs="avc1.42E01E,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mp4a.40.2"'&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;source src="video.ogv" type='video/ogg; codecs="theora,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; vorbis"'&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;lt;/video&amp;gt;&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;il&amp;nbsp;browser seleziona i diversi formati e riproduce quello idoneo, generando un onerror nel caso in cui nessuno dei formati indicati sia supportato.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Una buona libreria per gestire player HTML5 con il fallback su uno dei plugin &amp;egrave; sicuramente&amp;nbsp;&lt;a href="http://mediaelementjs.com/" target="_blank"&gt;mediaelement.js&lt;/a&gt;&amp;nbsp;e qui trovate&lt;a href="http://praegnanz.de/html5video/" target="_blank"&gt; un elenco con il confronto tra varie librerie disponibili&lt;/a&gt;.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Codificare i video in formati diversi per permetterne la riproduzione su browser differenti non &amp;egrave; una operazione semplice e comoda, comporta una maggiore spesa sia di tempo di preparazione dei contenuti , sia di storage. Si complica inoltre, lo sviluppo della pagina. Il suggerimento &amp;egrave; quello di prevedere un unico formato basato su H264&amp;nbsp; e AAC in un container .mp4 che &amp;egrave; il formato tipicamente pi&amp;ugrave; diffuso e gestire il fallback con un plugin come Silverlight. Il tag video permette di gestire solo gli secanri pi&amp;ugrave; semplici di riproduzione in progressive download e come gi&amp;agrave; detto non supporta ne streaming adattatico , ne live streaming ne tantomeno la protezione dei contenuti con un DRM. Ad oggi i player basati su plugin come ad esempio Silverlight, anche per la sola riproduzione in progressive download offrono una maggiore semplicit&amp;agrave; e uniformit&amp;agrave; di riproduzione su browser e SO differenti, consentendo anche la protezione con Microsft Playready&amp;nbsp;, lo streaming adattativo con lo Smooth Streaming e anche il live streaming. Anche se il tag video comincia ad avere una sua applicabilit&amp;agrave; negli scenari pi&amp;ugrave; semplici di progressive download senza protezione e per contenuti che non hanno lunghezza eccessiva e bitrate elevati , per i quali &amp;egrave; meglio utilizzare uno streaming adattativo come lo Smooth Streaming con Silverlight. Anche negli scenari mobile lo streaming adattativo permette di fornire una migliore user experience durante la riproduzione.&lt;/p&gt;
&lt;p&gt;Per produrre i contenuti video in H264/AAC in .mp4 si possono utilizzare diversi tipi di encoder. La maggioranza degli encoder disponibili &amp;egrave; in grado di produrre contenuti in questo formato che &amp;egrave; tra i pi&amp;ugrave; utilizzati. Si pu&amp;ograve; utilizzare anche &lt;a href="http://www.microsoft.com/expression/products/encoderpro_overview.aspx" target="_blank"&gt;Expression Encoder 4 Pro&lt;/a&gt; per produrre file .mp4 per il tag video ed avere al tempo stesso un encoder in grado di produrre anche contenuti Smooth Streaming. In un successivo post illustrer&amp;ograve; un breve tutorial per utilizzare Expression Encoder 4 Pro per codificare contenuti in .p4 utilizzabili con il tag video HTML5.&amp;nbsp; Vi invito a prestare attenzione al fatto che solo nella versione full del prodotto sono presenti i codec H264, nella trial e nella versione che trovate in msdn non sono presenti, occorre appunto la versione full. Expression Encoder 4 &amp;egrave; anche utilizzabile come encoder per il Live Smooth Streaming in combinazione con IIS Media Services&amp;nbsp;e Silverlight consentendo anche &lt;a href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/11/iis-media-services-4-integrated-media-platform-streaming-for-pc-windows-phone-tv-and-iphone-ipad-with-a-single-platform.aspx" target="_blank"&gt;lo streaming Live&amp;nbsp;e on demand non solo per Silverlight&amp;nbsp; PC e MAC ma anche per per i&amp;nbsp;device Apple e Windows Phone 7&lt;/a&gt;. In particolare su Windows Phone 7 si pu&amp;ograve; usare &lt;a href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/06/using-smooth-streaming-media-element-for-windows-phone-7.aspx" target="_blank"&gt;lo specifico Smooth Streaming Media Element&lt;/a&gt; per la riproduzione dei contenuti Smooth Streaming.&lt;/p&gt;
&lt;p&gt;Per la distribuzione dei contenuti video in progressive download si pu&amp;ograve; utilizzare un qualunque server web. Per una maggiore efficienza e per ridurre ed ottimizzare il consumo di banda per la distribuzione di contenuti in progressive download, vi&amp;nbsp;&amp;nbsp;suggerisco di prendere in considerazione IIS&amp;nbsp;con gli IIS Media Services. IIS Media Services &amp;egrave; una estensione di IIS che si scarica e si&amp;nbsp;installa in modo gratuito dal sito deidicato e che&amp;nbsp;&amp;nbsp;&amp;nbsp;oltre a permettervi&amp;nbsp;anche &amp;nbsp;l'utilizzo dello Smooth Streaming live e ondemand, offre una interessante funzionalit&amp;agrave; per il progressive downaload anche per file .mp4 che si chiama Bit Rate Throttling&amp;nbsp;che consente di&amp;nbsp;controllare il consumo di banda portandolo al livello del bitrate con cui &amp;egrave; codificato il file,&amp;nbsp;permettendo un significativo risparmio di banda e una maggiore ottimizzazione della stessa. Maggiori informazioni sull'utilizzo le trovate &lt;a href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2008/03/19/iis7-e-gli-scenari-video-in-download-progressive.aspx" target="_blank"&gt;in questo mio post sulla specifica funzionalit&amp;agrave;&lt;/a&gt;&amp;nbsp;e&amp;nbsp;&lt;a href="http://www.iis.net/download/BitRateThrottling" target="_blank"&gt;nell'area del sito di IIS MS dedicata a questa feature&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Oltre al tag video nella specifica HTML5 abbiamo anche il tag audio che ha un funzionamento molto simile a quanto visto per il video e serve essenzialmente a riprodurre contenuti audio. Il formato pi&amp;ugrave; comune per i contenuti audio &amp;egrave; .mp3 e wav.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10107167" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IE/">IE</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/HTML5/">HTML5</category></item><item><title>HTML5: Introduzione al Canvas</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/20/html5-introduzione-al-canvas.aspx</link><pubDate>Mon, 20 Dec 2010 09:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10105865</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10105865</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/20/html5-introduzione-al-canvas.aspx#comments</comments><description>&lt;p&gt;Una delle novit&amp;agrave; pi&amp;ugrave; interessanti per il supporto di HTML5 in Internet Explorer 9 &amp;egrave; sicuramente rappresentata da supporto per il tag&amp;nbsp;Canvas. &lt;span&gt;Il Canvas &amp;egrave; definito nella specifica HTML5&amp;nbsp;e offre un elemento che&amp;nbsp;aggiunto alle nostre pagine, permette il rendering di grafica su una superfice&amp;nbsp;bitmap dipendente dalla risoluzione. &lt;/span&gt;&lt;span&gt;Per disegnare sulla superfice grafica offerta da questo nuovo elemento standard dell'HTML, si utilizzando dei&amp;nbsp;"contesti" accessibili tramite specifiche API JavaScript, quali il contesto Canvas 2D, indicato nelle specifiche del W3C Canvas 2D API. &lt;/span&gt;&lt;span&gt;Internet Explorer&amp;nbsp;9, introduce il supporto per le API di disegno 2D Canvas, consentendone lo sfruttamento attraverso l'accelerazione grafica come tutte le funzionalit&amp;agrave; di rendering e composizione grafica di IE9, consentendo di ottenere ottime performance. Potete ad esempio provare le demo sul test drive di IE9, in particolare trovate&amp;nbsp;il famoso &lt;a target="_blank" href="http://ie.microsoft.com/testdrive/Performance/FishIETank/Default.html"&gt;"acquario"&lt;/a&gt;&amp;nbsp; assieme a tante&amp;nbsp;altre demo&amp;nbsp;del &lt;a target="_blank" href="http://www.ietestdrive.com/"&gt;test drive di IE &lt;/a&gt;&amp;nbsp;che potete provare installando la beta&amp;nbsp;di IE9 o l'ultima Platform Preview&amp;nbsp;&amp;nbsp;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;Il &lt;/span&gt;&lt;span&gt;Canvas permette di disegnare scenari che includono i rectangles, paths, lines, fills, arcs,&amp;nbsp;le curve di&amp;nbsp;B&amp;eacute;zier&amp;nbsp;e le&amp;nbsp;quadratic curves. &lt;/span&gt;&lt;span&gt;Canvas &amp;egrave; un modo per implementare elementi di grafica sul web. &lt;/span&gt;&lt;span&gt;Il tag&amp;nbsp;consente di disegnare&amp;nbsp;in &amp;nbsp;"modo immediato" (i comandi di disegno via JS vengono inviati direttamente con l'hardware grafico), la superficie di disegno si pu&amp;ograve; utilizzare per fornire grafici in tempo reale, animazioni o giochi interattivi, direttamente usando HTML e JavaScript&lt;/span&gt;&lt;span&gt;.&amp;nbsp;Le &lt;/span&gt;&lt;span&gt;API definite da&amp;nbsp; &lt;a target="_blank" href="http://go.microsoft.com/fwlink/?LinkID=197019"&gt;&lt;span style="color: #0066dd;"&gt;HTML Canvas 2D Context specification&lt;/span&gt;&lt;/a&gt;, consentono i seguenti scenari di disegno che includono:&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a target="_blank" href="http://go.microsoft.com/fwlink/?LinkId=197021"&gt;&lt;span style="color: #0066dd;"&gt;rectangles&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=197022"&gt;&lt;span style="color: #0066dd;"&gt;lines&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=197023"&gt;&lt;span style="color: #0066dd;"&gt;fills&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=197024"&gt;&lt;span style="color: #0066dd;"&gt;arcs&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=197026"&gt;&lt;span style="color: #0066dd;"&gt;shadows&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=197027"&gt;&lt;span style="color: #0066dd;"&gt;B&amp;eacute;zier curves&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=197028"&gt;&lt;span style="color: #0066dd;"&gt;quadratic curves&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=197030"&gt;&lt;span style="color: #0066dd;"&gt;images&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkId=197031"&gt;&lt;span style="color: #0066dd;"&gt;video&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Il link collegati alle caratteristiche elencate sopra , vi portano su una specifica pagina demo sul test drive center di IE9 che si chiama &lt;a target="_blank" href="http://go.microsoft.com/fwlink/?LinkId=197022"&gt;Canvas Pad&lt;/a&gt; , dove potete vedere l'uso delle diverse API JS offerte dal Canvas &amp;nbsp;ad anche l'utilizzo delle stesse per gestire delle animazioni e delle trasformazioni.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it" id="result_box"&gt;&lt;span&gt;Per riassumere quello che abbiamo discusso finora:&lt;br /&gt;&lt;/span&gt;&lt;span&gt;- Canvas fornisce una superficie di disegno immediato&lt;br /&gt;&lt;/span&gt;&lt;span&gt;- Gli sviluppatori Web utilizzano le API JS esposte dal Canvas per disegnare varie primitive grafiche direttamente sulla superfice del Canvas stesso&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;- Le animazioni sono realizzate sulla base di JavaScript chiamando le API Canvas. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;Per&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;un uso efficace del Canvas &lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&amp;egrave; necessario&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;comprendere&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;le&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;primitive che &lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;supporta, la&lt;/span&gt;&amp;nbsp;s&lt;span title="Click for alternate translations" class="hps"&gt;pecifica &lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&amp;egrave; vasta&amp;nbsp;e&lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp; &lt;span title="Click for alternate translations" class="hps"&gt;ci occuperemo&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;elementi pi&amp;ugrave;&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;importanti. La prima cosa da capire riguarda&amp;nbsp;il&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;sistema di coordinate.&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;Avvio &lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;del sistema&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;di coordinate&lt;/span&gt; &amp;egrave; &lt;span title="Click for alternate translations" class="hps"&gt;in&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;alto a sinistra&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;nello schermo&lt;/span&gt;&amp;nbsp; &lt;span title="Click for alternate translations" class="hps"&gt;punto con coordinate&amp;nbsp;&lt;span title="Click for alternate translations" class="hps"&gt;(0,0&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;)&lt;/span&gt; &lt;/span&gt;&lt;span title="Click for alternate translations"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/8562.cancascoord.JPG" border="0" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;L&lt;span&gt;'elemento Canvas in Internet Explorer 9 supporta gli attributi larghezza e altezza. &lt;/span&gt;&lt;span&gt;(I valori di default per la larghezza e l'altezza sono 300 e 150 pixel, rispettivamente, e il colore predefinito &amp;egrave; nero trasparente.). &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="long_text" lang="it"&gt;&lt;span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&amp;Egrave;&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;possibile&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;ottenere e impostare le dimensioni del canvas nel DOM&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;span title="Click for alternate translations" class="hps atn"&gt;document.getElementById ('&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;canvas1&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;'&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;)&lt;/span&gt; .&lt;span title="Click for alternate translations" class="hps"&gt;width&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;=larghezza&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span title="Click for alternate translations" class="hps atn"&gt;document.getElementById ('&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;canvas1&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;'&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;)&lt;/span&gt;&amp;nbsp;.height &lt;span title="Click for alternate translations" class="hps"&gt;=&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;altezza&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;L'utilizzo del Canvas in una pagina HTML5 &amp;egrave; semplice. Il primo passo consiste nel definire&amp;nbsp;il&amp;nbsp;tag all'interno della pagina in cui vogliamo utilizzarlo,&amp;nbsp; assegnandogli un id per poi poterlo&amp;nbsp;utilizzare dalle API JS&amp;nbsp;come dal seguente esempio:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;canvas id="myCanvas" width="500" height="500"&amp;gt;&lt;br /&gt;&amp;nbsp;Canvas is not supported.&lt;br /&gt;&amp;nbsp; &amp;lt;/canvas&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;span&gt;Definito il Canvas possiamo via JavaScript acquisire un riferimento al 2D Context su cui effettuare le operazioni di disegno. Ad esempio per disegnare un cerchio utilizzando le API del 2D Context e impostando le coordinate&amp;nbsp;:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;em&gt;&amp;lt;script language=javascript&amp;gt; &amp;hellip;&lt;br /&gt;myCanvas = document.getElementById ("myCanvas");&lt;br /&gt;if (myCanvas.getContext)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;ctx= myCanvas.getContext("2d");&lt;br /&gt;&amp;nbsp;ctx.arc (50, 50, 30, 0, Math.PI *2, true);&lt;br /&gt;&amp;nbsp;ctx.fillStyle = "rgba(0, 162, 232, .5)";&lt;br /&gt;&amp;nbsp;ctx.fill ();&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Potete provare lo script usando il &lt;a target="_blank" href="http://go.microsoft.com/fwlink/?LinkId=197022"&gt;Canvas Pad&lt;/a&gt; degli esempi precedenti o creando una semplice pagina.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Come vedete dall'esempio, sopra il tag consente anche di gestire direttamente dall'HTML un eventuale fallback per i browser che non supportano il Canvas. Infatti all'inteno del tag, possiamo inserire il contenuto HTML alternativo da mostrare per i browser che non supportano il tag. Come per le altre funzionalit&amp;agrave; dell'HTML5 si utilizza un approccio feature detection. Oltre a gestire il fallback per i browser che non supportando il Canvas si pu&amp;ograve; utilizzare lo stesso approccio feature detection via JS. Ecco di seguito un esempio di funzione che provede a verificare il supporto del Canvas, senza entrare nel merito del tipo di browser (browser detection code), approccio quest'ultimo di gestire il riconoscimento del browser e non della specifica funzionalit&amp;agrave;&amp;nbsp;che &amp;egrave; da evitare in generale perch&amp;egrave; fonte di codice meno robusto e riutilizzabile. Ecco l'esempio di feature detection del Canvas&amp;nbsp;via JS:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;em&gt;&amp;nbsp;function supports_canvas() &lt;br /&gt;{ return !!document.createElement('canvas').getContext; } &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;La funzione crea un elemento di tipo canvas e verifica la presenza del metodo getContext(), disponibile solo su istanze dell'elemento canvas. Nella pagina possiamo usare un if &lt;em&gt;supports_canvas()&lt;/em&gt;&amp;nbsp; per gestire appunto la verifica ed eseguire in conseguenza del codice alternativo.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Disponibili librerie come&amp;nbsp; Modernizr&amp;nbsp; che offrono una serie di funzioni precostruite per effettuare la feature detection delle principali funzionalit&amp;agrave; del HTML5 con maggiore semplicit&amp;agrave;.&amp;nbsp;Ad esempio per quanto riguarda il Canvas, se nella pagina abbiamo referenziato&amp;nbsp;Modernizr.js&amp;nbsp; possiamo&amp;nbsp;determinare il supporto di questo tag con molta seplicit&amp;agrave; usando la specifica funzione prevista come mostrato di seguito:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;em&gt;if (Modernizr.canvas) &lt;br /&gt;&amp;nbsp;&amp;nbsp; { // Canvas supported ! } &lt;br /&gt;else &lt;br /&gt;&amp;nbsp;&amp;nbsp; { // no canvas support available}&amp;nbsp;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Siccome le implementazioni non sono sempre omogenee nel senso che non tutte le api grafiche del canvas sono implementate su tutti i browser che supportando il canvas, si pu&amp;ograve; con lo stesso approccio di cui sopra verificare anche la&amp;nbsp;presenza di specifiche features. Ad esempio per verificare che nel&amp;nbsp;browser in cui&amp;nbsp;si sta eseguendo la nostra&amp;nbsp;pagina il canvas supporti il testo:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;em&gt;if (Modernizr.canvastext) &lt;br /&gt;&amp;nbsp;{ //&amp;nbsp; draw text! } &lt;br /&gt;else &lt;br /&gt;&amp;nbsp;{ // no native canvas text support&amp;nbsp; }&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;invece senza la libreria Modernizr&amp;nbsp; :&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;em&gt;&amp;nbsp;function supports_canvas_text() &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;if (!supports_canvas()) &lt;br /&gt;&amp;nbsp;&amp;nbsp;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;var dummy_canvas = document.createElement('canvas');&lt;br /&gt;&amp;nbsp;var context = dummy_canvas.getContext('2d');&lt;br /&gt;&amp;nbsp;return typeof context.fillText == 'function'; &lt;br /&gt;}&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Dove utiliziamo la funzione sopra per verificare il canvas e poi acquisito il contesto di un canvas generato per il test, si verifica che ci sia il metodo fillText e che sia una function.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;Abbiamo visto &lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;nel precedente esempio&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;che&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;&amp;egrave;&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;veramente facile&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;da&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;disegnare&lt;/span&gt; elementi&amp;nbsp;come il cerchio dell'esempio&amp;nbsp;&lt;span title="Click for alternate translations" class="hps"&gt;colorati&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;nel modo desiderato&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span title="Click for alternate translations" class="hps"&gt;Con le&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;propriet&amp;agrave;&lt;/span&gt; &lt;em&gt;f&lt;span title="Click for alternate translations" class="hps"&gt;illStyle&lt;/span&gt;&lt;/em&gt; &lt;span title="Click for alternate translations" class="hps"&gt;e&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;&lt;em&gt;strokeStyle&lt;/em&gt;&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;si pu&amp;ograve;&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;facilmente&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;impostare&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;i colori utilizzati&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;per il rendering di&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;forme&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;riempite&lt;/span&gt; &lt;span title="Click for alternate translations"&gt;.&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;I&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;valori di colore&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;&amp;egrave; possibile&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;utilizzare&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;sono&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;gli stessi&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;in&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;CSS&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;:&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;codici&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;hex&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;,&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;rgb&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;()&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;,&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;RGBA&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;()&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;e&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;anche&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;HSLA&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;(), entrambi supportati in IE9&lt;/span&gt;&amp;nbsp;&lt;span title="Click for alternate translations"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;span title="Click for alternate translations" class="hps"&gt;Con&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;fillRect&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;&amp;egrave; possibile&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;disegnare&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;rettangoli&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;pieni&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;.&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;Con&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;&lt;em&gt;strokeRect&lt;/em&gt;&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;&amp;egrave; possibile&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;disegnare&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;rettangoli&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;utilizzando solo&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;i confini&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;,&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;senza&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;ripieno.&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;Se&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;si desidera&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;cancellare&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;una parte&lt;/span&gt; specifica del canvas dal contenuto disegnato&lt;span title="Click for alternate translations"&gt;, &amp;egrave; possibile&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;utilizzare&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;&lt;em&gt;clearRect&lt;/em&gt;&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;.&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;Questi tre&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;metodi&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;utilizzano tutti&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;gli stessi argomenti&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;:&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;x&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;, y&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;,&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;larghezza&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;,&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;altezza&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;.&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;I primi due&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;argomenti&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;raccontare&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;la&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;(x&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;,&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;y&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;)&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;le coordinate&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;,&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;e&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;gli ultimi&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;due&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;argomenti&lt;/span&gt;&amp;nbsp;&lt;span title="Click for alternate translations" class="hps"&gt;si impostano&lt;/span&gt;&amp;nbsp;&lt;span title="Click for alternate translations" class="hps"&gt;le dimensioni&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;larghezza e&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;l'altezza&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;per il&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;rettangolo&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;em&gt;&amp;nbsp;// Draw black rect&lt;br /&gt;&amp;nbsp;ctx.fillRect(50, 20, 145, 145);&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;em&gt;&amp;nbsp;// Draw blue rect&lt;br /&gt;&amp;nbsp;ctx.fillStyle = "rgb(0, 162, 232)";&lt;br /&gt;&amp;nbsp;ctx.fillRect(135, 85, 125, 125);&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;em&gt;&amp;nbsp;// Increase line width&lt;br /&gt;&amp;nbsp;ctx.lineWidth = 5;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;// Draw black rect outline&lt;br /&gt;&amp;nbsp;ctx.strokeStyle = "rgb(0, 0, 0)";&lt;br /&gt;&amp;nbsp;ctx.strokeRect(50, 335, 145, 145);&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;em&gt;&amp;nbsp;// Draw blue rect outline&lt;br /&gt;&amp;nbsp;ctx.strokeStyle = "rgb(0, 162, 232)";&lt;br /&gt;&amp;nbsp;ctx.strokeRect(135, 275, 125, 125);&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;em&gt;&amp;nbsp;// Draw transparent yellow rect&lt;br /&gt;&amp;nbsp;ctx.fillStyle = "rgba(255, 255, 0, 0.75)";&lt;br /&gt;&amp;nbsp;ctx.fillRect(210, 180, 125, 125);&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="it" id="result_box"&gt;&lt;span title="Click for alternate translations" class="hps"&gt;Ecco il risultato:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/0552.canvasrect.JPG" border="0" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations" class="hps"&gt;Oltre alle precedenti API con il canvas si possono usare i paths e le line consentono&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;di&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;disegnare&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;forme&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;personalizzate&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;.&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;Per c&lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;reare&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;una forma personalizzata&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;&amp;egrave; semplice,&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;per iniziare a disegnare&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;il percorso si usa &lt;/span&gt;&amp;nbsp;&lt;span title="Click for alternate translations" class="hps"&gt;beginPath&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps atn"&gt;uso&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;,&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;quindi si compone&amp;nbsp;&lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;la forma&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;utilizzando&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;linee&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;, curve&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;e&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;altre primitive&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;.&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;Una volta fatto&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;,&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;chiamata&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;riempimento e&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;traccia&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;se si&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;vuole&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;riempire la forma&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;o&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;il disegno del tracciato&lt;/span&gt;&lt;span title="Click for alternate translations"&gt;,&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;quindi&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;chiamare&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;&lt;em&gt;stroke&lt;/em&gt; &lt;/span&gt;&lt;span title="Click for alternate translations" class="hps"&gt;per&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;finire&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;la tua&lt;/span&gt; &lt;span title="Click for alternate translations" class="hps"&gt;forma. Di seguito un esempio per disegnare uno Smile:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;/span&gt;&lt;/span&gt;&lt;em&gt;&amp;nbsp;ctx= myCanvas.getContext("2d");&lt;br /&gt;ctx.beginPath();&lt;br /&gt;ctx.arc(75,75,50,0,Math.PI*2,true); // cerchio viso&lt;br /&gt;ctx.moveTo(110,75);&lt;br /&gt;ctx.arc(75,75,35,0,Math.PI,false);&amp;nbsp;&amp;nbsp; // bocca&lt;br /&gt;ctx.moveTo(65,65);&amp;nbsp;&lt;br /&gt;ctx.arc(60,65,5,0,Math.PI*2,true);&amp;nbsp; // occhio&lt;br /&gt;ctx.closePath();&lt;br /&gt;ctx.moveTo(95,65);&lt;br /&gt;ctx.arc(90,65,5,0,Math.PI*2,true);&amp;nbsp; // occhio&lt;br /&gt;ctx.stroke();&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span lang="it"&gt;&lt;span title="Click for alternate translations" class="hps"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Ecco il risultato:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/8562.canvassmile.JPG" border="0" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Si possono gestire anche gradienti e shadows e potete vedere gli esempi nel &lt;a target="_blank" href="http://ie.microsoft.com/testdrive/Graphics/CanvasPad/Default.html"&gt;Canvas Pad&lt;/a&gt;. Ad esempio per i gradienti:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;em&gt;// Define gradients&lt;br /&gt;&amp;nbsp;var gradient1 = ctx.createLinearGradient(0, 0, 0, 500);&lt;br /&gt;&amp;nbsp;gradient1.addColorStop(0, "#00ABEB");&lt;br /&gt;&amp;nbsp;gradient1.addColorStop(1, "white");&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;em&gt;// Draw&amp;nbsp;&lt;br /&gt;&amp;nbsp;ctx.fillStyle = gradient1;&lt;br /&gt;&amp;nbsp;ctx.fillRect(0,0,400,500);&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;si ottiene:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/2235.canvasgradients.JPG" border="0" /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;In un canvas &amp;egrave; anche possibile disegnare un immagine con la specifica api. Ad esempio di seguito un esempio:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;em&gt;function draw(){&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;em&gt;var image = document.getElementById("myimg");&lt;/em&gt;&lt;/span&gt;&lt;span&gt;&lt;em&gt;&lt;br /&gt;&amp;nbsp; ctx.drawImage(image, -10, 45, 400, 400);&lt;br /&gt;}&lt;/em&gt;&lt;/span&gt; &lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;dove myimg &amp;egrave; il riferimento ad un elemento di tipo immagine che avete all'interno della pagina.&amp;nbsp;Il tipico uso di un immagine per poi gestire animazioni o altro su un canvas, parte genericamente dall'utilizzo di un immagine, spesso nascosta, che viene caricata nel dom. Per manipolare l'immagine solo al termine del download della stessa si inserisce genericamente il codice nell'evento load della pagina:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&amp;nbsp;&lt;em&gt;window.addEventListener("load",draw, false); &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Si pu&amp;ograve; anche utilizzare un elemento Image e per capire quando l'immagine &amp;egrave; disponibile ed ha terminato il download genericamente si usa l'questo tipo di approccio:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;em&gt;img = new Image();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;img.addEventListener("load", function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imgWidth = 100;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;imgHeight = 100;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ctx.drawImage(img, 0, 0, imgWidth, imgHeight);&lt;/em&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}, false);&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;img.src = "IELogo.png";&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;span&gt;Potete provare sempre sul Canvas Pad il supporto per le &lt;a target="_blank" href="http://go.microsoft.com/fwlink/?LinkId=197030"&gt;immagini&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;L'HTML5 consente anche l'utilizzo di video con lo specifico tag video&amp;nbsp;che viene supportato anche in IE9 ed &amp;egrave; possibile anche utilizzare anche un&amp;nbsp;video all'interno di un canvas per gestrire particolari effeti grafici:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;// Create a timer to draw the video&lt;br /&gt;&amp;nbsp;timer1 = setInterval(drawVideo, 16);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;function drawVideo() &lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!isNaN(video.duration))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Play the video&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; video.play();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Draw the video&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.drawImage(video, 0, 0, 400, 500);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;} &lt;br /&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il timer impostato a 16ms consente di disegnare nel canvas&amp;nbsp; il video contenuto nel tag html con la funzione drawImage.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;E' possibile anche sovrapporre direttamente un canvas sopra un tag video con l'opportuno z-index, per avere appunto sopra al video delle animazioni, banner pubblicitari e contenuti interattivi. In un prossimo post illustrer&amp;ograve; proprio un esempio di questo tipo.&lt;/p&gt;
&lt;p&gt;Si possono anche applicare delle trasformazioni aal canvas e in conseguenza agli elementi rappresentati nello stesso.&amp;nbsp;Possiamo applicare&amp;nbsp;spostamenti, rotazioni, scaling. anche qui avvalendosi con IE9 di tutta la potenzialit&amp;agrave; di sfruttare per queste operazioni l'accelerazione hardware e le potenzialit&amp;agrave; della GPU.&lt;/p&gt;
&lt;p&gt;Di seguito&amp;nbsp;aggiungo un esempio di video ridisegnato in un canvas ruotato e translato&amp;nbsp;che viene aggiornato a 60 frame al secondo. Anche qui abbiamo un&amp;nbsp; timer impostato a 16ms per presentare ridisegnare il video, e postete vedere la rotazione sul canvas con la specifica funzione:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;lt;html xmlns="&lt;/em&gt;&lt;a href="http://www.w3.org/1999/xhtml"&gt;&lt;em&gt;http://www.w3.org/1999/xhtml&lt;/em&gt;&lt;/a&gt;&lt;em&gt;"&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;script language='javascript' type='text/javascript'&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; window.addEventListener("DOMContentLoaded", Init, false);&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function Init() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var video = document.getElementById("vid");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var canvas = document.getElementById("can");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var ctx = canvas.getContext("2d");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.translate(100, 10);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.rotate(-0.2);&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var waiting = setInterval(function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (video.readyState ==2) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setInterval(function () {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ctx.drawImage(video, 0, 200, 640, 360);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, 50);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; clearInterval(waiting);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, 200);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;video style="display: none" id="vid" src="fish.mp4" width="640" height="360" controls&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; autoplay&amp;gt;&amp;lt;/video&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;canvas id="can" width="1000" height="600"&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Come vedete dal codice terminato il caricamento del DOM viene eseguita la funzione Init che accede al contesto 2D dell'elemento canvas di nome can &amp;nbsp;inserito nella pagina e che&amp;nbsp; applica allo stesso una translazione e una rotazione, per poi avviare un intervallo che attende l'avvio del video. Appena avviato il video viene rimosso, l'intervallo con la funzione di attesa del caricamento del video, ed avviato un timer di 16 millisecondi che ridisegna a 60 frame al secondo il video, che questa volta appare ruotato, proprio per la rotazione dell'intero canvas. Di seguito avete l'immagine di come si presenta il video nel canvas trasformato opportunamente:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/6708.videorotate.JPG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Possiamo ad esempio, anche effettuare uno scale di un video, ed anche qui avvalendosi con IE9 di tutta la potenzialit&amp;agrave; di sfruttare per queste operazioni l'accelerazione hardware nell'operazione di rendering e scale:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;em&gt;&amp;lt;html &amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;script type="text/javascript" src="default.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;style&amp;gt;&lt;br /&gt;span {left: 450px; position: absolute; opacity:.75}&lt;br /&gt;.Inc {top: 50px}&lt;br /&gt;.Dcr {top: 80px}&lt;br /&gt;button {width: 150px}&lt;br /&gt;&amp;lt;/style&amp;gt;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;video id="myVideo" src="fish.mp4" loop autoplay style="display: none"&amp;gt;&lt;br /&gt;&amp;nbsp;Video is not supported.&lt;br /&gt;&amp;lt;/video&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;lt;canvas id="myCanvas"&amp;nbsp; height="480" width="640" style="left: 0px; top: 0px; position: absolute;" &amp;gt;&lt;br /&gt;&amp;nbsp;Canvas is not supported&lt;br /&gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;lt;span class="Inc"&amp;gt; &amp;lt;button type="button" onclick="scaleFunc(1)"&amp;gt; Zoom in &amp;lt;/button&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;span class="Dcr"&amp;gt; &amp;lt;button type="button" onclick="scaleFunc(-1)";&amp;gt; Zoom out &amp;lt;/button&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Di seguito la funzione scalefunction che effettua lo scaling:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;function scaleFunc( scaleFactor) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; ctx.clearRect (0, 0, 645, 485);&lt;br /&gt;&amp;nbsp; if (scaleFactor==1) {scale = 1.1;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {scale = .9;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp; ctx.scale (scale, scale);&lt;br /&gt;}&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;ometto la funzione che ridisegna il video in un interval che abbiamo gi&amp;agrave; descritto prima.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Per continuare a provare il canvas ed approfondire le API vi ricordo il &lt;a target="_blank" href="http://go.microsoft.com/fwlink/?LinkId=197022"&gt;Canvas Pad&amp;nbsp;&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;&lt;span&gt;Segnalo anhce un interessante plugin disponibile per convertire da Adobe illustrator a codice per&amp;nbsp;il Canvas&amp;nbsp;su cui trovate maggiori informazioni &lt;a target="_blank" href="http://blogs.msdn.com/b/mswanson/archive/2010/10/12/adobe-illustrator-to-html5-canvas-plug-in-released.aspx"&gt;qui&lt;/a&gt; .&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In un prossimo post vedremo come gestire le animazioni nel canvas attraverso il JavaScript .&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10105865" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IE/">IE</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/HTML5/">HTML5</category></item><item><title>Internet Explorer 9: CSS3 Fonts e WOFF</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/14/internet-explorer-9-css3-e-woff.aspx</link><pubDate>Tue, 14 Dec 2010 09:24:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10103720</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10103720</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/14/internet-explorer-9-css3-e-woff.aspx#comments</comments><description>&lt;p&gt;Tra gli elementi supportati in IE9 abbiamo anche il supporto per il Web Open Font Format il &lt;a target="_blank" href="http://people.mozilla.com/~jkew/woff/woff-spec-latest.html"&gt;web container format&lt;/a&gt; nato per fornire un nuovo formato unico per i diversi&amp;nbsp;browser, proposto &lt;a s_oidt="0" s_oid="http://www.w3.org/Submission/2010/03/" target="_blank" href="http://www.w3.org/Submission/2010/03/"&gt;&lt;span style="color: #0066aa;"&gt;al W3C nel Aprile 2010&amp;nbsp;da Mozilla, Opera&amp;nbsp;e Microsoft.&lt;/span&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;Internet Explorer 9 supporta sia&amp;nbsp; i WOFF che anche EOT (Embedded OpenType)&amp;nbsp;&amp;nbsp;con il&amp;nbsp;rule descriptor&amp;nbsp;&lt;strong&gt;@font-face&lt;/strong&gt; implementato&amp;nbsp;in modo&amp;nbsp;&amp;nbsp;conforme&amp;nbsp;alle specifiche del&amp;nbsp; modulo &lt;a href="http://www.w3.org/TR/css3-fonts/"&gt;&lt;span style="color: #0066dd;"&gt;CSS3 Fonts Module&lt;/span&gt;&lt;/a&gt;, consentendo l'installazione dinamica di Font per una pagina Web&amp;nbsp;.&lt;/p&gt;
&lt;p&gt;Attraverso &lt;strong&gt;@font-face&lt;/strong&gt;&amp;nbsp; si possono dichiarare in uno style ed installare dinamicamente per l'utilizzo nella pagina dei font come nell'esempio di seguito:&lt;/p&gt;
&lt;p&gt;@font-face {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; font-family: freeBooterFont;&amp;nbsp;&amp;nbsp;&amp;nbsp; src: url('../fonts/fsample.woff') format('woff');&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; font-weight: normal;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp; font-style: normal;}&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Aggiornata anche la propriet&amp;agrave; &amp;nbsp;&lt;strong&gt;font-weight&lt;/strong&gt;&amp;nbsp; e &lt;strong&gt;font-size&lt;/strong&gt;&amp;nbsp;&amp;nbsp;che ora &amp;egrave; aderente al&amp;nbsp; &lt;a href="http://www.w3.org/TR/css3-fonts/"&gt;&lt;span style="color: #0066dd;"&gt;CSS3 Fonts Module&lt;/span&gt;&lt;/a&gt;&amp;nbsp;e disponibile anche la&amp;nbsp;propriet&amp;agrave; &amp;nbsp;&lt;strong&gt;font-stretch&lt;/strong&gt; nuova in IE&amp;nbsp;che permete&amp;nbsp;di selezionare&amp;nbsp;normal, condensed, o expanded face da una&amp;nbsp;font family, la propriet&amp;agrave; &amp;egrave; disponibile anche in&amp;nbsp;&lt;strong&gt;@font-face&lt;/strong&gt; .&lt;/p&gt;
&lt;p&gt;Disponibili per l'uso con il nuovo formato WOFF-encoded font tra cui &lt;a href="http://webfonts.fonts.com/"&gt;&lt;span style="color: #0066aa;"&gt;Monotype Imaging&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://www.ascendercorp.com/"&gt;&lt;span style="color: #0066aa;"&gt;Ascender Corporation&lt;/span&gt;&lt;/a&gt;, &lt;a href="http://www.fontshop.com/"&gt;&lt;span style="color: #0066aa;"&gt;FontShop&lt;/span&gt;&lt;/a&gt;&amp;nbsp;e &lt;a href="http://www.typotheque.com/"&gt;&lt;span style="color: #0066aa;"&gt;Typotheque&lt;/span&gt;&lt;/a&gt; che hanno fornito anche i Font utilizzati nella demo su questa funzionalit&amp;agrave; nel &lt;a href="http://ie.microsoft.com/testdrive/Graphics/WebFonts/Default.html"&gt;&lt;span style="color: #0066aa;"&gt;Testdrive&lt;/span&gt;&lt;/a&gt; &lt;a href="http://ie.microsoft.com/testdrive/Graphics/MoreWebFonts/Default.html"&gt;&lt;span style="color: #0066aa;"&gt;demos&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Un bel esempio di utilizzo di @font-face&amp;nbsp; CCS3 e WOFF lo trovate tra i siti di beautyoftheweb in particolare con il sito &lt;a target="_blank" href="http://www.nevermindthebullets.com/"&gt;NeverMindThe Bullets&lt;/a&gt;&amp;nbsp;ed anche nella implementazione &lt;a target="_blank" href="http://www.deejay.it/D5/test/IE9_Desk/desktop.html"&gt;demo di Deejay&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10103720" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IE/">IE</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/HTML5/">HTML5</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/CSS3/">CSS3</category></item><item><title>IIS Media Services 4.0: publishing point runtime status </title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/11/iis-media-services-4-0-publishing-point-runtime-status.aspx</link><pubDate>Sat, 11 Dec 2010 14:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10101230</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10101230</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/11/iis-media-services-4-0-publishing-point-runtime-status.aspx#comments</comments><description>&lt;p&gt;In &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/09/iis-media-services-4-0-manifest-compression.aspx"&gt;my previous post&lt;/a&gt; I introduced some new features added to IIS Media Services (IIS MS)&amp;nbsp;4.0 and in particular the new manifest compression used for Live Streaming. In this post I discuss about the new publishing point runtime status avaliable with IIS MS 4.0.&lt;/p&gt;
&lt;p&gt;This new feature can permit to you during a Live Streaming to check the status of the publishing point using the new UI added to IIS manager and in alternative using the RSCA API. During a live streaming in the pubpoint UI you can see a recap&amp;nbsp; of the pubpoint &amp;nbsp;status in the "Publishingh Point Summary"&amp;nbsp;that you can see in the figure below:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/6518.pubpointsatus1.JPG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;As you can see in the pubpoint summary you can see status of incoming streams in IIS and a recap of the option activated on the pubpoint. Using the new "details" men&amp;ugrave; on the Actions&amp;nbsp;pubpoint , you can activate a detailed view on pubpoint status:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/7181.pubpointstatus2.JPG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;The details view give to you a complete view of the status in the pub point. You have the "stream summary" and the "track view details" and connections details&amp;nbsp;:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/4341.pubpointstaus3.JPG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/4540.pubpointstatus4.JPG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The "stream summary" section show the status of incoming streams and give to you the opportunity to see the stream in input in the pubpoint from&amp;nbsp;encoder or&amp;nbsp;others IIS MS source.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In the "tracks details" you can see the status of every&amp;nbsp;Track in input to the IIS MS pubpoint form an encoder or another server.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In order to clarify the terms&amp;nbsp;a&amp;nbsp;"stream" for Live Smooth Streaming publishing points, is a group of &amp;ldquo;tracks&amp;rdquo;&amp;nbsp; that are combined in a single Fragmented MP4 formatted bit stream. It&amp;rsquo;s the same bit stream that is transmitted over a single TCP connection from encoder or from another server. The grouping of tracks into streams is determined by the encoder. For example, you can have&amp;nbsp;some encoder that have in&amp;nbsp;output one track per stream and in this case you have many streams as the number of tracks. &amp;nbsp;Others encoder can have&amp;nbsp;in output all tracks in one stream, or&amp;nbsp; you can&amp;nbsp;have any combinations of the previous approach.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;A "track"&amp;nbsp; is a collection of related samples. In the case of&amp;nbsp; media data, a track&amp;nbsp;is a sequence of images or sampled audio. For example if the presentation has&amp;nbsp;X video bitrates, each one of them is a separate video track. You have a track&amp;nbsp;also for the&amp;nbsp;audio part of the presentation&amp;nbsp;or more of one if the streaming has a multiaudio and in this case we have one track for every audio supported. You can have not only media (audio\video) track, you can have data track like captioning or others type of data.&lt;/p&gt;
&lt;p&gt;In the tracks details you can see also the status of the stream , the last timestamp receives, track name and other information.&lt;/p&gt;
&lt;p&gt;Each stream can have two states: started or stopped. When the stream is in started state, it is receiving media data or ready to receive media data from new sources. It is important to understand that a &amp;ldquo;started&amp;rdquo; stream does NOT necessarily mean that it is&amp;nbsp;currently receiving live stream. A stream can stay in started state even if all connections from encoders have dropped. A stream can only be stopped by either an End-Of-Stream (EOS) signal from the encoder (or upstream server), a manual publishing point stop/shutdown command, or some internal errors. Without having any one of those three conditions, the stream will stay in started state. If you are looking for more information about Live Streaming Architecture and Fault Tolerance I suggest to you &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/10/27/iis-media-service-live-smooth-streaming-fault-tolerance-and-architecture.aspx"&gt;to read my post on this topics&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;In the "connection details " you can see source and destination in the pubpoint . Source: &amp;ldquo;Source&amp;rdquo; is&amp;nbsp;from the publishing point receive&amp;nbsp;data. Each source can provides one or more streams to the publishing point. In genaral, every stream&amp;nbsp; has one source. But in some scenarios, like active-active failover, you could have multiple sources from different locations sending in the same stream (identified by the Stream Name) to the same publishing point. In this case, the publishing point will do the proper job to consolidate the identical streams into one logical stream. The types of sources that IIS Media Services 4.0 support are: HTTP Push and HTTP Pull.&lt;br /&gt;Destination: &amp;ldquo;Destination&amp;rdquo; is where the media data goes to. The type of destination shows how the publishing point isuse the media data . The types of destinations in IIS Media Services 4.0 are: IIS Smooth Streaming, Apple HTTP Live Streaming, HTTP Push and HTTP Pull. The last two types of HTTP destinations are for server-to-server distribution.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;You can access to the pubpoint runtime status also using RSCA API.In order to use this API you can use Microsoft.Web.Administration.dll (can be found at IIS Directory %windir%\System32\inetSrv) or a JS script that leverage ActiveXObject("Microsoft.ApplicationHost.AdminManager").&lt;/p&gt;
&lt;p&gt;In order to access to a Pubpoint from managed code you can reference Microsoft.Web.Administration.dll and write this code in order to start the pub point:&lt;/p&gt;
&lt;p&gt;// Live Streaming Section Path &lt;br /&gt;const string LiveStreamingSectionPath = "system.webServer/media/liveStreaming"; &lt;/p&gt;
&lt;p&gt;//Pubpoint informations data&lt;/p&gt;
&lt;p&gt;// Site name &lt;br /&gt;string siteName = "Default Web Site"; &lt;br /&gt;// Application name &lt;br /&gt;string applicationName = "/SmoothStreaming"; &lt;br /&gt;// Publishing point filename &lt;br /&gt;string fileName = "LiveSmooth.isml"; &lt;/p&gt;
&lt;p&gt;ServerManager serverManager = new ServerManager(); &lt;/p&gt;
&lt;p&gt;// Gets the site from IIS &lt;br /&gt;Site site = serverManager.Sites[siteName]; &lt;/p&gt;
&lt;p&gt;// Gets the application from IIS &lt;br /&gt;Application application = site.Applications[applicationName]; &lt;/p&gt;
&lt;p&gt;// Gets the LiveStreamingSection from the site configuration &lt;br /&gt;ConfigurationSection section = site.GetWebConfiguration().GetSection(LiveStreamingSectionPath); &lt;/p&gt;
&lt;p&gt;// Gets the ConfigurationMethodInstance to get the available publishing points &lt;br /&gt;ConfigurationMethodInstance instance = section.Methods["GetPublishingPoints"].CreateInstance(); &lt;/p&gt;
&lt;p&gt;// Sets the input parameters of the GetPublishingPoints method &lt;br /&gt;instance.Input["siteName"] = site.Name; &lt;br /&gt;instance.Input["virtualPath"] = applicationName; &lt;/p&gt;
&lt;p&gt;// Executes the method &lt;br /&gt;instance.Execute(); &lt;/p&gt;
&lt;p&gt;// Gets the PublishingPointCollection associated with the method output &lt;br /&gt;ConfigurationElement collection = instance.Output.GetCollection(); &lt;/p&gt;
&lt;p&gt;// Looks for the publishing point and Invokes the desired method of the Publishing Point. &lt;br /&gt;// In this case we are calling the Start method (others supported functions are "Shutdown" and "Stop") &lt;br /&gt;foreach (var item in collection.GetCollection()) &lt;br /&gt;{ &lt;br /&gt;if (item.Attributes["name"].Value.ToString().Equals(fileName)) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var method = item.Methods["Start"]; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var methodInstance = method.CreateInstance();&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; methodInstance.Execute(); &lt;br /&gt;&amp;nbsp; break; &lt;br /&gt;} &lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;You can use the same API to read the runtime status information. Below a sample to read on a pubpoint active streams and tracks in input:&lt;/p&gt;
&lt;p&gt;// Live Streaming Section Path &lt;br /&gt;const string LiveStreamingSectionPath = "system.webServer/media/liveStreaming"; &lt;/p&gt;
&lt;p&gt;// Change this settings with your values &lt;/p&gt;
&lt;p&gt;// Site name &lt;br /&gt;string siteName = "Default Web Site"; &lt;br /&gt;// Application name &lt;br /&gt;string applicationName = "/SmoothStreaming"; &lt;br /&gt;// Publishing point filename &lt;br /&gt;string fileName = "LiveSmooth.isml"; &lt;/p&gt;
&lt;p&gt;ServerManager serverManager = new ServerManager(); &lt;/p&gt;
&lt;p&gt;// Gets the site from IIS &lt;br /&gt;Site site = serverManager.Sites[siteName]; &lt;/p&gt;
&lt;p&gt;// Gets the application from IIS &lt;br /&gt;Application application = site.Applications[applicationName]; &lt;/p&gt;
&lt;p&gt;// Gets the LiveStreamingSection from the site configuration &lt;br /&gt;ConfigurationSection section = site.GetWebConfiguration().GetSection(LiveStreamingSectionPath); &lt;/p&gt;
&lt;p&gt;// Gets the ConfigurationMethodInstance to get the available publishing points &lt;br /&gt;ConfigurationMethodInstance instance = section.Methods["GetPublishingPoints"].CreateInstance(); &lt;/p&gt;
&lt;p&gt;// Sets the input parameters of the GetPublishingPoints method &lt;br /&gt;instance.Input["siteName"] = site.Name; &lt;br /&gt;instance.Input["virtualPath"] = applicationName; &lt;/p&gt;
&lt;p&gt;// Executes the method &lt;br /&gt;instance.Execute(); &lt;/p&gt;
&lt;p&gt;// Gets the PublishingPointCollection associated with the method output &lt;br /&gt;ConfigurationElement collection = instance.Output.GetCollection(); &lt;/p&gt;
&lt;p&gt;ConfigurationElement collectionInputStreams=null;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;br /&gt;//Get Input Stream on a selected pubpoint&lt;br /&gt;foreach (var item in collection.GetCollection())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (item.Attributes["name"].Value.ToString().Equals(fileName))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var method = item.Methods["GetInputStreams"];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var methodInstance = method.CreateInstance();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; methodInstance.Execute();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; collectionInputStreams=methodInstance.Output.GetCollection();&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;//Read Streams and for each stream read Tracks&lt;br /&gt;foreach (var item in collectionInputStreams.GetCollection())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("Stream ID {0} State {1} archive file {2}", item.GetAttributeValue("id"), item.GetAttributeValue("state"), item.GetAttributeValue("archiveFileName"));&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var tracks = item.GetCollection("tracks");&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (var track in tracks)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine("TrackId {0} Name&amp;nbsp; {1} encoded bitrate {2} ", track.GetAttributeValue("id"), track.GetAttributeValue("name"), track.GetAttributeValue("encodedBitrate"));&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;Below the results in the Console after the execution of the previous code on a pubpoint on my PC:&lt;/p&gt;
&lt;p&gt;Stream ID 7936-stream4 State 1 archive file 7936-stream4.ismv&lt;br /&gt;TrackId 2 Name&amp;nbsp; video encoded bitrate 350000&lt;br /&gt;Stream ID 7936-stream1 State 1 archive file 7936-stream1.ismv&lt;br /&gt;TrackId 2 Name&amp;nbsp; video encoded bitrate 1050000&lt;br /&gt;Stream ID 7936-stream3 State 1 archive file 7936-stream3.ismv&lt;br /&gt;TrackId 2 Name&amp;nbsp; video encoded bitrate 475000&lt;br /&gt;Stream ID 7936-stream0 State 1 archive file 7936-stream0.ismv&lt;br /&gt;TrackId 2 Name&amp;nbsp; video encoded bitrate 1450000&lt;br /&gt;TrackId 1 Name&amp;nbsp; audio encoded bitrate 64000&lt;br /&gt;Stream ID 7936-stream2 State 1 archive file 7936-stream2.ismv&lt;br /&gt;TrackId 2 Name&amp;nbsp; video encoded bitrate 600000&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10101230" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Silverlight/">Silverlight</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IIS7/">IIS7</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Media/">Media</category></item><item><title>IIS Media Services 4.0 : Manifest Compression </title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/09/iis-media-services-4-0-manifest-compression.aspx</link><pubDate>Thu, 09 Dec 2010 14:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10100738</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10100738</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/09/iis-media-services-4-0-manifest-compression.aspx#comments</comments><description>&lt;p&gt;IIS Media Service 4.0 &lt;a target="_blank" href="http://blogs.iis.net/chriskno/archive/2010/11/01/iis-media-services-4-0-released.aspx"&gt;was released&lt;/a&gt; and now you can use it as an &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/11/iis-media-services-4-integrated-media-platform-streaming-for-pc-windows-phone-tv-and-iphone-ipad-with-a-single-platform.aspx"&gt;integrated media platform &lt;/a&gt;.&amp;nbsp; As you can&amp;nbsp;&amp;nbsp;read in&amp;nbsp;&lt;a target="_blank" href="http://blogs.iis.net/chriskno/archive/2010/11/01/iis-media-services-4-0-released.aspx"&gt;Chris Knowlton blog post &lt;/a&gt;there are a lot of new features in IIS Media Services&amp;nbsp; 4.0 not only&amp;nbsp;connected to the integrated media platform that I &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/11/iis-media-services-4-integrated-media-platform-streaming-for-pc-windows-phone-tv-and-iphone-ipad-with-a-single-platform.aspx"&gt;described in my previous post on this&lt;/a&gt;. We&amp;nbsp;have&amp;nbsp;a lot&amp;nbsp;additionals features for iOS support like:&lt;/p&gt;
&lt;p&gt;&amp;bull;Live DVR &amp;ndash; Pause, Rewind, Seek &lt;br /&gt;&amp;bull;Archiving &amp;ndash; saves the live content for DVR use or later on-demand playback &lt;br /&gt;&amp;bull;Archive Segmentation &amp;ndash; breaks a long broadcast archive into shorter clips for storage purposes &lt;br /&gt;&amp;bull;AES Encryption &amp;ndash; keeps your content safe while streaming &lt;br /&gt;&amp;bull;B-frame support &amp;ndash; provides better picture quality &lt;br /&gt;&amp;bull;Compatibility mode for iOS3 devices&lt;/p&gt;
&lt;p&gt;and&amp;nbsp;about performance improvements like:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;bull;Publishing point runtime status &amp;ndash; provides real-time stats via APIs and the UI &lt;br /&gt;&amp;bull;Manifest compression &amp;ndash; reduces the size of the manifest sent to clients &lt;br /&gt;&amp;bull;Metadata delivery support &amp;ndash; delivers RDF format metadata from encoder to the client &lt;br /&gt;&amp;bull;Reduced memory usage &amp;ndash; handles even higher server loads &lt;br /&gt;&amp;bull;Smarter disk access &amp;ndash; provides higher consistency server performance &lt;br /&gt;&amp;bull;Dedicated fragment caching &amp;ndash; reduces disk access during live sessions &lt;br /&gt;&amp;bull;Low latentcy in end to end streaming&lt;/p&gt;
&lt;p&gt;&amp;nbsp;One of the feature added in this version that you can leverage&amp;nbsp; is about manifest compression in Live Streaming. We have some improvements that are active by default in&amp;nbsp;IIS MS 4.0 that are compatible with previous player version and some additional improvement that can be activated on IIS MS 4.0 but that are compatible only with player based on&amp;nbsp; Smooth Streaming Media Element&amp;nbsp; (SSME)&amp;nbsp;version&amp;nbsp;&amp;gt;= 1.5&amp;nbsp;&amp;nbsp;. These features can permit to have a to fast experience during parsing of manifest because permit to reduce the dimension of the manifest. &lt;/p&gt;
&lt;p&gt;The typical format of manifest for the chunks rappresentation during a Live Streaming in the previous version&amp;nbsp;of IIS MS&amp;nbsp;during a live look like&amp;nbsp;below sample:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;lt;c t=&amp;rdquo;80000000&amp;rdquo;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c t=&amp;rdquo;100000000&amp;rdquo;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c t=&amp;rdquo;120000000&amp;rdquo;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c t=&amp;rdquo;140000000&amp;rdquo;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c t=&amp;rdquo;160000000&amp;rdquo;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c t=&amp;rdquo;180000000&amp;rdquo;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;in this manifest&amp;nbsp;t rappresent the timestamp of the chunks. In the IIS MS 4.0 we have by default a new manifest format&amp;nbsp; during a live based on the version 2.0 of manifest that is compatible with&amp;nbsp;the&amp;nbsp;previous version of Smooth Streaming&amp;nbsp;Media Element (SSME)&amp;nbsp; but that can permit&amp;nbsp; to have a better compression ratio&amp;nbsp;with gzip with good&amp;nbsp;results&amp;nbsp;:&lt;/p&gt;
&lt;p&gt;&amp;lt;c t=&amp;rdquo;80000000&amp;rdquo; d=&amp;rdquo;20000000&amp;rdquo;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c d=&amp;rdquo;20000000&amp;rdquo;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c d=&amp;rdquo;20000000&amp;rdquo;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c d=&amp;rdquo;20000000&amp;rdquo;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c d=&amp;rdquo;20000000&amp;rdquo;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c d=&amp;rdquo;20000000&amp;rdquo;&amp;gt;&lt;/p&gt;
&lt;p&gt;in this case we have a manifest that have the same information of the previous but we have the timestamp indicated only in the first chunk and with d a duration of&amp;nbsp;every chunk&amp;nbsp;that can permit to calculate the timestamp of every chunk&amp;nbsp;. This format is a default in IIS MS 4.0 and is compatible with the current versio v1.1 of SSME&lt;/p&gt;
&lt;p&gt;In addition to the previous improvement you can activate on the live pub point the 2.2 version of the manifest that can permit to use a new keyword to obtain more compression in the manifest. For example if we activate 2.2 manifest version the previous manifest client is:&lt;/p&gt;
&lt;p&gt;&amp;lt;c t=&amp;rdquo;8000000&amp;rdquo; d=&amp;rdquo;20000000&amp;rdquo; r=&amp;rdquo;6&amp;rdquo;&amp;gt;&lt;/p&gt;
&lt;p&gt;where r is the&amp;nbsp; repeat tag that&amp;nbsp;means in this case the number of times that the chunk with the same duration as repeated . This manifest is logical equivalent to the previous and means that we have 6 chunks with duration of d=&amp;rdquo;20000000&amp;rdquo;&amp;nbsp;&amp;nbsp;&amp;nbsp;starting from timestamp of&amp;nbsp;&amp;nbsp;t=&amp;rdquo;80000000&amp;rdquo; . This format&amp;nbsp;can permit to reduce the manifest dimension in same case to small fixed size, but&amp;nbsp;&amp;nbsp;it is compatible only with SSME &amp;gt;= v 1.5 .&lt;/p&gt;
&lt;p&gt;You can enable Smooth Streaming Manifest Format&amp;nbsp; version 2.2&amp;nbsp; on a live publishing point in IIS Media Services 4.0 adding the tag below in the &amp;lt;head&amp;gt; sections of .isml file created for a publishing point:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;lt;meta name="clientManifestVersion" content="22" /&amp;gt;&lt;/p&gt;
&lt;p&gt;Pay attention to activate this feature because&amp;nbsp; I mentioned before if you activate this version of manifest on IIS MS 4.0 only player&amp;nbsp;based on SSME &amp;nbsp;&amp;gt;=&amp;nbsp; version&amp;nbsp;1.5 are able to read the manifest and put at work streaming. You can download&amp;nbsp;&lt;a target="_blank" href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=b6e83c29-02a5-465b-86e5-522b3cfcb1fa"&gt;Smooth Streaming Media Element&amp;nbsp;Client SDK v1.5&lt;/a&gt; that is compatible with this new version of manifest&amp;nbsp;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10100738" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Silverlight/">Silverlight</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IIS7/">IIS7</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Media/">Media</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/WP7/">WP7</category></item><item><title>Using Smooth Streaming Media Element for Windows Phone 7</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/06/using-smooth-streaming-media-element-for-windows-phone-7.aspx</link><pubDate>Mon, 06 Dec 2010 15:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10100675</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>11</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10100675</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/06/using-smooth-streaming-media-element-for-windows-phone-7.aspx#comments</comments><description>&lt;p&gt;In &lt;a href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/10/10/integrated-media-platform-smooth-streaming-media-element-for-windows-phone-7-and-smf-2-2.aspx" target="_blank"&gt;my previous post&lt;/a&gt; I described the avaliability of&amp;nbsp; Smooth Streaming Media Element (SSME) for Windows Phone&amp;nbsp;(WP) as a part of the &lt;a href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/11/iis-media-services-4-integrated-media-platform-streaming-for-pc-windows-phone-tv-and-iphone-ipad-with-a-single-platform.aspx" target="_blank"&gt;Integrated Media Platform&amp;nbsp;vision for IIS Media Services&lt;/a&gt;. In this post I would show you how you can use&amp;nbsp;SSME for WP7 in order to reproduce&amp;nbsp;Smooth Streaming (SS) content live and ondemand. In this post I'll show you how it is possible use directly SSME in a WP project but I&amp;nbsp;would remember that if you are looking for a complete player solution you can leverage&amp;nbsp;the &lt;a href="http://smf.codeplex.com/" target="_blank"&gt;Silverlight Media Framework&lt;/a&gt;&amp;nbsp; that give to you a complete solution based on SSME compatible also with WP&amp;nbsp;.&lt;/p&gt;
&lt;p&gt;For first you can download the dll that contain SSME for WP from the latest version of &amp;nbsp;&lt;a href="http://www.iis.net/download/SmoothClient"&gt;Smooth Streaming Client SDK&lt;/a&gt;&amp;nbsp;. After&amp;nbsp;intalled the SS Client&amp;nbsp;SDK&amp;nbsp; you can&amp;nbsp;found the Microsoft.Web.Media.SmoothStreaming.dll for WP7 &amp;nbsp;&amp;nbsp; in (your drive):\Program Files (x86)\Microsoft SDKs\IIS Smooth Streaming Client\&amp;nbsp; select the Windows&amp;nbsp;Phone version.&lt;/p&gt;
&lt;p&gt;In order to start with WP you have to download and Install Visual Studio for Windows Phone Tool and Expression Encoder for Windows Phone . You can read all the info for starting with Windows Phone&amp;nbsp; &lt;a href="http://create.msdn.com/en-us/home/getting_started" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you are intrested in a global player that works in every page of your app and in a live smooth streaming audio only, you can read for more info this additional &lt;a href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2011/06/22/using-a-global-audio-player-and-ee4-for-live-audio-smooth-streaming-on-windows-phone-7.aspx" target="_blank"&gt;post&lt;/a&gt; on this topics.&lt;/p&gt;
&lt;p&gt;You can start a new Windows Phone&amp;nbsp;&amp;nbsp;project from Visual Studio using the specific template project:&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img border="0" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/6114.wp71.PNG" width="674" height="393" /&gt;&lt;/p&gt;
&lt;p&gt;And after that you can add a reference to Microsoft.Web.Media.SmoothStreaming.dll for WP :&lt;/p&gt;
&lt;p&gt;&lt;img border="0" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/6266.wp72.PNG" /&gt;&lt;/p&gt;
&lt;p&gt;In order to insert the SSME in your project you have to add a reference to your MainPage.xaml page, and insert this reference in the &amp;lt;phone:PhoneApplicationPage tag:&lt;/p&gt;
&lt;p&gt;&lt;span style="color: #ff0000;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;xmlns:SSME="clr-namespace:Microsoft.Web.Media.SmoothStreaming;assembly=Microsoft.Web.Media.SmoothStreaming"&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I suggest to change also the Orientation Support on the page in order to have the landscape orientation that is more useful for wotching videos:&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; SupportedOrientations="Landscape" Orientation="Landscape"&lt;/p&gt;
&lt;p&gt;&amp;nbsp;this means that you have this PhoneApplicationPage tag in your mainpage.xaml:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;lt;phone:PhoneApplicationPage &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; x:Class="WindowsPhoneSSMESample.MainPage"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns="&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&lt;/a&gt;"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:x="&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml"&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/a&gt;"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:d="&lt;a href="http://schemas.microsoft.com/expression/blend/2008"&gt;http://schemas.microsoft.com/expression/blend/2008&lt;/a&gt;"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:mc="&lt;a href="http://schemas.openxmlformats.org/markup-compatibility/2006"&gt;http://schemas.openxmlformats.org/markup-compatibility/2006&lt;/a&gt;"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:SSME="clr-namespace:Microsoft.Web.Media.SmoothStreaming;assembly=Microsoft.Web.Media.SmoothStreaming"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mc:Ignorable="d" d:DesignWidth="728" d:DesignHeight="480"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FontFamily="{StaticResource PhoneFontFamilyNormal}"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FontSize="{StaticResource PhoneFontSizeNormal}"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Foreground="{StaticResource PhoneForegroundBrush}"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SupportedOrientations="Landscape" Orientation="Landscape"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; shell:SystemTray.IsVisible="True" Loaded="PhoneApplicationPage_Loaded"&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;In this way you have referenced a namespace SSME that point to the control that are in Microsoft.Web.Media.SmoothStreaming and you could insert these in your xaml page. Now you can add in ContentPanel Grid this tag in order to insert SSME in your page:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;lt;!--ContentPanel - place additional content here--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"&amp;gt;&amp;lt;/Grid&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;SSME:SmoothStreamingMediaElement x:Name="video"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;/p&gt;
&lt;p&gt;We&amp;nbsp;can use&amp;nbsp; video as a reference from our code to the instance of SSME inserted in the page. From the Loaded Event in MainPage.xaml we can manage the reference and set the SmoothStreamingSource property to the uri of the manifest SS content that we want reproduce:&lt;/p&gt;
&lt;p&gt;&amp;nbsp; video.SmoothStreamingSource = new Uri("&lt;a href="http://localhost/adaptivestreaming/video/vc1/big_buck_bunny_1080p_surround.ism/manifest"&gt;http://localhost/adaptivestreaming/video/vc1/big_buck_bunny_1080p_surround.ism/manifest&lt;/a&gt;");&amp;nbsp;&lt;/p&gt;
&lt;p&gt;You can use Play ,&amp;nbsp;Stop, Pause method to control reproduction and you can subscribe all the event in the SSME like &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; video.CurrentStateChanged&amp;nbsp; or &amp;nbsp; video.MediaFailed or &amp;nbsp; video.ManifestReady&amp;nbsp; to manage the lifecycle of the SSME in the same way that is possible do for SSME for PC (&lt;a href="http://msdn.microsoft.com/en-us/library/ee958035(v=VS.90).aspx"&gt;http://msdn.microsoft.com/en-us/library/ee958035(v=VS.90).aspx&lt;/a&gt;) .In order to access to the SSME from the code you have to add to your .cs file this namespace:&lt;/p&gt;
&lt;p&gt;using Microsoft.Web.Media.SmoothStreaming;&lt;/p&gt;
&lt;p&gt;For example in order to manage Play, Pause, audio volume etc and to show status of Streaming and current Level of bitrates involved in the reproduction we can add these elements to our xaml:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp; &amp;lt;!--LayoutRoot is the root grid where all page content is placed--&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid x:Name="LayoutRoot" Background="Transparent"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid.RowDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height="0.90*"&amp;gt;&amp;lt;/RowDefinition&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;RowDefinition Height="0.10*"&amp;gt;&amp;lt;/RowDefinition&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid.RowDefinitions&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;SSME:SmoothStreamingMediaElement x:Name="video" Grid.Row="0" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;StackPanel Orientation="Horizontal" Grid.Row="1"&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Button&amp;nbsp;&amp;nbsp; x:Name="PlayButton" Width="50" Click="PlayButton_Click" Loaded="PlayButton_Loaded"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Button&amp;nbsp;&amp;nbsp; x:Name="StopButton" Content="Stop" Width="50" Click="StopButton_Click" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBlock x:Name="status"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBlock x:Name="currentBitrate"/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/StackPanel&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;/p&gt;
&lt;p&gt;I removed the content grid and added directly in the first layaout grid in our mainpage.xaml:&lt;/p&gt;
&lt;p&gt;- two buttons used&amp;nbsp;for Play and Stop directly attached to an&amp;nbsp;handler for click event&amp;nbsp;in the code described before;&lt;/p&gt;
&lt;p&gt;- two textblocks used to present status and current bitrates used in reproduction&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;On the code in .cs files I added this handler and additional code in the loaded&amp;nbsp;event:&lt;/p&gt;
&lt;p&gt;private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;video.CurrentStateChanged += new RoutedEventHandler(video_CurrentStateChanged);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; video.PlaybackTrackChanged +=new EventHandler&amp;lt;TrackChangedEventArgs&amp;gt;(video_PlaybackTrackChanged);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; video.SmoothStreamingSource = new Uri("&lt;a href="http://localhost/adaptivestreaming/CESARONI_DVD02Video.ism/manifest"&gt;http://localhost/adaptivestreaming/CESARONI_DVD02Video.ism/manifest&lt;/a&gt;");&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void video_PlaybackTrackChanged(object sender, TrackChangedEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currentBitrate.Text = e.NewTrack.Bitrate.ToString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void video_CurrentStateChanged(object sender, RoutedEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; status.Text = video.CurrentState.ToString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void StopButton_Click(object sender, RoutedEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //This should simply stop the playback&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; video.Stop();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //We should also reflect the chang on the play button&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PlayButton.Content = "Play";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void PlayButton_Loaded(object sender, RoutedEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (video.AutoPlay)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case false:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PlayButton.Content = "Play";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case true:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PlayButton.Content = "Pause";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void PlayButton_Click(object sender, RoutedEventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Monitor the state of the content to determine the right action to take on this button being clicked&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //and then change the text to reflect the next action&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; switch (video.CurrentState)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case SmoothStreamingMediaElementState.Playing:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; video.Pause();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PlayButton.Content = "Play";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case SmoothStreamingMediaElementState.Stopped:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; case SmoothStreamingMediaElementState.Paused:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; video.Play();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PlayButton.Content = "Pause";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;As you can see before I&amp;nbsp;subrcibed in Loaded event two events :&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;video.CurrentStateChanged += new RoutedEventHandler(video_CurrentStateChanged);&lt;br /&gt;&amp;nbsp; video.PlaybackTrackChanged +=new EventHandler&amp;lt;TrackChangedEventArgs&amp;gt;(video_PlaybackTrackChanged);&lt;/p&gt;
&lt;p&gt;The first is used to catch change status in SSME and in the handler I write in a specifc TextBlock the current status of SSME, in the second we capture changes in bitrates level&amp;nbsp;used in reproduction and also in this case in the handler I write the current level of bitrate&amp;nbsp;in a specific TextBlock.&lt;/p&gt;
&lt;p&gt;The others handlers added to the code are conected to the click event and are used to manage the play stop pause on the SSME. You could read in the code before how this works.&lt;/p&gt;
&lt;p&gt;If you would avoid that the application is deactiveted when the Phone&amp;nbsp;go idle&amp;nbsp;or lock (for example you stream audio content and would that the user continue to listen the content )&amp;nbsp;, you can add to the Loaded Event this&amp;nbsp;code:&lt;/p&gt;
&lt;p&gt;PhoneApplicationService.Current.ApplicationIdleDetectionMode = IdleDetectionMode.Disabled;&lt;/p&gt;
&lt;p&gt;that prevent deactivation of the app like you can read &lt;a href="http://forums.create.msdn.com/forums/p/67508/412379.aspx" target="_blank"&gt;here&lt;/a&gt;&amp;nbsp;and in the &lt;a href="http://msdn.microsoft.com/en-us/library/ff941090(VS.92).aspx?appId=Dev10IDEF1&amp;amp;l=EN-US&amp;amp;k=k(MICROSOFT.PHONE.SHELL.PHONEAPPLICATIONSERVICE.APPLICATIONIDLEDETECTIONMODE);k(APPLICATIONIDLEDETECTIONMODE);k(TargetFrameworkMoniker-%22SILVERLIGHT&amp;amp;k=VERSION=V4.0%22);k(DevLang-CSHARP)&amp;amp;rd=true" target="_blank"&gt;specific api description in sdk of wp&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;With SSME for WP7 you can&amp;nbsp;play also audio only streaming.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In order to reproduce&amp;nbsp;SS content with SSME on WP7 you have to pay attention&amp;nbsp;to some additional rules about the type of content supported in the current version of WP7 and SSME 1.5. Here you have a list of&amp;nbsp;supported codecs for SS: &amp;nbsp;VC1 / H.264 for video, WMA Pro/HEAAC/AACL for audio.&lt;/p&gt;
&lt;p&gt;The Maximum Resolution admited on the W7 for H.264 are :&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;720 x 480 pixels at 30 fps&lt;/li&gt;
&lt;li&gt;720 x 576 pixels at 25 fps&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Current profile for H264 supported on the&amp;nbsp;phone are baseline and main&amp;nbsp; Level 3.0.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;It is nesessary PAY ATTENTION TO THE FACT THAT&amp;nbsp;IN CURRENT VERSION OF WP&amp;nbsp;IN SOME HW&amp;nbsp;MULTIPLE RESOLUTIONS BITRATE ISN'T SUPPORTED&amp;nbsp; this means that it is necessary have the same resolution for all the bitrates inlcuded in the range of levels to reproduce in SSME for WP7.&amp;nbsp; You can check&amp;nbsp;if the device supports multiple resolutions during a play&amp;nbsp;with this api &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.info.mediacapabilities.ismultiresolutionvideosupported(v=VS.92).aspx" target="_blank"&gt;http://msdn.microsoft.com/en-us/library/microsoft.phone.info.mediacapabilities.ismultiresolutionvideosupported(v=VS.92).aspx&lt;/a&gt;. In the case that the devices doesnt support multiple resolution&amp;nbsp;and you have a previous encoded content with multiple resolutions or you want create a&amp;nbsp;&amp;nbsp;single asset for&amp;nbsp;multiple devices , you have to&amp;nbsp;pay attention to this and in the case you can use the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.web.media.smoothstreaming.streaminfo.restricttracks(v=VS.90).aspx" target="_blank"&gt;StreamInfo.RestrictTracks API&lt;/a&gt; &amp;nbsp; in a ManifestReady event , in order to restrict the range of bitrates used in&amp;nbsp;reproduction . For example imagine to have a manifest that&amp;nbsp;have for biterates&amp;nbsp;&amp;lt;= of 600K the same resolutions and for bitrates&amp;nbsp;&amp;gt;&amp;nbsp;&amp;nbsp;400k a variable resolutions in order to meet quality requirements of others devices like a PC, in the case tha the&amp;nbsp; is multipleresolutionvideo supported respond with false you can add the code below in the manifest ready event on WP in order to limit the bitarates used in the reproduction :&lt;/p&gt;
&lt;p&gt;&amp;nbsp;void video_ManifestReady(object sender, EventArgs e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (video == null)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (SegmentInfo segment in video.ManifestInfo.Segments)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (StreamInfo streaminfo in segment.AvailableStreams)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (MediaStreamType.Video == streaminfo.Type)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; List&amp;lt;TrackInfo&amp;gt; tracks = new List&amp;lt;TrackInfo&amp;gt;();&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (TrackInfo track in streaminfo.AvailableTracks)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (track.Bitrate &amp;lt;= 400000)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tracks.Add(track);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; streaminfo.RestrictTracks(tracks);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p&gt;You can subcribe the ManifestReady event in SSME called video in this way :&amp;nbsp; video.ManifestReady += new EventHandler&amp;lt;EventArgs&amp;gt;(video_ManifestReady);&lt;/p&gt;
&lt;p&gt;In alternative you can create an adhoc manifest, server side , one for every devices and point every devices to the right manifest.&lt;/p&gt;
&lt;p&gt;Propose an encoding profile&amp;nbsp;is difficult because there are a lot of parameters to consider like bandwith avaliable type of content etc, but on my experience in others project that leverare SS for WP7 I can suggest to have in the&amp;nbsp;manifest of&amp;nbsp;your content this generic profile:&lt;/p&gt;
&lt;p&gt;&amp;nbsp; Use Main Level 3.0&amp;nbsp; with 640x352 for 16:9 with this levels: 1000 k(Full framerate but &amp;lt;=30) , 800k (Full framerate but &amp;lt;=30) , 600k (Full framerate but &amp;lt;=30) , 400k (Full framerate but &amp;lt;=30) , 200k (half framerate &amp;lt;=15), 100 k(half framerate &amp;lt;=15)&lt;/p&gt;
&lt;p&gt;If you would serve the same content to WP7, PC and Apple Devices like iPhone and iPad leveraging the &lt;a href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/11/iis-media-services-4-integrated-media-platform-streaming-for-pc-windows-phone-tv-and-iphone-ipad-with-a-single-platform.aspx" target="_blank"&gt;capability of IIS Media Services 4.0 and IIS Transform Manager&lt;/a&gt; , you have to built a profile using H264 Baseline Level 3.0 and pay attention to the resolutions in differents bitrates levels and Transmux the SS also in Apple Adaptive Streaming.&lt;/p&gt;
&lt;p&gt;If you have to stream a to low level of the maximu 1000k suggested before , you can leverage these profiles for WP7 and iPhone/iPad and in the case add more level fo PC using variable resolution for profiles &amp;gt; 600k and use RestrictTracks API on PC for the minimu bitrates for WP7 for the maximum bitrate and during the transmux operation on IIS Transform Manager and IIS MS 4,0 (in the case of live streaming ) limiting&amp;nbsp;profile fo Apple devices to 600k&amp;nbsp;:&lt;/p&gt;
&lt;p&gt;4:3 use Baseline Level 3.0&amp;nbsp; with 480x360 with this levels: 600 k(Full framerate but &amp;lt;=30) ,&amp;nbsp; 400k (Full framerate but &amp;lt;=30) , 200k (half framerate &amp;lt;=15), 100 k(half framerate &amp;lt;=15)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;16:9 use Baseline Level 3.0&amp;nbsp; with 480x272 with this levels: 600 k(Full framerate but &amp;lt;=30) ,&amp;nbsp; 400k (Full framerate but &amp;lt;=30) , 200k (half framerate &amp;lt;=15), 100 k(half framerate &amp;lt;=15)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;If you don't need to cover old iPhone you could move to Main Level 3.0 with the same resolution in order to increase the quality.&lt;/p&gt;
&lt;p&gt;Pay attention to the fact that&amp;nbsp; profiles suggested before are only a sample and not necessary these profile are good for your scenarios. It is necessary test it&amp;nbsp; and adjust it to your requirements in order to have the best solution.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10100675" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Silverlight/">Silverlight</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IIS7/">IIS7</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Media/">Media</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/WP7/">WP7</category></item><item><title>Promuovere il Pinning del nostro sito con Internet Explorer 9 utilizzando unobtrusive JavaScript</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/03/promuovere-il-pinning-del-nostro-sito-con-internet-explorer-9.aspx</link><pubDate>Fri, 03 Dec 2010 09:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10097033</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10097033</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/03/promuovere-il-pinning-del-nostro-sito-con-internet-explorer-9.aspx#comments</comments><description>&lt;p&gt;Il Pinning e la Windows 7 Experience sono una delle feature interessanti di IE9 per portare il nostro sito direttamente sul desktop dei nostri utenti.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Con i Pinned Site si possono trascinare ed agganciare direttamente alla barra delle applicazioni di Windows 7 i siti trascinando l'icona dal box dell'indirizzo direttamente sulla barra :&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-87-58/0447.pinning.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;L'icona rimane agganciata alla barra di Windows 7 e consente di avere il sito disponibile come una applicazione direttamente all'interno del desktop e di poterci accedere nuovamente partendo dall'icona aggiunta alla barra delle applicazioni: &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-87-58/4314.pinned.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Nel &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/16/internet-explorer-9-implementare-i-pinned-site-e-la-windows-7-experience.aspx"&gt;mio precedente post sull'argomento ho illustrato &lt;/a&gt;come sia semplice implementare questa funzionalit&amp;agrave; .&amp;nbsp; Rimanere in contatto con l'utente e portare il nostro sito direttamente sul desktop dell'utente ha un grosso valore aggiunto &amp;egrave; pu&amp;ograve; incrementare l'utilizzo della nostra applicazione significativamente. Promuovere &amp;egrave; spiegare all'utente che pu&amp;ograve; sfruttare questa funzionalit&amp;agrave; e rimanere con pi&amp;ugrave; facilit&amp;agrave; in contatto con i nostri servizi contribusce ulteriormente a promuovere l'utilizzo del nostro sito.&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;Introdotta con la RC di IE9 per semplificare ulteriormente la&amp;nbsp;proposizione del Pinning,&amp;nbsp; la possibilit&amp;agrave; di applicare uno specifico stile il "pinImage" per permettere il Pinning direttamente da un elemento immagine:&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;&amp;lt;img id="pinImage" class="msPinSite" src="Images/sample.ico" /&amp;gt;&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;Applicando lo stile indicato sopra si pu&amp;ograve; effettuare il Pinning trascinando direttamente l'immagine sulla barra di windows.&lt;/p&gt;
&lt;p&gt;I siti che nel mondo hanno gi&amp;agrave; cominciato ad implementare il Pinning e le JumpList hanno anche cominciato a promuovere in modo molto semplice verso gli utenti che gi&amp;agrave; usano IE9 la possibilit&amp;agrave; di sfruttare il Pinning . Anche in italia abbiamo diversi importanti siti che hanno cominciato a proporre il Pinning con un'interessante modalit&amp;agrave; che prevede la comparsa di un banner temporizzato che l'utente pu&amp;ograve; anche eliminare.&lt;/p&gt;
&lt;p&gt;Di seguito abbiamo alcuni esempi riportati tra i tanti esistenti &lt;a target="_blank" href="http://www.mclips.it/archive/2010/11/10/internet-explorer-9-beta-oltre-i-10-milioni-di-download.aspx"&gt;tra i primi partner in italia &lt;/a&gt;che hanno implementato questa funzionalit&amp;agrave; :&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/8625.meteo.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/1351.mtv.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/2235.Deejay.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Ho pensato che questo tipo di banner pu&amp;ograve; essere utile in tutti i siti e applicazioni per promuovere l'utilizzo di questa funzionalit&amp;agrave; presso i nostri utenti e fornire loro&amp;nbsp;nuovi servizi con il Pinning e le JumpList e facilitare l'utilizzo dei nostri siti e servizi.&amp;nbsp;Implementare poi un semplice esempio in JS che consenta&amp;nbsp;di implementare un banner di promozione del Pinning come quello illustrato che possa essere facilmente inserito in qualunque sito senza impattare in modo significativo sulla struttura del sito, ci da anche la possibilit&amp;agrave; di mostrare un buon esempio di unobtrusive JavaScript e di feature detection code invece del browser detection code. &lt;/p&gt;
&lt;p&gt;Per &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Unobtrusive_JavaScript"&gt;unobtrusive JavaScript &lt;/a&gt;si intende semplificando in modo generico l'implementazione di una funzionalit&amp;agrave; che possa essere aggiunta ad una pagina senza alterarne in modo significativo la struttura e che possa&amp;nbsp; servire la funzionalit&amp;agrave; in modo corretto in base alle capacit&amp;agrave; dei diversi browser che navigano sulla pagina.&lt;/p&gt;
&lt;p&gt;Nel nostro caso, questo significa implementare uno script che possa essere referenziato nella pagina e che mostri il banner senza bisogno di modificare la struttura della pagina preesistente, applicando il comportamento in modo corretto sui browser che implementano il Pinning, senza alterare il comportamento della pagina per quelli che non lo supportano. L'implementazione fatta &amp;egrave; semplicemente una implementazione di esempio, non ha l'ambizione di essere una soluzione&amp;nbsp;finale utilizzabile in ogni scenario, ma vuole essere un esempio&amp;nbsp;di base da cui partire. L'esempio contiene solo la parte di banner che propone il Pinning. Per implementare Pinning e JumpList sul vostro sito trovate le informazioni e &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/16/internet-explorer-9-implementare-i-pinned-site-e-la-windows-7-experience.aspx"&gt;gli esempi nel mio precedente post sull'argomento&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;L'implementazione &amp;egrave; contenuta in un file js&amp;nbsp;e per portarla a funzionare su una vostra &amp;nbsp;pagina basta includere il riferimento al file js, senza alcun cambiamento alla struttura della pagina.&amp;nbsp;Per innescare lo script che porta a&amp;nbsp;far comparire il banner&amp;nbsp;nei casi opportuni ed a gestirne&amp;nbsp;l'utilizzo e l'interazione con l'utente, viene utilizzato come classico nelle implementazioni unobstrusive, l'evento DOMContentLoaded ora supportato anche in Internet Explorer&amp;nbsp;9. In particolare all'inizio dello script di esempio che implementa la funzionalit&amp;agrave; di promozione del Pinning abbiamo la seguente istruzione:&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;em&gt;//start check for message on DOM Loaded&lt;br /&gt;window.addEventListener("DOMContentLoaded", function(){ var alertP= new IEPinningAlert();alertP.init();},false);&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Sul DomContentLoaded viene eseguita la funzione init() associata ad una nuova istanza di IEPinningAlert che vedete di seguito:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;function IEPinningAlert(){&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;var myAlert;&lt;br /&gt;var cookieName="pinning";&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;this.init=function()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (window.external.msIsSiteMode() == false) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.start();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Already Pinned&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (e) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Pinning not supported&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //alert("Pinning non supportato");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;em&gt;}&lt;br /&gt;&lt;/em&gt;&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&amp;nbsp;Nella funzione &lt;em&gt;init()&lt;/em&gt; viene usata la nuova API JS di IE9&amp;nbsp;&amp;nbsp;&lt;em&gt;window.external.msIsSiteMode()&amp;nbsp;&lt;/em&gt;&amp;nbsp; che risponde con true se il sito &amp;egrave; gi&amp;agrave; Pinned e con false se il sito non &amp;egrave; ancora stato agganciato alla TaskBar di Windows. Nel caso di true nella nostra funzione,&amp;nbsp;viene eseguita la funzione &lt;em&gt;start()&lt;/em&gt; riportata sotto che si preoccupa di mostrare il banner. In &lt;em&gt;init()&lt;/em&gt; abbiamo&amp;nbsp; anche un esempio di feature detection code tipico dell'approccio unobstrusive. Come potete vedere sopra l'if sulla API JS &lt;em&gt;window.external.msIsSiteMode()&lt;/em&gt;&amp;nbsp; viene eseguito in un try catch in modo da avere tre opzioni: sito pinned, non pinned o in caso di eccezione API non supportata da browser. In questo modo invece di ragionare con una logica browser detection , ovvero inserire un if che decide se eseguire o meno il codice per il banner in base al riconoscimento del tipo di browser e della versione, usiamo l'approccio diretto di verifica della implementazione della funzionalit&amp;agrave; da parte del browser che &amp;egrave; la pratica corretta per implementare del codice pi&amp;ugrave; robusto e che continui a funzionare correttamente anche in versioni future del browser.&lt;/p&gt;
&lt;p&gt;Di seguito abbiamo l'implementazione della funzione &lt;em&gt;start()&lt;/em&gt; che esegue le due funzioni &lt;em&gt;createHTML()&lt;/em&gt; e &lt;em&gt;createStyle()&lt;/em&gt; che praticamente creano l'HTML per il box che propone il Pinning che viene poi mostrato con la funzione &lt;em&gt;showAlert()&lt;/em&gt; .&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;em&gt;this.start=function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //if cookie hide message&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;var IsCookie = readCookie('pinning');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!IsCookie){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.createHtml();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.createStyle();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myAlert = document.getElementById('alertWrapper');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; myAlert.style.top = 0 - myAlert.offsetHeight + 'px';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;showAlert(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;};&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;di seguito un immagine del banner:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img height="119" width="690" src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/5074.pinningprop.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Viene usato un Cookie per dare la possibilit&amp;agrave; all'utente di disattivare l'alert senza dover agganciare il Pinning. Il banner presenta un messaggio differente nel caso in cui IE9 &amp;egrave; in esecuzione su Vista in quanto il pinning sulla taskbar &amp;egrave; possibile solo in Windows 7, mentre sia in Windows Vista che in Windows 7 &amp;egrave; possibile il pin sul men&amp;ugrave; start che si pu&amp;ograve; effettuare eseguento la specifica API JS e che nel nostro esempio viene presentata con il pulsante Pin To Start Men&amp;ugrave;. In caso che il sistema operativo &amp;egrave; Windows Vista viene presentato solo il pulsante Pin To Start Men&amp;ugrave; senza la scritta trascina l'icona sulla taskbar che viene mostrata solo se IE9 &amp;egrave; in esecuzione su Windows 7. Si possono inserire dei link aggiuntivi a pagine del nostro sito che spiegano all'utente cosa si pu&amp;ograve; fare con il Pinning, un buon esempio di questo approccio lo trovate sul sito meteo.it che ha &lt;a href="http://www.meteo.it/Centro-Epson-Meteo/Internet-Explorer-9-e-Meteoit/content/it/1-692-305755-57634"&gt;appunto una pagina dedicata a questo&lt;/a&gt;&amp;nbsp;lanciata da un link nel banner di proposizione del Pinning.&lt;/p&gt;
&lt;p&gt;Di seguito le due funzioni showAlert e hideAlert:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;//show alert &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;function showAlert() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(parseInt(myAlert.style.top) &amp;lt; 0){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//myAlert.style.top = parseInt(myAlert.style.top) + 2 + 'px';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myAlert.style.top = '0px';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setTimeout(showAlert,100); // call showAlert&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setTimeout(hideAlert,20000);// call hideAlert &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Hide alert &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;function hideAlert() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(parseInt(myAlert.style.top) &amp;gt; (0 - myAlert.offsetHeight)){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;myAlert.style.top = parseInt(myAlert.style.top) - 3 + 'px';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setTimeout(hideAlert,100); // call hideAlert &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Se volete scaricare l'esempio lo trovate &lt;a target="_blank" href="http://cid-d82de3153feb12ed.office.live.com/self.aspx/Public/pinningdemo/pinningalert.zip"&gt;qui.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10097033" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IE/">IE</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/HTML5/">HTML5</category></item><item><title>Internet Explorer 9 , CSS 3, e Multiple Background</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/11/19/internet-explorer-9-css-3-e-multiple-background.aspx</link><pubDate>Fri, 19 Nov 2010 09:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10093177</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10093177</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/11/19/internet-explorer-9-css-3-e-multiple-background.aspx#comments</comments><description>&lt;p&gt;Relativamente al supporto del CSS3 in IE9&amp;nbsp;una nelle feature ch&amp;egrave; ho citato anche &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/10/13/internet-explorer-9-css-3-opacity-e-alpha-e-browser-detection-code.aspx"&gt;nel precedente post&lt;/a&gt; sulle nuove funzionalit&amp;agrave; introdotte in IE9 e che &amp;egrave; estremamente utile in diverse situazioni e che come altre funzionalit&amp;agrave; beneficia del valore aggiunto apportato dalla accelerazione grafica del rendering di IE9 &amp;egrave; relativo alla possibilit&amp;agrave; di impostare pi&amp;ugrave; background su uno stesso elemento specificando le coordinate. Siccome IE9 supporta anche&amp;nbsp;SVG ,sia inline che come contenuto di un img, &amp;egrave; possibile anche impostare come background anche degli SVG.&lt;/p&gt;
&lt;p&gt;Per impostare pi&amp;ugrave; background attraverso uno stile si pu&amp;ograve; utilizzare la specifica&amp;nbsp;propriet&amp;agrave; &lt;em&gt;background-image&lt;/em&gt; &amp;nbsp;prevista dal CSS3&amp;nbsp; e impostare nella definizione, pi&amp;ugrave; elementi di sfondo anche utilizzando contenuti&amp;nbsp;.svg . Attraverso la propriet&amp;agrave;&amp;nbsp; &lt;em&gt;background-position&lt;/em&gt;, andremo a definire le posizione dei background rispetto all'elemnto su cui sono applicate.&amp;nbsp;Di seguito&amp;nbsp;riporto un esempio di applicazione di background mutlipli:&lt;/p&gt;
&lt;p&gt;#demo {&lt;br /&gt;&amp;nbsp; background-image:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; url('backgrounds/crosshair.svg'),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; url('backgrounds/ufo.svg'),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; url('backgrounds/clouds.svg');&lt;br /&gt;&amp;nbsp; background-position:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;373px 198px,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 203px 64px,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-166px -108px;&lt;br /&gt;&amp;nbsp;&amp;nbsp;background-clip:&lt;br /&gt;&amp;nbsp;&amp;nbsp;padding-box, border-box, border-box;&lt;br /&gt;&amp;nbsp; background-repeat: no-repeat, no-repeat, repeat;&lt;br /&gt;}&lt;/p&gt;
&lt;p&gt;&amp;lt;div id="demo"&amp;gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;che produce la seguente visualizzazione:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/4846.multibackground.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Le propriet&amp;agrave; sono anche accessibili via JS e possono essere modificate dinamicamente e nel test Drive center di IE9 trovate &lt;a target="_blank" href="http://ie.microsoft.com/testdrive/Graphics/SpaceInvader/Default.html"&gt;uno specifico esempio&lt;/a&gt; che illustra l'utilizzo di questa funzionalit&amp;agrave; in un semplicissimo gioco che usa anche il JS per modificare dinamicamente la posizione dei background. Spostando il mirino (che &amp;egrave; uno dei tre background)&amp;nbsp;con il mouse&amp;nbsp;dovete colpire l'ufo (parte del secondo elemento di background) e durante il gioco possiamo vedere lo sfondo&amp;nbsp;(costituito dal terzo background applicato al div) che scorre.&amp;nbsp;&amp;nbsp;Analizzando il codice nella parte HTML trovate la definizione dello stile per il div demo esattamente uguale a quella riportata sopra come evento e dal codice dell'applicazione, aggiungo di seguito l'implementazione della funzione agganciata all'evento onmousemove in cui viene appunto gestito il movimento del mirino&amp;nbsp;e dello sfondo ed eventualmente in caso di successo nel colpire l'ufo, sostituito dinamicamente il background dell'ufo con un immagine che evidenzia il successo nel colpirlo:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;var d = document.getElementById('demo');&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;d.onmousemove = function(e) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var x = getElementX(d,e.clientX + document.documentElement.scrollLeft);&lt;br /&gt;&amp;nbsp;&amp;nbsp;var y = getElementY(d,e.clientY + document.documentElement.scrollTop);&lt;br /&gt;&amp;nbsp;&amp;nbsp;var crosshairX = x-125;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var crosshairY = y-125;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var ufoX = 800-Math.floor(x*1.2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;var ufoY = Math.floor(y*0.2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (Math.abs(ufoX-crosshairX) &amp;lt;= 45 &amp;amp;&amp;amp; Math.abs(ufoY-crosshairY) &amp;lt;= 45) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!zapped) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; d.style.backgroundImage = "url('./backgrounds/crosshair.svg'),url('./backgrounds/zap.svg'),url('./backgrounds/clouds.svg')";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bgUrlUfo.innerHTML = "&amp;lt;a href='./backgrounds/zap.svg' target='_blank'&amp;gt;zap.svg&amp;lt;/a&amp;gt;"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; miniBgUfo.style.backgroundImage = "url('./backgrounds/zap.svg')";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; zapped = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!muted) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ufoSound.pause();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; zapSound.play();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;} else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (zapped) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d.style.backgroundImage = "url('./backgrounds/crosshair.svg'),url('./backgrounds/ufo.svg'),url('./backgrounds/clouds.svg')";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bgUrlUfo.innerHTML = "&amp;lt;a href='./backgrounds/ufo.svg' target='_blank'&amp;gt;ufo.svg&amp;lt;/a&amp;gt;"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;miniBgUfo.style.backgroundImage = "url('./backgrounds/ufo.svg')";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;zapped = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!muted) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ufoSound.play();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;zapSound.pause(); zapSound.currentTime = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;
&lt;p&gt;&amp;nbsp; var chPos = $pos(crosshairX,crosshairY);&lt;br /&gt;&amp;nbsp;&amp;nbsp;var ufoPos = $pos(ufoX,ufoY);&lt;br /&gt;&amp;nbsp;&amp;nbsp;var cloudsPos = $pos(Math.floor(-x/3),Math.floor(-y/3));&lt;br /&gt;&amp;nbsp;&amp;nbsp;this.style.backgroundPosition = chPos+","+ufoPos+","+cloudsPos;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;posCrosshair.innerHTML = chPos;&lt;br /&gt;&amp;nbsp;&amp;nbsp;posUfo.innerHTML = ufoPos;&lt;br /&gt;&amp;nbsp;&amp;nbsp;posClouds.innerHTML = cloudsPos;&lt;br /&gt;&amp;nbsp;};&lt;/p&gt;
&lt;p&gt;Nella variabile d abbiamo l'elemento che&amp;nbsp;ci permette di accedere al div dove sono impostati i background e attraverso&amp;nbsp;&amp;nbsp;d.style.backgroundImage&amp;nbsp;&amp;nbsp; si accede ai background. Con this.style.backgroundPosition = chPos+","+ufoPos+","+cloudsPos; viene impostata la posizione dei background in base ai calcoli effettuati sul movimento del mouse.&lt;/p&gt;
&lt;p&gt;Possiamo verificare la possibilit&amp;agrave; di modificare dinamicamente la posizione e i background usando i developer tool. Se lanciamo i Developer Tool e mandiamo in debug l'applicazione e impostiamo nella console la seguente istruzione &lt;/p&gt;
&lt;p&gt;document.getElementById('demo').style.backgroundPosition = "0px 0px, 0px 0px, 0px 0px";&lt;/p&gt;
&lt;p&gt;&amp;egrave; la facciamo eseguire con il pulsante Run Script come nell'immagine seguente, vediamo che i background si spostano immediatamente alle coordinate impostate:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/4571.multibackcap.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;mentre se usiamo l'istruzione :&lt;/p&gt;
&lt;p&gt;document.getElementById('demo').style.backgroundImage = "url('./backgrounds/crosshair.svg'),url('./backgrounds/zap.svg'),url('./backgrounds/clouds.svg')";&lt;/p&gt;
&lt;p&gt;l'immagine dell'ufo fiene sostituita con l'svg dello zap.svg usato quando l'ufo viene colpito, come da immagine seguente:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/0131.multiback2.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10093177" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IE/">IE</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/HTML5/">HTML5</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/CSS3/">CSS3</category></item><item><title>Internet Explorer 9: Misurare le performance nelle pagine Web</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/11/17/internet-explorer-9-misurare-le-performance-nelle-pagine-web.aspx</link><pubDate>Wed, 17 Nov 2010 09:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10092359</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10092359</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/11/17/internet-explorer-9-misurare-le-performance-nelle-pagine-web.aspx#comments</comments><description>&lt;p&gt;La misura delle performance all'interno delle pagine Web per la parte client dell'esecuzione delle nostre pagine&amp;nbsp;&amp;egrave; uno dei temi da sempre pi&amp;ugrave; complessi nello sviluppo web. Avere degli strumenti che consentano di raccogliere feedback sul funzionamento delle nostre pagine, nelle diverse condizioni di utilizzo, sia nello sviluppo che durante l'esercizio della nostra applicazione anche&amp;nbsp;all'interno dei browser dei nostri clienti &amp;egrave; un tema utilissimo per capire il funzionamento del nostro codice ed ottimizzarlo.&lt;/p&gt;
&lt;p&gt;Negli anni si sono implementate da parte degli sviluppatori diverse modalit&amp;agrave; per effettuare questo tipo di misurazione, che vanno dall'inseririre&amp;nbsp; nel codice JS dei TimeStamp usando ad esempio &lt;span style="font-family: Courier New;"&gt;(new Date).getTime();&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ed infrastrutture che finiscono per influire negativamente sulle performance delle applicazioni e che&amp;nbsp;forniscono delle modalit&amp;agrave; inaffidabili per la corretta misurazione del comportamento della pagina. Ad esempio l'utilizzo di &lt;span style="font-family: Courier New;"&gt;(new Date).getTime();&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;egrave; impreciso ed &amp;egrave; estremamente difficile effettuare misurazioni al di sotto dei 15ms .&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Il browser in effetti, conosce perfettamente lo stato di esecuzione della pagina ed i tempi di esecuzione delle diverse componenti&amp;nbsp;&amp;nbsp;e pertanto avere in aggiunta alle API del browser una modello di oggetti per accedere alle informazioni di performance sarebbe estremamente utile per questi scenari, in particolare se esposto attraverso una modalit&amp;agrave; standard&amp;nbsp;.&lt;/p&gt;
&lt;p&gt;Le &lt;a target="_blank" href="http://dev.w3.org/2006/webapi/WebTiming/"&gt;&lt;span style="color: #0066aa;"&gt;Web Timing specification&lt;/span&gt;&lt;/a&gt;&amp;nbsp;del W3C rappresentano un ottima base per implementare le API per risolvere il problema descritto in maniera interoperabile e Internet Explorer 9 &amp;egrave; il primo browser che comincia&amp;nbsp;ad implementare delle API per esporre ai developer le informazioni relative ai timing. Le API di IE9 in questo campo sono basate in particolare sulla sezione navigation della specifica Web Timing ed &amp;egrave; avviata all'interno del W3C la discussione con altri costruttori di browser per avere implementata anche in altri browser la stessa specifica ad arrivare ad un modello completamente interoperabile e funzionale alle esigenze rappresentate.&lt;/p&gt;
&lt;p&gt;Con la Platform Preview 6 (PP6)&amp;nbsp;di IE9 le API ed in particolare la &lt;a s_oidt="0" s_oid="http://www.w3.org/TR/2010/WD-navigation-timing-20101026/" target="_blank" href="http://www.w3.org/TR/2010/WD-navigation-timing-20101026/"&gt;&lt;span style="color: #0066aa;"&gt;Navigation Timing interface&lt;/span&gt;&lt;/a&gt;&amp;nbsp;&amp;egrave; stata aggiornata proprio per essere aderente alle ultime modifiche apportate alla specifica dal Web Performance Group&amp;nbsp; del W3C ed arrivare ad avere appunto una specifica affidabile, sicura ed&amp;nbsp;interoperabile. Le API esposte in IE9 sono inserite in :&lt;/p&gt;
&lt;p&gt;&lt;em&gt;window.msPerformance &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;UPDATED: Dalla RC aggiornato il namespace e rimosso il prefisso ms , aggiornata la specifica all'ultimo draft che ha raggiunto lo stato di candidate raccomandation&lt;/p&gt;
&lt;p&gt;In particolare la parte di&amp;nbsp;&lt;a s_oidt="0" s_oid="http://www.w3.org/TR/2010/WD-navigation-timing-20101026/" target="_blank" href="http://www.w3.org/TR/2010/WD-navigation-timing-20101026/"&gt;&lt;span style="color: #0066aa;"&gt;Navigation Timing interface&lt;/span&gt;&lt;/a&gt;&amp;nbsp; &amp;egrave; inserta in &lt;em&gt;window.Performance.timing&lt;/em&gt; e fornisce accesso alle informazioni relative al timing nelle diverse fasi del&amp;nbsp;caricamento della pagina.&amp;nbsp;Oltre a questa interfaccia &amp;egrave; disponibile anche l'interfaccia &lt;em&gt;window.performance.navigation&lt;/em&gt; che&amp;nbsp; contiene informazioni aggiuntive relative&amp;nbsp;alla navigazione e alle network activity&amp;nbsp;.Di seguito avete la struttura delle due interfacce implementate nel in window.performance :&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;interface PerformanceTiming {&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long navigationStart;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long unloadEventStart;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long unloadEventEnd;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long redirectStart;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long redirectEnd;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long fetchStart;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long domainLookupStart;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long domainLookupEnd;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long connectStart;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long connectEnd;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long secureConnectionStart;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long requestStart;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long responseStart;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long responseEnd;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long domLoading;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long domInteractive;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long domContentLoadedEventStart;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long domContentLoadedEventEnd;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long domComplete;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long loadEventStart;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned long long loadEventEnd;&lt;br /&gt;};&lt;/p&gt;
&lt;p&gt;interface PerformanceNavigation {&lt;br /&gt;&amp;nbsp; const unsigned short TYPE_NAVIGATE = 0;&lt;br /&gt;&amp;nbsp; const unsigned short TYPE_RELOAD = 1;&lt;br /&gt;&amp;nbsp; const unsigned short TYPE_BACK_FORWARD = 2;&lt;br /&gt;&amp;nbsp; const unsigned short TYPE_RESERVED = 255;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned short type;&lt;br /&gt;&amp;nbsp; readonly attribute unsigned short redirectCount;&lt;br /&gt;};&lt;/p&gt;
&lt;p&gt;&amp;nbsp;I due namespace permettono di ottenere via JS le informazioni relative ai tempi presi durante il&amp;nbsp;caricamento della nostrapagina nel browser . In particolare la parte di timing ci da accesso ad un timestamp che pu&amp;ograve; essere usato per misurare dei tempi ed anche semplicemente formattato in una DataOra.&amp;nbsp;Di seguito un semplice esempio di JS che utilizza alcune informazioni della interfaccia descritta:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;var myBody;&lt;br /&gt;this.onload = function () &lt;br /&gt;{&lt;br /&gt;&amp;nbsp; myBody = document.getElementById ("myBody");&lt;br /&gt;&amp;nbsp; if (window.msPerformance) &lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;myBody.innerHTML =&amp;nbsp; 'navigationStart:&amp;nbsp; ' +&amp;nbsp;window.performance.timing.navigationStart&amp;nbsp;+'ms ('&amp;nbsp;+ Date (window.performance.timing.navigationStart) +&amp;nbsp;&amp;nbsp;') &amp;lt;br&amp;gt;';&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; return;&lt;br /&gt;};&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Il seguente codice, ad esempio, &amp;nbsp;permette di calcolare il tempo richiesto per l'esecuizione dell'evento onload:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;var oTiming = window.performance.timing;&lt;br /&gt;var iTimeMS = oTiming.loadEventEnd - oTiming.loadEventStart;&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Attraverso JSON &amp;egrave; possibile effettuare una raccolta complessiva come:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&amp;nbsp;JSON.Stringify(window.msPerformance);&lt;br /&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Per vedere in azione queste API, potete provare &lt;a href="http://ie.microsoft.com/testdrive/Performance/msPerformance/Default.html"&gt;&lt;span style="color: #0066aa;"&gt;window.Performance nel Test Drive center&lt;/span&gt;&lt;/a&gt;.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/4572.timingdemo.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;UPDATED: Dalla RC aggiornato il namespace e rimosso il prefisso ms , aggiornata la specifica all'ultimo draft che ha raggiunto lo stato di candidate raccomandation&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10092359" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Architecture/">Architecture</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Smart+Client/">Smart Client</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Performance/">Performance</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IE/">IE</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/HTML5/">HTML5</category></item><item><title>Implementare la FavIcon HigRes per il Pinning con X-Icon Editor</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/10/29/implementare-la-favicon-per-il-pinning-con-x-icon-editor.aspx</link><pubDate>Fri, 29 Oct 2010 13:15:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10082911</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10082911</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/10/29/implementare-la-favicon-per-il-pinning-con-x-icon-editor.aspx#comments</comments><description>&lt;p&gt;In uno dei miei &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/16/internet-explorer-9-implementare-i-pinned-site-e-la-windows-7-experience.aspx"&gt;precedenti post&lt;/a&gt; ho descritto le nuove API JS&amp;nbsp;che con IE9 permettono di sfruttare l'integrazione con il desktop di Windows 7 e sfruttare il Pinning sulla TaskBar e le nuove JumpList . Uno degli elementi fondamentali per la User Experience nella nuova funzionalit&amp;agrave; di Pinning &amp;egrave; rappresentato dalla possibilit&amp;agrave; di utilizzare delle FavIcon ad alta risoluzione per portare il logo del nostro sito direttamente sul desktop di Windows 7&amp;nbsp;e da li metterlo bene in mostra . Per fare questo abbiamo visto nel &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/16/internet-explorer-9-implementare-i-pinned-site-e-la-windows-7-experience.aspx"&gt;precedente post &lt;/a&gt;come personalizzare il Pinning&amp;nbsp; e che viene direttamente sfruttata la classica FavIcon&amp;nbsp;in formato .ico&amp;nbsp;e il normale&amp;nbsp;TAG gi&amp;agrave; previsto per questa funzionalit&amp;agrave;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;&amp;lt;link rel="shortcut icon" href="favicon.ico"/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I file .ico possono contenere Icon a diversa risoluzione e nell'operazione di Pinning se nella nostra FavIcon abbiamo inserito delle Icon a pi&amp;ugrave; alta risoluzione, vengono automaticamente usate per gestire il pinning e per l'icona che poi viene mostrata sulla TaskBar una volta completata l'operazione di aggancio del sito.&lt;/p&gt;
&lt;p&gt;Per implementare con facilit&amp;agrave; la nostra FavIcon multirisoluzione, in modo che possa contenere sia la classica 16x16 usata dai browser sulla barra dell'indirizzo e sui&amp;nbsp;Tab ,&amp;nbsp;sia le Icon a pi&amp;ugrave; alta risoluzione per il Pinning ( 32x32,&amp;nbsp;&amp;nbsp;&amp;nbsp;64x64) possiamo da oggi usare un nuovo tool online che si chiama &lt;a target="_blank" href="http://www.xiconeditor.com/"&gt;X-Icon Editor&lt;/a&gt; .&amp;nbsp;&amp;nbsp;Di seguito un immagine &amp;nbsp;di come si presenta il tool che tra le altre cose &amp;egrave; completamente implementato sfruttando HTML5 per la parte di interfaccia utente:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/8475.xicon1.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Potete dare in input&amp;nbsp;al tool delle immagini partendo da diversi formati (jpg,png,bmp e ico)&amp;nbsp;e caricarle con rapidit&amp;agrave;&amp;nbsp;nell'applicazione che vi far&amp;agrave; subito una preview delle Icon e vi consentir&amp;agrave; di selezionare all'interno dell'immagine la porzione che volete inserire nella Icon multi-risoluzione:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/7651.xicon2.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Fatta la selezione dell'elemento da inserire nella nostra Icon multirisoluzione, possiamo selezionare le risoluzioni che vogliamo inserire e&amp;nbsp;procediamo con il tasto OK e il nostro editor ci porta nell'area dell'applicazione che ci consente di ritoccare eventualmente la Icon:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/4628.xicon3.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Possiamo anche in qualunque momento fare una preview con lo specifico pulsante previsto nell'interfaccia del tool, &amp;nbsp;di come la nostra Icon multirisoluzione verr&amp;agrave; poi inserita&amp;nbsp;sfruttando le differenti risoluzioni disponibili&amp;nbsp;, nelle diverse&amp;nbsp;componenti di utilizzo&amp;nbsp;nel Pinning (taskbar, barra indirizzi, JumpList , Tab, etc):&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/0535.xicon4.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Terminata l'operazione di ritocco possiamo con il pulsante Export far generare la nostra Icon per il download:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/6355.xicon5.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Terminato il download , possiamo implementarla sul nostro sito con il TAG della FavIcon &lt;/p&gt;
&lt;p&gt;&lt;span style="font-size: small;"&gt;&amp;lt;link rel="shortcut icon" href="favicon.ico"/&amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;e , &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/16/internet-explorer-9-implementare-i-pinned-site-e-la-windows-7-experience.aspx"&gt;personalizzare il resto delle funzionalit&amp;agrave; del Pinning&lt;/a&gt; per avere cos&amp;igrave; un bellissima esperianza utente sul desktop di Windows 7 con Internet Explorer 9 !!!&lt;/p&gt;
&lt;p&gt;Ribadisco il suggerimento fatto anche nell'altro articolo di applicare GZIP ed un buon livello di HTTP cache per garantire una migliore esperienza agli utenti che useranno il Pinning sul vostro siti o sulla vostra Web Application.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10082911" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IE/">IE</category></item><item><title>IIS Media Services: Live Smooth Streaming, Fault Tolerance and Architecture</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/10/27/iis-media-service-live-smooth-streaming-fault-tolerance-and-architecture.aspx</link><pubDate>Wed, 27 Oct 2010 17:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10081613</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10081613</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/10/27/iis-media-service-live-smooth-streaming-fault-tolerance-and-architecture.aspx#comments</comments><description>&lt;p&gt;A frequent question that I received is about suggested architecture for live Smooth Streaming and fault tolerance during a live streaming.&lt;/p&gt;
&lt;p&gt;With this post I would try to explain in a simple way some details about Live Smooth Streaming and summarize architecture and suggestions for deliver robust Live Streaming with IIS Media Services (IIS MS).&lt;/p&gt;
&lt;p&gt;One of the most significant differences about Smooth Streaming respect to past technologies for delivering real time streaming is about the way that is used for delivering content to player client.&lt;/p&gt;
&lt;p&gt;In classic streaming like RTSP\RTMPE\WMS etc , client open a permanent connection to the streaming server &amp;nbsp;that is responsible to control streaming and that provide to push the video to the client and manage buffers . Server receive control command to the client like play, pause etc and react at this command and push the content to the client. This way to deliver streaming have a lot of limits and lack in terms of scalability because is required a permanent connection with a specific server and costs, because is required a specialized server for deliver video content. &lt;/p&gt;
&lt;p&gt;In order to offer a more scalable solution at lower costs Smooth Streaming leverage pull model using standards HTTP get to give access to the client also for&amp;nbsp; live streaming , that could permit to use a simple HTTP cache server for distribute video content on Internet . In this model, client drive the streaming and ask for content to any http cache server involved in streaming distribution without any affinity or dependency. This permit to increase dramatically scalability and reducing costs for this type of service. In Smooth Streaming video content is segmented in a sequence of video chunk with a specific duration that the client download with a sequence of HTTP get and use these to create a buffer and starts the video decode and play on the client.&lt;/p&gt;
&lt;p&gt;In live smooth streaming client starts reading via HTTP get a manifest for streaming . In this manifest client have a description of available bitrates\quality for live streaming, url that is necessary call to download content, actual status of live streaming with the list of the video and audio chunks available and the time code that drive the streaming and the duration of every chunk. For example below you can see a manifest for a live streaming with ten minutes of DVR :&lt;/p&gt;
&lt;p&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;SmoothStreamingMedia MajorVersion="2" MinorVersion="0" Duration="0" TimeScale="10000000" IsLive="TRUE" LookAheadFragmentCount="2" DVRWindowLength="6000000000" CanSeek="TRUE" CanPause="TRUE"&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;lt;StreamIndex Type="video" Name="video" Subtype="WVC1" Chunks="0" TimeScale="10000000" Url="QualityLevels({bitrate})/Fragments(video={start time})"&amp;gt;&amp;lt;QualityLevel Index="0" Bitrate="600000" CodecPrivateData="250000010FC3920CF0778A0CF81DE8085081124F5B8D400000010E5A47F840" FourCC="WVC1" MaxWidth="416" MaxHeight="240"/&amp;gt;&amp;lt;QualityLevel Index="1" Bitrate="1450000" CodecPrivateData="250000010FCBAC19F0EF8A19F83BE8085081AC3FEE9FC00000010E5A47F840" FourCC="WVC1" MaxWidth="832" MaxHeight="480"/&amp;gt;&amp;lt;QualityLevel Index="2" Bitrate="350000" CodecPrivateData="250000010FC38A09B0578A09B815E80850808AADEACF400000010E5A47F840" FourCC="WVC1" MaxWidth="312" MaxHeight="176"/&amp;gt;&amp;lt;QualityLevel Index="3" Bitrate="475000" CodecPrivateData="250000010FC38E09B0578A09B815E80850810E7E487A400000010E5A47F840" FourCC="WVC1" MaxWidth="312" MaxHeight="176"/&amp;gt;&amp;lt;QualityLevel Index="4" Bitrate="1050000" CodecPrivateData="250000010FCBA01210A78A121829E8085081A00AD01B400000010E5A47F840" FourCC="WVC1" MaxWidth="580" MaxHeight="336"/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c t="0" d="20000000"/&amp;gt;&amp;lt;c d="20000000"/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c d="20000000"/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c d="20000000"/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c d="20000000"/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c d="20000000"/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/StreamIndex&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;lt;StreamIndex Type="audio" Name="audio" Subtype="WmaPro" Chunks="0" TimeScale="10000000" Url="QualityLevels({bitrate})/Fragments(audio={start time})"&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;QualityLevel Index="0" Bitrate="64000" CodecPrivateData="1000030000000000000000000000E00042C0" FourCC="" AudioTag="354" Channels="2" SamplingRate="44100" BitsPerSample="16" PacketSize="1487"/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c t="0" d="20897959"/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c d="19969161"/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c d="19388662"/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c d="20897959"/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c d="19620862"/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;c d="20897959"/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/StreamIndex&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/SmoothStreamingMedia&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;You can see the audio and video track , the levels of bitrates available for the client , the DVR window length of the content , the attribute IsLive that explain to the client the fact that it is a live streaming, the lists of the chunks available for download. With the t parameter in the chunks you can find the time code and with d parameter the duration of every chunk. With this information the client can calculate actual position of live streaming and starts to pull &amp;nbsp;chunks in order to create the buffer for a correct reproduction, using a sequence of&amp;nbsp; HTTP GET request to one of the HTTP cache server involved in the streaming. Buffer dimensions in the client could be determined with a specific parameter in player configuration. &lt;/p&gt;
&lt;p&gt;You can see below the structure of the HTTP get that the client use for video chunks:&lt;/p&gt;
&lt;p&gt;http://&lt;b&gt;{ service uri}&lt;/b&gt;/QualityLevels(&lt;b&gt;{bitrate}&lt;/b&gt;)/Fragments(video=&lt;b&gt;{start time}&lt;/b&gt;)"&amp;gt;&lt;/p&gt;
&lt;p&gt;and for audio chunks:&lt;/p&gt;
&lt;p&gt;http://&lt;b&gt;{ service uri}&lt;/b&gt;/QualityLevels(&lt;b&gt;{bitrate}&lt;/b&gt;)/Fragments(video=&lt;b&gt;{start time}&lt;/b&gt;)"&amp;gt;&lt;/p&gt;
&lt;p&gt;As you can see client send an HTTP GET &amp;nbsp;request for every audio and video chunk and specify in the request bitrates required and start time code for the video fragment.&lt;/p&gt;
&lt;p&gt;This is a sample &amp;nbsp;request for a video chunk at 350k for&amp;nbsp; 60000000 position time code:&lt;/p&gt;
&lt;p&gt;http://localhost/test.isml/QualityLevels(350000)/Fragments(video=60000000)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;and this is a sample for an audio chunk for&amp;nbsp; 60000000 position time code 10980716553:&lt;/p&gt;
&lt;p&gt;http://localhost/test.isml/QualityLevels(64000)/Fragments(audio=10980716553)&lt;/p&gt;
&lt;p&gt;The client selects the bitrates that requests to the server and adjusts it continuously during the streaming in base to the real bandwidth available for the download and the capability of the client to decode the quality level of the video.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Time code for every request is calculated starting from the information in the manifest and using a local clock in order to establish the frequency of the requests for the new time code aligned with the buffer in the client. &lt;/p&gt;
&lt;p&gt;As you can understand from the previous description, time code play a fundamental role in this type of streaming .&lt;/p&gt;
&lt;p&gt;In order to go in deep on the architecture required for achieve a robust live streaming with fault tolerance we start to describe the role that IIS MS play in the architecture.&lt;/p&gt;
&lt;p&gt;Every IIS MS can receive video fragment from an encoder or from another IIS MS and can offer this to a client or to another IIS MS or to an HTTP cache server.&lt;/p&gt;
&lt;p&gt;IIS MS can receive or transmit content in push or in pull from the encoder or from another IIS MS and can ingest locally an archive of the content in live streaming. Starting from IIS MS 4.0 you could enabled also trans-mux of content in Http Adaptive Streaming for Apple devices like I described in &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/11/iis-media-services-4-integrated-media-platform-streaming-for-pc-windows-phone-tv-and-iphone-ipad-with-a-single-platform.aspx"&gt;this post on this topic&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the picture below you could see the possible combination for input output video fragment to IIS MS:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/0358.inputoutput.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;For the input in push IIS MS accept long running HTTP POST to a specific rest URL of the publishing point configured for live streaming and append a stream id after the url of the pubpoint in order to identify the stream in a unique way. For example for a pub point that have this url:&lt;/p&gt;
&lt;p&gt;http://localhost/test.isml&lt;/p&gt;
&lt;p&gt;We have this type of url used for push the content using a long running HTTP POST:&lt;/p&gt;
&lt;p&gt;http://localhost/test.isml/streams({streamid})&lt;/p&gt;
&lt;p&gt;The "streamID" value uniquely identifies an incoming fragmented stream which is transmitted over a HTTP POST request. One fragmented MP4 stream could contain multiple tracks (e.g. video and audio). In Live Smooth Streaming, typically there are multiple fragmented MP4 streams coming from the encoder or encoders &amp;nbsp;to the server. &lt;/p&gt;
&lt;p&gt;Encoders or others IIS MS use this approach to push video fragment for live streaming to a server. This is the typical configuration used for encoder connection. IIS MS ingest the content and based on the configuration of the publishing point can:&lt;/p&gt;
&lt;p&gt;-archive it on local disk&lt;/p&gt;
&lt;p&gt;- push the content to other servers &lt;/p&gt;
&lt;p&gt;- offer it in pull to other servers or to client player. &amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;IIS MS admit to receive content in input with more HTTP POSTS, in the case of failure in a long running HTTP POST , IIS MS wait that the source of the Input reconnect in order to continue to push video fragments. In the case that the streaming is finished encoder can send a specific EOS signal to inform IIS MS that the streaming is ended.&lt;/p&gt;
&lt;p&gt;In the case that IIS MS receive an EOS the publishing point remain in Stopped state but with DVR active for client.&amp;nbsp; If the encoder reconnect after EOS streaming doesn't restart. You could use a specific entry in the .isml file to instruct IIS MS to reset the publishing point when an encoder reconnects after an EOS. This is the TAG that you can insert in the .isml files that configure the pubpoint:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;meta name="restartOnEncoderReconnect" content="TRUE" /&amp;gt;&lt;/p&gt;
&lt;p&gt;In order to achieve fault tolerance IIS MS can accept in input more stream with the same streamID on the same publishing point. This can permit to push with 2 encoder video fragments on the same pubpoint . IIS MS select only one fragments with the same time code and discard the others. In this way you can use 2 encoders in parallel with aligned time code in order to have fault tolerance. Time code play a fundamental role for video fragments in Input, and IIS MS use the time code to discriminate video fragments in input with the same StreamiID. &amp;nbsp;For this reason&amp;nbsp; pay attention to the fact that if you have 1 encoder active on a pubpoint and you have a fault on the encoder and the long running HTTP POST stopped, IIS MS wait that the encoder reconnect and it is fundamental that when the encoder reconnect use a coherent time code. IIS MS restart streaming only when start to receive video fragment with a time code &amp;gt; of the last time code ingested . For this reason is fundamental that you have a time code in your video fragment, if your encoder restart the time code from zero or with a time code in the past respect to the last ingested in IIS MS streaming can't restart since time code is in &amp;nbsp;the future from the last known time code ingested. &lt;/p&gt;
&lt;p&gt;The figure below describe the suggested architecture for a robust live streaming delivery : &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/7242.livestreaming.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;As you can see we have a different layers with a different role:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;- Encoders&lt;/li&gt;
&lt;li&gt;- Ingest Servers&lt;/li&gt;
&lt;li&gt;- Origin Servers&lt;/li&gt;
&lt;li&gt;- Distribution Servers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Encoders:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Encoders take the video signal, encode it in Smooth Streaming format . The encoder use a long running &amp;nbsp;HTTP POST to push video fragment to the ingest server.&lt;/p&gt;
&lt;p&gt;In order to achieve redundancy you could use two different model :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;- 1 active encoder and 1 not active encoder that could be used as backup in the case of failure of the first encoder (called N+M scenario): The backup can be shared with more of 1 active streaming and managed with the software management solution of the encoders in order to start when one of the active encoder fail. This is a less expensive scenario, also in this case is necessary that when the backup encoder starts after the fault of the first active encoder, restart to push video fragments with the same streamID and with a time code in the future from the last known time code sent to the ingest server from the previous faulted encoder. In this case we could have a short interruption in the streaming that you could manage from a client player, managing the exception and start to try to reconnect to the server automatically. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;- 1 + 1 Encoders active : in this scenario we have 2 active encoders that push the same video framents to the same ingest server. This is a configuration suggested for mission critical streaming . Encoders can push at the same time the signal to two ingest servers in order to offer a complete redundancy. It is required that both encoders be timecode aligned using a common source clock, such as embedded SMPTE timecode (VITC) on the source signal. As we have described before ingest servers discard duplicated fragments and in the case of fault of one of the encoder, streaming continue to work without interruption.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ingest Servers:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Ingest Servers have the role to receive content from the encoder and push it to origin servers (in general at minimum 2 origin servers). Typically Ingest &amp;nbsp;Servers don't have the archive active and push content to 2 origin servers and manage reconnection in the case of network fault. &lt;/p&gt;
&lt;p&gt;You can configure on IIS MS the possibility to push from the ingest servers to the oring servers with the specific tab. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/2234.push.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;The ingest Server push the content to all the servers that you insert in the configuration.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;In the case of fault in one of the ingest servers we have a situation similar to the encoders fault . &amp;nbsp;In the case that the encoders push on the 2 ingest servers we don't have any interruption in the other case management software of encoders detect the failure and start the backup encoder that starts to push on the second ingest server and restart the streaming. In this case we could have a short interruption that can be managed at client player level as described before.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;b&gt;Origin Servers:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;The origin servers have the role to hold all the information about the live stream, they archive content and can directly serve client requests or distribution servers. &amp;nbsp;We have multiple origin servers that run simultaneously in order to have redundancy and scalability. On origin servers can be drive a transmuxing to convert content to other formats. For example IIS MS 4.0 can drive a transmuxing in HTTP Live Streaming for Apple Devices. It can also be the source for distribution servers and synchronize past information with them if needed. In the case of fault in a origin server, additional origin servers can immediately serve as backups because they are all running and have the same data. Distribution servers know where to re-request and retry the stream from a backup in the case of origin server failure. To serve client requests, either directly or indirectly through a generic HTTP network that contains HTTP cache/proxy/edge servers, they must have archive and client output options configured.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Distribution Servers:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Distribution servers are used to &amp;nbsp;scale out a network by offloading archiving and client request serving from the origin server tier. Distribution servers use the pull input stream option and are configured with multiple origin server URLs for redundancy. &amp;nbsp;Like origin servers, &amp;nbsp;we have multiple distribution servers to have scalability and redundancy. Is it possible use IIS MS configured in pull that point to all origins server in combination with IIS Application Request Routing (ARR). You can configure with the specific tab a publishing point in IIS MS to pull content from origins and configure a list of the origin where the distribution server can pull.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/1411.pull.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;In the case of failure in one of the origin, the distribution server start to pull to the next in the list. Pay attention to the fact that the distributore switch to next server only in the case of origin server failure (machine down, netowrk error, etc.) and not in the case of encoder fault. &lt;/p&gt;
&lt;p&gt;For more information about live streaming I would suggest to you to read these two fantastic posts from Sam Zhang (Developer Lead in IIS Media Services Team for live streaming) about live Smooth Streaming, the first about &lt;a target="_blank" href="http://blogs.iis.net/samzhang/archive/2009/03/27/live-smooth-streaming-design-thoughts.aspx"&gt;design principle of live Smooth Streaming&lt;/a&gt;, the second about the &lt;a target="_blank" href="http://blogs.iis.net/samzhang/archive/2009/12/16/how-to-build-scalable-and-robust-live-smooth-streaming-server-solutions.aspx"&gt;suggested architecture for delivering&amp;nbsp; real-time streaming on IIS MS&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;If you want learn more about configurations for Live Streaming with Smooth Streaming , you can use this resources on iis.net:&lt;i&gt;&lt;/i&gt;&lt;/p&gt;
&lt;ul type="disc"&gt;
&lt;li&gt;&lt;a target="_blank" href="http://go.microsoft.com/?linkid=9740324"&gt;Live Smooth Streaming Deployment Articles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a target="_blank" href="http://go.microsoft.com/?linkid=9740325"&gt;Live Smooth Streaming Tutorials&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10081613" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Architecture/">Architecture</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Silverlight/">Silverlight</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IIS7/">IIS7</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Media/">Media</category></item><item><title>Internet Explorer 9 , CSS 3,  Opacity Alpha e Browser detection code</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/10/13/internet-explorer-9-css-3-opacity-e-alpha-e-browser-detection-code.aspx</link><pubDate>Wed, 13 Oct 2010 17:37:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10075428</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10075428</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/10/13/internet-explorer-9-css-3-opacity-e-alpha-e-browser-detection-code.aspx#comments</comments><description>&lt;p&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Calibri;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Nei precedenti &amp;nbsp;post dedicati a IE9 ho introdotto le caratteristiche della &lt;a href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/16/internet-explorer-9-implementare-i-pinned-site-e-la-windows-7-experience.aspx" target="_blank"&gt;integrazione con Windows 7&lt;/a&gt; e gli &lt;a href="http://blogs.msdn.com/b/italy/archive/2010/09/15/disponibile-la-beta-release-di-internet-explorer-9.aspx" target="_blank"&gt;aspetti principali&lt;/a&gt; presenti in questa nuova versione del browser . Per chi volesse approfondire vi consiglio di seguire &lt;a href="http://www.microsoft.com/italy/live/ie9.aspx" target="_blank"&gt;l'evento in live streaming dedicato al tema&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Tra i punti pi&amp;ugrave; importanti abbiamo parlato del grande supporto dedicato ai nuovi standard web quali come HTML5, CSS3, SVG e ECMAScript5, che in combinazione consentono agli sviluppatori di creare una nuova generazione di applicazioni Web, sempre pi&amp;ugrave; ricche ed interattive.&lt;/p&gt;
&lt;p&gt;In particolare relativamente al CSS gi&amp;agrave; con Internet Explorer 8 era gi&amp;agrave; stato fatto un grandissimo lavoro, IE &amp;egrave; il browser che &amp;nbsp;implementa praticamente in modo completo il CSS 2.1 e un ottimo lavoro con la versione 9 &amp;egrave; stato fatto nell'implementazione di quelle parti del CSS 3 che nella specifica hanno raggiunto un buon livello di maturit&amp;agrave; nella definizione. Sulla parte di Standard e verifica della compatibilit&amp;agrave;, sono stati sviluppati migliaia di test ( soltanto con quesat beta ne sono stati aggiunti 569 e in totale ben 7200 solo per il CSS ) che sono stati anche sottomessi al W3C come contributo nella semplificazione della verifica dell'aderenza alle specifiche dei diversi browser, contribuendo in modo significativo a rendere pi&amp;ugrave; semplici la vita degli sviluppatori nel poter realmente scrivere del markup che abbia poi lo stesso comportamento sui diversi browser. Sul sito &lt;a href="http://samples.msdn.microsoft.com/ietestcenter" target="_blank"&gt;IE Testing Center&lt;/a&gt; potete trovare un riepilogo dei nuovi test che vengono mano a mano creati e i risultati di compatibilit&amp;agrave; per questi test dei vari Browser.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;Relativamente al CSS3 le nuove feature implementate nella Beta di IE9 sono le seguenti:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpFirst"&gt;&lt;span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"&gt;&lt;span style="mso-list: Ignore;"&gt;&amp;middot;&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Rounded corners con la border-radius property&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"&gt;&lt;span style="mso-list: Ignore;"&gt;&amp;middot;&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;CSS3 background e border features&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-ansi-language: IT;" lang="IT"&gt;&lt;span style="mso-list: Ignore;"&gt;&amp;middot;&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;La opacity property&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-ansi-language: IT;" lang="IT"&gt;&lt;span style="mso-list: Ignore;"&gt;&amp;middot;&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;Modelli di colore RGBA, HSL, e HSLA &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol;"&gt;&lt;span style="mso-list: Ignore;"&gt;&amp;middot;&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;CSS3 fonts e nuovi web font formats&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-ansi-language: IT;" lang="IT"&gt;&lt;span style="mso-list: Ignore;"&gt;&amp;middot;&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;CSS3 media queries&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-ansi-language: IT;" lang="IT"&gt;&lt;span style="mso-list: Ignore;"&gt;&amp;middot;&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;CSS3 namespaces&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpMiddle"&gt;&lt;span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-ansi-language: IT;" lang="IT"&gt;&lt;span style="mso-list: Ignore;"&gt;&amp;middot;&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;CSS3 values e units&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpLast"&gt;&lt;span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-ansi-language: IT;" lang="IT"&gt;&lt;span style="mso-list: Ignore;"&gt;&amp;middot;&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;CSS3 selectors&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpLast"&gt;&lt;span style="font-size: large;"&gt;&amp;middot;&lt;/span&gt;&amp;nbsp;Supporto per CSS3 2D Transformation&amp;nbsp;(Aggiunto 
con la preview 6 successiva alla beta)&lt;/p&gt;
&lt;p&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;IE9 come descritto sopra , implementa il &lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Verdana','sans-serif'; color: #333333; font-size: 9pt; mso-bidi-font-family: Arial; mso-ansi-language: EN;" lang="EN"&gt;&lt;a href="http://www.w3.org/TR/css3-color/"&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;&lt;span style="color: #0000ff;"&gt;CSS3 Color Module&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="line-height: 115%; font-family: 'Verdana','sans-serif'; color: #333333; font-size: 9pt; mso-bidi-font-family: Arial; mso-ansi-language: IT;" lang="IT"&gt; e &lt;/span&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;in questo post in particolare cerco di illustrare la propriet&amp;agrave; Opacity e alpha, attraverso la quale &amp;egrave; possibile gestire attraverso uno style, in modo standard, sia vi JS che nella definizione di uno specifico stile per l&amp;rsquo;appunto la trasparenza di uno specifico elemento. Le versioni precedenti di IE supportavano questa feature attraverso l&amp;rsquo;utilizzo di una propriet&amp;agrave; chiamata filter e l&amp;rsquo;utilizzo del alpha su questo canale. Importante sottolineare che &lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;quando lavora con un document mode in compatibilit&amp;agrave; con le versioni precenti e non in standard mode, applica il comportamento delle versioni precedenti di Explorer e quindi il filter, mentre quando lavora in standard mode mette a disposizione la propriet&amp;agrave; opacity ma non la precedente propriet&amp;agrave; filter.&lt;/strong&gt;&lt;strong&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;Per utilizzare questa feature con uno stile, garantendo la compatibilit&amp;ograve; con le versioni precedenti di Explorer si pu&amp;ograve; utilizzare una definizione come nel seguente esempio dove viene applicata una opacity del 70%:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="line-height: 115%; color: #cc6633; font-size: 8pt; mso-ansi-language: IT;" lang="IT"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="line-height: 115%; color: #cc6633; font-size: 8pt; mso-ansi-language: IT;" lang="IT"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;.opaque&lt;br /&gt;{&lt;br /&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;opacity: 0.7;&lt;br /&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;filter: alpha(opacity=70);&lt;br /&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;E&amp;rsquo; possibile utilizzare la propriet&amp;agrave; anche inline:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&amp;lt;img src="sample.jpg" &amp;nbsp;style="opacity:0.6;filter:alpha(opacity=60)" /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;E sfruttando anche gli eventi onmouseover e onmouseout direttamente in line:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;&amp;lt;img src="sample.jpg" style="opacity:0.6;filter:alpha(opacity=60)" onmouseover="this.style.opacity=1;this.filters.alpha.opacity=100" onmouseout="this.style.opacity=0.6;this.filters.alpha.opacity=60" /&amp;gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;La descrizione dell&amp;rsquo;utilizzo via JS di questa funzionalit&amp;agrave; in compatibilit&amp;agrave; con anche le versioni precedenti di IE9 &lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;mi da anche lo spunto per un buon esempio di come convenga ragionare nello sviluppo del nostro codice , rispetto alle implementazioni di specifice feature per la compatibilit&amp;agrave; versoi diversi browser o l&amp;rsquo;utilizzo di caratteristiche alternative ad una specifica funzionalit&amp;agrave;. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;Nel caso di script pi&amp;ugrave; complessi del precedente , in molti casi come sviluppatori tendiamo a verificare quale tipo di approccio usare per una specifica azione , riconoscendo il tipo di browser per poi decide se applicare o meno una feature piuttosto che un&amp;rsquo;altra. &lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;Questo tipo di approccio per l&amp;rsquo;applicazione di una specifica feature &amp;egrave; noto come &amp;ldquo;Browser Detection code&amp;rdquo;. &lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&lt;/span&gt;Ad esempio, nel caso specifico avremo sicuramente codice in giro su Internet che decide se applicare opacity o filters andando a riconoscere il tipo di browser, qualcosa tipo:&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;se il browser &amp;egrave; IE applica filter , altrimenti usa Opacity. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;Questo tipo di approccio &amp;egrave; assolutamente sconsigliabile, non solo per questo caso ma per la maggioranza degli senari e delle situazioni ed &amp;egrave; fonte di moltissimi errori e di codice che continua ad applicarsi in modalit&amp;agrave; superate o meno efficienti.&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp; &lt;/span&gt;Nell&amp;rsquo;esempio appena fatto, con l&amp;rsquo;uscita di IE9 che invece supporta l&amp;rsquo;opacity, nel caso in cui IE9 lavora in standard mode, il codice con la browser detection applicherebbe il filter, generando cos&amp;igrave; un malfunzionamento della nostra pagina. &lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;La modalit&amp;agrave; corretta da applicare &amp;egrave; quasi sempre il riconoscimento dell&amp;rsquo;implementazione della feature da parte del browser e non il tipo di browser, pattern conosciuto come &amp;ldquo;Feature Detection Code&amp;rdquo; .&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;Per esempio in questo caso, possiamo verificare con la definizione di una variabile come la seguente se il browser supporta o meno la property opacity o in alternativa la propriet&amp;agrave; filter:&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="line-height: 115%; color: green; font-size: 8pt; mso-ansi-language: EN;" lang="EN"&gt;.&lt;/span&gt;&lt;span style="line-height: 115%; color: black; font-size: 8pt; mso-ansi-language: EN;" lang="EN"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;var isOpacityReady =&lt;br /&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;(typeof document.createElement("div").style.opacity != 'undefined');&lt;br style="mso-special-character: line-break;" /&gt;&lt;br style="mso-special-character: line-break;" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;var isFilterReady = !useOpacity&lt;br /&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;amp;&amp;amp; (typeof document.createElement("div").style.filter != &lt;span style="mso-ansi-language: IT;" lang="IT"&gt;'undefined');&lt;br style="mso-special-character: line-break;" /&gt;&lt;br style="mso-special-character: line-break;" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;Si pu&amp;ograve; poi implementare una funzione setOpacity che, verifica lo stato delle variabili e applica sull&amp;rsquo;elemento specificato come parametro il livello di trasparenza richiesto. Di seguito una possibile implementazione di questa funzione :&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="line-height: 115%; color: black; font-size: 8pt; mso-ansi-language: IT;" lang="IT"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;function setOpacity(el, value) {&lt;br /&gt;&lt;br /&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if (typeof el == 'string')&lt;br /&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;el = document.getElementById(el);&lt;br /&gt;&lt;br /&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;value = Math.min(1, Math.max(value, 0));&lt;br /&gt;&lt;br /&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if (isOpacityReady)&lt;br /&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;el.style.opacity = value;&lt;br /&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;else if (isFilterReady)&lt;br /&gt;&lt;span style="mso-spacerun: yes;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;el.style.filter = "alpha(opacity=" + (value * 100) + ")";&lt;br /&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;In questo modo il codice &amp;egrave; pi&amp;ugrave; robusto e non &amp;egrave; dipendente dalle varie release dei Browser che arriveranno in futuro e continuer&amp;agrave; a funzionare correttamente nel tempo.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class="MsoListParagraphCxSpLast"&gt;&lt;span style="font-family: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-ansi-language: IT;" lang="IT"&gt;&lt;span style="mso-list: Ignore;"&gt;&amp;middot;&lt;span style="font: 7pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-ansi-language: IT;" lang="IT"&gt;Supporto per CSS 2D Transformation (agginto a partire dalla preview 6 di IE9 successiva alla Beta)&lt;/span&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10075428" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IE/">IE</category></item><item><title>Integrated Media Platform: Smooth Streaming Media Element for Windows Phone 7 and SMF 2.2 </title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/10/10/integrated-media-platform-smooth-streaming-media-element-for-windows-phone-7-and-smf-2-2.aspx</link><pubDate>Sun, 10 Oct 2010 10:17:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10073767</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10073767</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/10/10/integrated-media-platform-smooth-streaming-media-element-for-windows-phone-7-and-smf-2-2.aspx#comments</comments><description>&lt;p&gt;In my &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/11/iis-media-services-4-integrated-media-platform-streaming-for-pc-windows-phone-tv-and-iphone-ipad-with-a-single-platform.aspx"&gt;previous post&lt;/a&gt; I introduced vision of integrated Media Platform coming with IIS Media Services 4.0 (IIS MS 4.0) and IIS Transform Manager (IIS TM) that could permit to have a single infrastructure, able to deliver content to PC, MAC, Windows Phone 7, Apple devices (iPhone ad iPad) , STB, conntected TV , etc. &lt;/p&gt;
&lt;p&gt;I would evidence to you that now we have &lt;a target="_blank" href="http://forums.iis.net/t/1171795.aspx"&gt;available for public download the new Smooth Streaming Client SDK 1.1&lt;/a&gt; that contains the Smooth Streaming Media Element (SSME) for Windows Phone 7 (WP7). You can download the new SDK &lt;a target="_blank" href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=18108280-af54-4248-819f-361723db068e"&gt;here&lt;/a&gt; .&amp;nbsp;This is another step forward to materialize the Integrated Media Platform vision and that permit to you to leverage Smooth Streaming also on Windows Phone 7.&lt;/p&gt;
&lt;p&gt;In &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/12/06/using-smooth-streaming-media-element-for-windows-phone-7.aspx"&gt;this post on my blog&lt;/a&gt; you can find a sample for implement a WP7 app with SSME.&lt;/p&gt;
&lt;p&gt;The new SSME for WP7 give to you possibility to reproduce Live and&amp;nbsp;on demand Smooth Streaming content using Silverlight App for WP7&amp;nbsp;in same way that you can do&amp;nbsp;with Silverlight for PC and MAC. This release supports also Playready DRM&amp;nbsp;&amp;nbsp;and in this way you could leverage a single&amp;nbsp;backend for&amp;nbsp;content protection too.&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Use the new SSME for WP7 is very simple.&amp;nbsp;In order to build apps that leveraging Smooth Streaming content on WP7, you could use Visual Studio 2010&amp;nbsp;with&amp;nbsp; &lt;a href="http://developer.windowsphone.com/windows-phone-7/"&gt;Windows Phone Developer Tools&lt;/a&gt;&amp;nbsp; and after created a new Silverlight Project for WP7, you can add a Reference to SSME for WP7 dll avaliable in&amp;nbsp; &lt;a target="_blank" href="http://www.microsoft.com/downloads/en/details.aspx?FamilyID=18108280-af54-4248-819f-361723db068e"&gt;Smooth Streaming Client SDK 1.1&lt;/a&gt;&amp;nbsp;&amp;nbsp;and starting to use the new Media Element in the same way that you do for Silverlight PC.&lt;/p&gt;
&lt;p&gt;With the release of this new version of SSME, in order to simplify player creation,&amp;nbsp;we have &lt;a target="_blank" href="http://smf.codeplex.com/"&gt;available a new release &amp;nbsp;(2.2) of Silverlight Media Framework (SMF)&lt;/a&gt; that leverage the new SSME for WP7 and offer a complete player implementation with &lt;a target="_blank" href="http://smf.codeplex.com/releases/view/53438"&gt;full source code&lt;/a&gt;, &lt;a target="_blank" href="http://smf.codeplex.com/wikipage?title=SMF%20v2%20for%20Windows%20Phone"&gt;documentation&lt;/a&gt;&amp;nbsp;and new &lt;a target="_blank" href="http://smf.codeplex.com/wikipage?title=SMF%20v2%20%22How%20To%22%20Documentation&amp;amp;referringTitle=Home"&gt;samples and how to&lt;/a&gt; , that support WP7 too like SMF for the PC Silverlight Player. &lt;/p&gt;
&lt;p&gt;I'm really excited about the new features that coming with IIS MS 4.0 and IIS TM and I'm working in several projects that leverage this new platform&amp;nbsp;for deliver content to PC ,MAC&amp;nbsp;iPhone/iPad, Windows Phone 7&amp;nbsp;and others devices&amp;nbsp;and I'll write soon some posts &amp;nbsp;about technical aspect of these projects were are involved this new platform. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10073767" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Architecture/">Architecture</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/RIA/">RIA</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Silverlight/">Silverlight</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IIS7/">IIS7</category><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/Media/">Media</category></item><item><title>Internet Explorer 9: Implementare i Pinned Site e la Windows 7 Experience</title><link>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/16/internet-explorer-9-implementare-i-pinned-site-e-la-windows-7-experience.aspx</link><pubDate>Thu, 16 Sep 2010 08:49:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:10063050</guid><dc:creator>Giuseppe Guerrasio</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.msdn.com/b/giuseppeguerrasio/rsscomments.aspx?WeblogPostID=10063050</wfw:commentRss><comments>http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/09/16/internet-explorer-9-implementare-i-pinned-site-e-la-windows-7-experience.aspx#comments</comments><description>&lt;p&gt;E' stata &lt;a target="_blank" href="http://blogs.msdn.com/b/italy/archive/2010/09/15/disponibile-la-beta-release-di-internet-explorer-9.aspx"&gt;da poco rilasciata&lt;/a&gt; la beta di Internet Explorer 9, ho pensato di scrivere una serie di post sull'integrazione con Windows 7 e sulle nuove caratteristiche di HTML5 supportate in IE9. In questo primo post comincio proprio partendo dall'integrazione&amp;nbsp;con Windows 7&amp;nbsp;e le API JS disponibili. A &lt;a target="_blank" href="http://www.microsoft.com/italy/beit/Generic.aspx?video=fda246f5-817d-49f7-b1d2-5e45ddbd6d48"&gt;questo link &lt;/a&gt;trovate la registrazione completa dell'Evento dedicato a IE9 ed in particolare trovate&lt;a target="_blank" href="http://www.microsoft.com/italy/beit/Msdn.aspx?video=ae60a0b4-3a47-4944-bfa5-13c1bd45a3bb"&gt; qui la sessione&lt;/a&gt; che nell'evento &amp;egrave; stata dedicata alla funzionalit&amp;agrave; del Pinning e &lt;a target="_blank" href="http://cid-d82de3153feb12ed.office.live.com/self.aspx/Public/pinningdemo/pinning.zip"&gt;qui gli esempi&lt;/a&gt; mostrati nella sessione. Disponibile anche su MSDN una &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/gg491731(v=VS.85).aspx"&gt;nuova&amp;nbsp;documentazione per sviluppatori &lt;/a&gt;sul questa funzionalit&amp;agrave;.&lt;/p&gt;
&lt;p&gt;Oltre al supporto per HTML5 con accelerazione grafica offerta da Windows, in grado di fornire al browser&amp;nbsp;performance che permettono di sfruttare i nuovi standard per costruire una nuova&amp;nbsp;generazione di applicazioni web, IE9&amp;nbsp; Beta ha un ampio ed interessante supporto di integrazione con Windows 7.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;L'integrazione con Windows 7, &amp;nbsp;mette a disposizione nuove funzionalit&amp;agrave; che consentono di integrare i siti e le applicazioni con il desktop del sitema operativo. Tra le feature pi&amp;ugrave; interessanti sia per gli utilizzatori che per chi sviluppa siti ed ha interesse a rimanere in contatto con i propri utenti abbiamo i &lt;b&gt;Pinned Site&lt;/b&gt; e le&amp;nbsp;&lt;b&gt;JumpList&lt;/b&gt; .&lt;/p&gt;
&lt;p&gt;Con i Pinned Site si possono trascinare ed agganciare direttamente alla barra delle applicazioni di Windows 7 i siti trascinando l'icona dal box dell'indirizzo direttamente sulla barra :&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-87-58/0447.pinning.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;L'icona rimane agganciata alla barra di Windows 7 e consente di avere il sito disponibile come una applicazione direttamente all'interno del desktop e di poterci accedere nuovamente partendo dall'icona aggiunta alla barra delle applicazioni: &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-87-58/4314.pinned.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Per le icone c'&amp;egrave; la possibilit&amp;agrave; da parte del sito di esporre delle &lt;b&gt;FavIco a pi&amp;ugrave; alta risoluzione&lt;/b&gt;, proprio per ottimizzare l'esperienza di integrazione con questa specifica funzionalit&amp;agrave;. Per implementare le FavIcon multiresolution per IE9 potete anche usare un &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/10/29/implementare-la-favicon-per-il-pinning-con-x-icon-editor.aspx"&gt;tool disponibile online &lt;/a&gt;che vi consente di creare le Icon partendo da delle immagini.&lt;/p&gt;
&lt;p&gt;E' inoltre possibile personalizzare le&amp;nbsp;&lt;b&gt;Jump List&lt;/b&gt; dinamiche che sono associate ai siti agganciati alla barra delle applicazioni, partendo dall'inserimento di metadati nel sito, per poter esporre un vero e proprio menu applicativo dinamico del nostro sito o della nostra applicazione Web, direttamente dalla barra delle applicazioni di Windows 7 come vedete dalla immagine &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-87-58/6862.JumpList.JPG" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Sui Pinned Site in Windows 7 &amp;egrave; disponibile anche la &lt;b&gt;Icon overlay&lt;/b&gt; che consente di elementi in overlay alla icona per mostrare ad esempio il numero di messaggi disponibili nella cassetta postale della nostra WebMail che abbiamo agganciato alla barra delle applicazioni:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-87-58/8176.iconoverlay.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Oltre al Pinning sulla barra si pu&amp;ograve; aggiungere il sito direttamente sullo Start Men&amp;ugrave; di Windows 7 usando&amp;nbsp;lo specifico comando nel men&amp;ugrave; di Internet Explorer 9:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/7701.Addstart.png" border="0" /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;All'interno del Test Drive Center di IE9 trovate degli &lt;a target="_blank" href="http://ie.microsoft.com/testdrive/Browser/SitePinning/Default.html"&gt;esempi specifici&lt;/a&gt; di queste funzionalit&amp;agrave; . &lt;/p&gt;
&lt;p&gt;Per l'implementazione dei &lt;strong&gt;Pinned Site&lt;/strong&gt;, &lt;strong&gt;JumpList &lt;/strong&gt;e &lt;strong&gt;Icon Overlay&lt;/strong&gt; il browser mette a disposizione delle specifiche API.&amp;nbsp; Per effettuare il Pinning di un sito non occorre inserire elementi specifici nella pagina o utilizzare particolari API. Il browser consente di default all'utente di&amp;nbsp;agganciare il sito alla Task Bar di Windows 7 attraverso il Drag and Drop&amp;nbsp;dal box degli indirizzi. &lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;Windows genera uno shortcut file con&amp;nbsp;estensione .website per sito di cui viene effettuato il pinning ed associa ad ognuno uno specifico AppID.&amp;nbsp;Nel momento in cui l'utente fa ripartire il sito con il click dall'icona agganciata alla&amp;nbsp;Task Bar,&amp;nbsp;il sito viene lanciato in una istanza&amp;nbsp;di IE9&amp;nbsp;isolata dalle altre&amp;nbsp;che condivide&amp;nbsp;tra i diversi Tab, l'AppId associata al sito&amp;nbsp;Pinned. Il browser viene personalizzato ed i bottoni di navigazione&amp;nbsp;&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/6646.PINNEDAPP.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;Per suggerire all'utente di&amp;nbsp;effettuare il&amp;nbsp;Pinning del sito si possono aggiungere degli&amp;nbsp;elementi grafici &amp;nbsp;&amp;nbsp;o sfruttare le specifiche API JS previste per la funzionalit&amp;agrave; di pinning per proporre uno specifico pulsante per aggiungere direttamente allo Start Men&amp;ugrave; il sito e per verificare se il sito &amp;egrave; gi&amp;agrave; Pinned come nell'esempio di seguito.&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/5226.pinprop.PNG" border="0" /&gt;&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;Introdotta con la RC di IE9 anche la possibilit&amp;agrave; di applicare uno specifico stile&amp;nbsp; il "pinImage" &amp;nbsp;per permettere il Pinning direttamente da un elemento immagine:&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;&amp;nbsp;&amp;lt;img id="pinImage" class="msPinSite" src="Images/sample.ico" /&amp;gt;&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;Applicando lo stile indicato sopra si pu&amp;ograve; effettuare il Pinning trascinando direttamente l'immagine sulla barra di windows.&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;In particolare attraverso&amp;nbsp; &lt;strong&gt;window.external.msIsSiteMode()&lt;/strong&gt; &amp;egrave; possibile determinare se il sito &amp;egrave; pinned o meno e ad esempio decidere di proporre il Pinning all'utente con la comparsa di un banner sotto il box dell'indirizzo. Di seguito un esempio di utilizzo di questa funzione:&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;function sampleSiteMode()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (window.external.msIsSiteMode()) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Azione da eseguire se il sito &amp;egrave; Pinned&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert("pinned");&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch(ex) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert("Site Mode is not supported.");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;window.onload = testSiteMode;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;&amp;nbsp;Con la funzione &lt;strong&gt;window.external.msAddSiteMode()&lt;/strong&gt;&amp;nbsp; &amp;egrave; possible richiedere all'utente di aggiungere il sito allo Start Men&amp;ugrave; di Windows 7 . All'esecuzione di questa funzione, comparir&amp;agrave; all'utente una finestra di richiesta di conferma per l'aggiunta del sito allo Start Men&amp;ugrave; all'interno di AllPrograms:&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/8463.addsite.png" border="0" /&gt;&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;&amp;nbsp;Al completamento dell'approvazione da parte dell'utente, verr&amp;agrave; eseguito dal browser l'evento&amp;nbsp; &lt;strong&gt;mssitemodeinstalled&lt;/strong&gt;&amp;nbsp;attraverso il quale l'applicazione Web che ha invocato la funzione&amp;nbsp;&amp;nbsp; &lt;strong&gt;window.external.msAddSiteMode()&lt;/strong&gt;&amp;nbsp; potr&amp;agrave; essere notificata dell'approvazione all Pinning sullo Start Men&amp;ugrave;.&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;Di seguito un esempio di utilizzo attraverso un bottone che propone il Pinning all'utente:&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;function pinnWebApp() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; window.external.msAddSiteMode();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch(ex) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Site Mode not supported.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;}&lt;br /&gt;window.onload = function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; document.addEventListener('mssitemodeinstalled', function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert("completato Pinning.");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }, false);&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;button onclick="addWebApp()"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; title="Click per aggiungere la pagina Windows Start menu." Click Per aggiungere la pagina allo Start Men&amp;ugrave;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/button&amp;gt;&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;Se viene usato&amp;nbsp;&lt;strong&gt;addEventListener&lt;/strong&gt;&amp;nbsp; per agganciare l'evento, viene ricevuto l'oggetto &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/ff974348(v=VS.85).aspx"&gt;&lt;strong&gt;MSSiteModeEvent&lt;/strong&gt;&lt;/a&gt;&amp;nbsp; che permette di ottenere un buon numero di informazioni sul sito Pinned.&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;E' possibile personalizzare la istanza del browser che viene eseguita al pinning del sito, inserendo degli specifici &lt;strong&gt;meta&lt;/strong&gt; all'interno delle pagine . Al momento del pinning IE9 verifica la presenza di questi meta elemet e se li trovo li applica per personalizzare come richiesto l'istanza del browser. Nel caso non vengono trovati si applicano i default.&lt;/p&gt;
&lt;p sizset="113" sizcache="129"&gt;La struttura dei meta prevista da IE9 per questa funzionalit&amp;agrave; &amp;egrave; la seguente:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;meta name="name" content="content"/&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Il seguente esempio&amp;nbsp;mostra come utilizzare i &amp;nbsp;&lt;strong&gt;meta&lt;/strong&gt; elements per personalizzare&amp;nbsp; pinned site&amp;nbsp;con&amp;nbsp; tooltip, start URL, colori della navigation button e caratteristiche della finestra, .&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;meta name="application-name" content="Contoso.it Mode Application"/&amp;gt;
&amp;lt;meta name="msapplication-tooltip" content="Contoso.it in Site Mode"/&amp;gt;
&amp;lt;meta name="msapplication-starturl" content="http://contoso.it/start.html"/&amp;gt;
&amp;lt;meta name="msapplication-navbutton-color" content="green"/&amp;gt;
&amp;lt;meta name="msapplication-window" content="width=800;height=600"/&amp;gt;
&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;Si pu&amp;ograve; anche personalizzare con la sintassi gi&amp;agrave; prevista la favico: &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;lt;LINK rel="shortcut icon" type=image/x-icon href="http://contoso.it/favicon.ico"&amp;gt;&lt;br /&gt;&amp;lt;LINK rel=icon type=image/ico href="./favicon.ico"&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Nella documentazione di IE9 Beta trovate &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/ff976309(VS.85).aspx"&gt;una descrizione dei meta element per la personalizzazione dell'istanza del browser utilizzata dai siti Pinned&lt;/a&gt;&amp;nbsp;.&lt;/p&gt;
&lt;p&gt;Qui trovate &lt;a target="_blank" href="http://ie.microsoft.com/testdrive/Browser/channel9/Default.html"&gt;un esempio di pinning con bottoni di proposizione all'utente ed esempio di personalizzazione dell'istanza di IE9 Beta usata dal sito Pinned&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Per la parte riguardante la personalizzazione delle &lt;strong&gt;Jump List&lt;/strong&gt; associate al sito Pinned, abbiamo la possibilit&amp;agrave; di inserire dei &lt;strong&gt;JumpList Task&lt;/strong&gt; &amp;nbsp;che permettono di aggiungere un vero e proprio men&amp;ugrave;, collegato direttamente all'elemento di cui si &amp;egrave; effettuato il Pinning. Oltre ai Task si possono in modo dinamico, aggiungere, rimuovere e modificare delle &lt;strong&gt;Jump List Categories&lt;/strong&gt; , all'interno delle quali &amp;egrave; poi possibile interire degli Itme con informazioni o Link che consentono la navigazione.&lt;/p&gt;
&lt;p&gt;Per &lt;strong&gt;JumpList Task&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;egrave; possibile aggiungere&amp;nbsp;&amp;nbsp;i task che si vogliono far comparire nella Jump List del sito Pinned utilizzando degli specifici meta. Si possono aggiungere fino a 5 task dove si specifica il testo e l'url su cui deve navigare o una nuova istanza del browser se non ne esistono attive per la app, o un nuovo Tab nella istanza della app gi&amp;agrave; esistente&amp;nbsp;. La struttura &amp;egrave; la seguente:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;META name="msapplication-task" content="name=Task 1;action-uri=http://contoso.it/PageSample1.html;icon-uri=http://contoso.it/iconsample.ico"/&amp;gt;
&amp;lt;META name="msapplication-task" content="name=Task 2;action-uri=http://microsoft.com/PageSample2.html;icon-uri=http://contoso.it/iconbase.ico"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;I Task vengono messi in cache al momento del Pinning e mostrati all'utente anche se la app non &amp;egrave; attiva.&lt;/p&gt;
&lt;p&gt;Su questa funzionalit&amp;agrave; trovate&amp;nbsp; &lt;a target="_blank" href="http://ie.microsoft.com/testdrive/Browser/channel9/Default.html"&gt;nella demo&amp;nbsp;citato anche prima&amp;nbsp;una implementazione dei Jump List&amp;nbsp;Task&amp;nbsp;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Oltre ai task descritti sopra si possono aggiungere dinamicamente delle &lt;strong&gt;Jump List Categories&lt;/strong&gt; sfruttando delle specifiche API JS disponibili in IE9 Beta. Qualunque pagina all'interno di un dominio Pinned pu&amp;ograve; utilizzare queste API per aggiungera, modificare o rimuovere categorie e elementi nelle categoria dalle Jump List. Gli elementi aggiunti vengono persistiti nel men&amp;ugrave; e rimangono disponibili fino alla rimozione da parte dell'utente o tramite le API da parte del sito. Le Jump List Categories possono contenere degli item che , come nel caso dei task, permettono al click dell'utente di navigare ad uno specifico url indicato nella configurazione dell'item stesso. In ogni category &amp;egrave; possibile inserire fino a 20 item, nel caso di aggiunta di item superiori a 20 vengono automaticamente rimossi i precedenti.&lt;/p&gt;
&lt;p&gt;Per creare delle Categories e inserirci all'interno degli Item sono disponibili in IE9 Beta delle specifiche API&amp;nbsp;JS: &lt;/p&gt;
&lt;p&gt;&amp;nbsp;Attraverso&amp;nbsp;il metodo &amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ff976312(VS.85).aspx"&gt;msSiteModeCreateJumplist&lt;/a&gt;&amp;nbsp; si pu&amp;ograve; create una Category:&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;window.external.msSiteModeCreateJumplist('SampleList1');&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Creata la Category la si pu&amp;ograve; popolare con il metodo&amp;nbsp; &lt;a href="http://msdn.microsoft.com/en-us/library/ff976312(VS.85).aspx"&gt;msSiteModeAddJumpListItem&lt;/a&gt; indicando label&amp;nbsp;, url dell'item e icona da aggiungere :&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;window.external.msSiteModeAddJumpListItem('SampleItem 1', 'http://contoso.it/SampleItem1.html', 'http://contoso.it/images/item1.ico');&lt;br /&gt;window.external.msSiteModeAddJumpListItem('Sample Item 2', 'http://contoso.it/SampleItem2.html', 'http://contoso.it/images/item2.ico');&lt;/p&gt;
&lt;p&gt;Si pu&amp;ograve; poi mostrare le Categories chiamando il metodo&amp;nbsp;&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ff976318(VS.85).aspx"&gt;msSiteModeShowJumplist&lt;/a&gt; method, Windows immediately updates the in-memory list in the Jump List.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;window.external.msSiteModeShowJumplist();&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;e cancellarle completamente con&amp;nbsp; &lt;a href="http://msdn.microsoft.com/en-us/library/ff976312(VS.85).aspx"&gt;msSiteModeClearJumplist&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;code&gt;window.external.msSiteModeClearJumplist();&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Attraverso, l'evento seguente si pu&amp;ograve; essere notificati della rimozione da parte dell'utente di un elemento dalle Jump List:&lt;/p&gt;
&lt;p&gt;document.addEventListener('mssitemodejumplistitemremoved', removed, false);&lt;br /&gt;document.attachEvent('onmssitemodejumplistitemremoved', removed);&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;la funzione di callback dell'evento riceve un url&amp;nbsp;come parametro.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Altra funzionalit&amp;agrave; disponibile con le API di integrazione con Windows 7 di IE9 Beta &amp;egrave; la funzionalit&amp;agrave; di &lt;strong&gt;Icon Overlay&lt;/strong&gt; . Attraverso il metodo &lt;a href="http://msdn.microsoft.com/en-us/library/ff976316(VS.85).aspx"&gt;window.external.msSiteModeSetIconOverlay&lt;/a&gt;&amp;nbsp; una Web App pu&amp;ograve;&amp;nbsp;richiedere&amp;nbsp;a Windows di mostrare una icona&amp;nbsp;in overlay all'icona&amp;nbsp;sulla Task Bar per comunicare uno specifico stato all'utente. La funzionalit&amp;agrave; pu&amp;agrave; essere ad esempio utilizzata per l'arrivo di una mail in una applicazione di web mail o per richiamare in generale l'attenzione dell'utente sulla necessit&amp;agrave; di effettuare una azione&amp;nbsp;rispetto alla applicazione agganciata alla Task Bar.&amp;nbsp;Ecco di seguito un esempio di utilizzo del metodo:&lt;/p&gt;
&lt;p&gt;window.external.msSiteModeSetIconOverlay('http://contoso.it/images/overlay.ico', 'Overlay');&lt;/p&gt;
&lt;p&gt;l'icona si pu&amp;ograve; rimuovere con:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;window.external.msSiteModeClearIconOverlay();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Oltre a mostrare l'icona in overlay a quella presente sulla Task Bar , si pu&amp;ograve; ulteriormente richiamare l'attenzione dell'utente relativamente alla necessit&amp;agrave; di effettuare un azione su una delle applicazioni sulla Task Bar, facendo lampeggiare l'icona agganciata sulla Task Bar. Per fare questo si pu&amp;ograve; utilizzare il metodo&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ff976297(VS.85).aspx"&gt;windows.external.msiteModeActivate&lt;/a&gt;&amp;nbsp; come di seguito:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;window.external.msSiteModeActivate();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Su Jump List Categories e Icon Overlay&amp;nbsp; trovate &lt;a target="_blank" href="uhttp://ie.microsoft.com/testdrive/Browser/tweetfeed/Default.html"&gt;un esempio tra le demo nel Test Drive di Internet Explorer 9 Beta&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Ulteriore integrazione utile con Windows 7 &amp;egrave; fornita dei bottoni personalizzabili nella &lt;strong&gt;Thumbnail toolbar buttons&amp;nbsp;.&lt;/strong&gt; Attraverso questa funzionalit&amp;agrave; &amp;egrave; possibile personalizzare i bottoni che si possono far comparire nella Thumbnail preview della pagina che viene gestita da Windows 7 quando un utente si posiziona con il mouse su un icona della taskbar. E possibile personalizzare i bottoni ed utilizzarli per gestire delle azioni sul sito ,m direttamente dalla Thumbnali preview, senza che l'utente debba riattivare a schemo intero l'applicazione. Ad esempio nel caso di una pagina in cui &amp;egrave; un streaming una playlist,una Web Radio&amp;nbsp;o una Web Tv&amp;nbsp;si pu&amp;ograve; dare la possibilit&amp;agrave; all'utente di pilotare i controlli del player direttamente dalla preview. &lt;/p&gt;
&lt;p&gt;Di seguito l'immagine di un esempio di applicazione questa funzionalit&amp;agrave; che&amp;nbsp;&lt;a target="_blank" href="http://ie.microsoft.com/testdrive/Browser/channel9/Default.html"&gt;trovate implementata nell'esempio demo all'interno dell'area&amp;nbsp;Test Drive di IE9 Beta&lt;/a&gt;:&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;img src="http://blogs.msdn.com/resized-image.ashx/__size/550x0/__key/CommunityServer-Blogs-Components-WeblogFiles/00-00-00-61-67/8561.tumbbar.png" border="0" /&gt;&lt;/p&gt;
&lt;p&gt;Si possono aggiungere e controllare con specifiche API JS previste in IE9 Beta &amp;nbsp;fino a 7 bottoni all'interno della preview . Quando un utente effettua il click su uno dei bottoni un evento, con uno specifico ID che &amp;egrave; assoiciato al bottone, viene generato e inviato al browser e la pagina pu&amp;ograve; ricevere l'informazione agganciano una specifica callback con le API JS.&lt;/p&gt;
&lt;p&gt;Il bottoni della Thumbnail toolbar , vengono creati in menoria e poi mostrati all'esecuzione di uno specifico metodo del browser IE9 Beta. Per aggiungere i bottoni e personalizzarli si utilizza il metodo&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ff976313(VS.85).aspx"&gt;msSiteModeAddThumbBarButton&lt;/a&gt;&amp;nbsp;&amp;nbsp; come da esempio seguente:&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: Courier New;"&gt;btn1 = window.external.msSiteModeAddThumbBarButton( 'http://host/contoso.it/button1.ico', 'bottone 1');&lt;br /&gt;btn2 = window.external.msSiteModeAddThumbBarButton( 'http://contoso.it/images/button2.ico', 'bottone 2');&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Il metodo restituisce un ID che &amp;egrave; quello citato sopra che pu&amp;ograve; essere usato per ricevere l'evento di click da parte dell'utente utilizzando il metodo&amp;nbsp; &lt;a href="http://msdn.microsoft.com/en-us/library/ff975582(VS.85).aspx"&gt;msthumbnailclick&lt;/a&gt;&amp;nbsp;come da esempio di seguito:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;span style="font-family: Courier New;"&gt;document.addEventListener('msthumbnailclick', myHandler, false);&lt;br /&gt;&amp;hellip;&lt;br /&gt;function myHandler (btn) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert ("addeventlist:thumbnail btn id" + btn.buttonID);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;definiti i bottoni li si pu&amp;ograve; rendere visibili&amp;nbsp;con&amp;nbsp;&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ff976319(VS.85).aspx"&gt;msSiteModeShowThumbBar&lt;/a&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;nbsp;&lt;code&gt;window.external.msSiteModeShowThumbBar();&lt;/code&gt;&lt;/code&gt; &lt;/p&gt;
&lt;p&gt;I bottoni restano visibili per tutta la durata dell'istanza e rilanciare il metodo pu&amp;ograve; generare delle eccezioni, per tanto &amp;egrave; opportuno utilizzare il metodo all'inteno di un blocco try/catch per evitare che rinavigando successivamente nella pagina la funzione che genera i bottoni nel vostro codice produca una eccezione.&lt;/p&gt;
&lt;p&gt;Utilizzando il metodo&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ff976320(VS.85).aspx"&gt;msSiteModeUpdateThumbBarButton&lt;/a&gt;&amp;nbsp; &amp;egrave; possibile modificare lo stato dei bottoni, ad esempio di seguito disabilitiamo il btn1 lasciandolo visibile e rendiamo invisibile e disabilitato il btn2:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;window.external.msSiteModeUpdateThumbBarButton(btn1, false, true);
window.external.msSiteModeUpdateThumbBarButton(btn2, false, false);	&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Va prestata attenzione al fatto che lo stato cambia immediatamentente mentre la propriet&amp;agrave; , visibile o invisibile solo al refresh della thumbnali ovverro, quando l'utente la disattiva e poi la riattiva. E' possibile anche cambiare lo stile dei bottoni gi&amp;agrave; creati, attraverso l'utilizzo del metodo&amp;nbsp;&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/ff976311(VS.85).aspx"&gt;msSiteModeAddButtonStyle&lt;/a&gt;&amp;nbsp; come da esempio seguente dove modifichiamo immagine e tooltip associata al btn1 creato precedentemente:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;newStyle1 = window.external.msSiteModeAddButtonStyle(btn1, 'http://contoso.it/images/newStyle1.ico', 'nuovo stile bottone 1');&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;span style="font-family: Arial;"&gt;e poi applicarlo mostrandolo a schermo:&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;window.external.msSiteModeShowButtonStyle(btn1, style1);&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Come abbiamo visto Pinned sites usano delle&amp;nbsp;icone in molte funzionalit&amp;agrave; dalle : Jump List,&amp;nbsp;alla&amp;nbsp;bottone aggiunto alla&amp;nbsp;taskbar,&amp;nbsp;le overlay icons, e i bottoni delle&amp;nbsp;thumbnail preview. i file delle&amp;nbsp;icone devono avere le seguenti dimensioni: per la taskbar&amp;nbsp;le icone devono essere&amp;nbsp; minimo 32x32,&amp;nbsp;nella Jump List&amp;nbsp;16x16,&amp;nbsp;per i bottoni delle &amp;nbsp;thumbnail preview&amp;nbsp;16x16,&amp;nbsp;e per le&amp;nbsp;overlay icon&amp;nbsp;16x16. Per la favicon il suggerimento &amp;egrave; quello&amp;nbsp;di realizzare una .ico con le seguenti risoluzioni:&lt;/p&gt;
&lt;p&gt;Raccomandate: 16x16, 32x32, 48x48&lt;br /&gt;Ottimali: 16x16, 24x24, 32x32, 64x64&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Come detto anche sopra per implementare le Icon multiresolution per IE9 potete anche usare un &lt;a target="_blank" href="http://blogs.msdn.com/b/giuseppeguerrasio/archive/2010/10/29/implementare-la-favicon-per-il-pinning-con-x-icon-editor.aspx"&gt;tool disponibile online &lt;/a&gt;che vi consente di creare le Icon partendo da delle immagini.&lt;/p&gt;
&lt;p&gt;Come abbiamo visto in questo&amp;nbsp;post , Internet Explorer 9 Beta offre&amp;nbsp;delle nuove ed interessanti funzionalit&amp;agrave; di Integrazione con Windows 7 che consentono di avvicinare l'integrazione delle Wb App con le applicazioni&amp;nbsp;native di&amp;nbsp;Windows. Nei prossimi post andremo ad analizzare alcune delle caratteristiche di HTML5 introdotte in IE9 come il Tag Video, Audio &amp;nbsp;&amp;egrave; il Canvas e vedremo come &amp;nbsp;utilizzarle al meglio per sviluppare pagine web ottimizzate per IE9 con l'utilizzo di questi nuovi tag. &amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;Buona Navigazione con IE9 Beta !!!!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10063050" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/b/giuseppeguerrasio/archive/tags/IE/">IE</category></item></channel></rss>