best pdf viewer control for : Adding a page to a pdf software Library project winforms wpf UWP Pro_Silverlight_5_in_CSharp_4th_edition42-part107

C H A P T E R  12 
Sound, Video, and Deep Zoom 
In this chapter, you’ll tackle one of Silverlight’s most mature features: audio and video support. 
Since version 1.0, Silverlight has distinguished itself as a technology that brings high-end 
multimedia support to the limited world of the browser. And though Silverlight can’t support the full 
range of media codecs (because that would multiply the size of the Silverlight download and increase its 
licensing costs), Silverlight still gives you everything you need to incorporate high-quality audio and 
video in your applications. Even more remarkable is the way that Silverlight allows you to use 
multimedia, particularly video. For example, you can use video to fill thousands of elements at once and 
combine it with other effects, such as animation, transforms, and transparency. 
In this chapter, you’ll learn how to incorporate ordinary audio and video into your applications, and 
you’ll consider the best way to encode and host video files for Silverlight. Next, you’ll see how 
Silverlight’s VideoBrush class allows you to create impressive effects such as video-filled text and video 
reflections. Then, you’ll consider Silverlight’s basic support for webcam and microphone and input. 
Finally, you’ll look at Deep Zoom—a different interactive multimedia technology that lets users zoom 
into massive images in real time. 
 What’s New  Silverlight 5 adds a few new features to its audio and video support. First, Silverlight prevents the 
screen saver from interrupting your application while it’s playing a video. Second, Silverlight adds support for 
remote controls (like the ones that sometimes come with fancy laptops), meaning you can use these to start, stop, 
and pause playback (see the section “Media Commands” for more information). Third, Silverlight includes a trick 
play feature that can speed up or slow down video without changing the pitch of the audio (see the “Trick Play” 
section). And fourth, Silverlight adds support for low-latency sound, which allows you to play short audio clips with 
no delay (see the “Low-Latency Audio” section). 
Supported File Types 
Because Silverlight needs to ensure compatibility on a number of different operating systems and 
browsers, it can’t support the full range of media files that you’ll find in a desktop application such as 
Windows Media Player. Before you get started with Silverlight audio and video, you need to know exactly 
what media types it supports. 
For audio, Silverlight supports the following:
Adding a page to a pdf - insert pages into PDF file in, ASP.NET, MVC, Ajax, WinForms, WPF
Guide C# Users to Insert (Empty) PDF Page or Pages from a Supported File Format
add a page to a pdf; add page pdf reader
Adding a page to a pdf - VB.NET PDF Page Insert Library: insert pages into PDF file in, ASP.NET, MVC, Ajax, WinForms, WPF
Easy to Use VB.NET APIs to Add a New Blank Page to PDF Document
add page number to pdf document; adding page numbers to pdf in reader
• Windows Media Audio (WMA) versions 7, 8, and 9 
• MP3 with fixed or variable bit rates from 8 to 320 Kbps 
When it comes to video, Silverlight supports the follow standards: 
Windows Media Video 7 (WMV1) 
Windows Media Video 8 (WMV2) 
Windows Media Video 9 (WMV3) 
Windows Media Video Advanced Profile, non-VC-1 (WMVA) 
Windows Media Video Advanced Profile, VC-1 (WMVC1) 
H.264 video and AAC audio (also known as MPEG-4 Part 10 or MPEG-4 AVC) 
Often, you can recognize Windows Media Video by the file extension .wmv. Other video formats—
for example, MPEG and QuickTime—need not apply. 
The last two formats in this list—VC-1 and H.264—are widely supported industry standards. 
Notable places where they’re used include Blu-ray, HD DVD, and the Xbox 360. They’re also the most 
common choice for Silverlight applications. (Of course, these standards support different bit rates and 
resolutions, so your Silverlight application isn’t forced to include DVD-quality video just because it uses 
VC-1 or H.264.) 
Silverlight doesn’t support other Windows Media formats (such as Windows Media Screen, 
Windows Media Audio Professional, and Windows Media Voice), nor does it support the combination of 
Windows Media Video with MP3 audio. Finally, it doesn’t support video files that use frames with odd-
number dimensions (dimensions that aren’t divisible by 2), such as 127
 Note  Adding audio to a Silverlight application is fairly easy, because you can throw in just about any MP3 file. 
Using a video file is more work. Not only must you make sure you’re using one of the supported WMV formats, but 
you also need to carefully consider the quality you need and the bandwidth your visitors can support. Later in this 
chapter, you’ll consider how to encode video for a Silverlight application. But first, you’ll consider how to add basic 
The MediaElement 
In Silverlight, all the audio and video functionality is built into a single class: MediaElement. 
Like all elements, a media element is placed directly in your user interface. If you’re using the 
MediaElement to play audio, this fact isn’t important, because the MediaElement remains invisible. If 
you’re using the MediaElement for video, you place it where the video window should appear. 
A simple MediaElement tag is all you need to play a sound. For example, add this markup to your 
user interface: 
<MediaElement Source="test.mp3"></MediaElement
Now, once the page is loaded, it will download the test.mp3 file and begin playing it automatically.
VB.NET PDF File & Page Process Library SDK for, ASP.NET
page modifying page, you will find detailed guidance on creating, loading, merge and splitting PDF pages and Files, adding a page into PDF document, deleting
add page to pdf preview; add and delete pages in pdf
VB.NET PDF Library SDK to view, edit, convert, process PDF file
Perform annotation capabilities to mark, draw, and visualize objects on PDF document page. Capable of adding PDF file navigation features to your VB.NET program
add pdf pages to word; add and delete pages from pdf
Of course, for this to work, your Silverlight application needs to be able to find the test.mp3 file. The 
MediaElement class uses the same URL system as the Image class. That means you can embed a media 
file in your XAP package or deploy it to the same website alongside the XAP file. Generally, it’s best to 
keep media files separate, unless they’re extremely small. Otherwise, you’ll bloat the size of your 
application and lengthen the initial download time. 
 Notetion setting to 
None and its Copy To Output Directory setting to “Do not copy.” To deploy your media file alongside your XAP file, 
you must change the Copy To Output Directory setting to “Copy always.” To deploy your media file inside the XAP 
package, change Build Action to Resource. The downloadable code for this chapter uses the first of these two 
Controlling Playback 
The previous example starts playing an audio file immediately when the page with the MediaElement is 
loaded. Playback continues until the audio file is complete. 
Although this example is straightforward, it’s also a bit limiting. Usually, you’ll want the ability to 
control playback more precisely. For example, you may want it to be triggered at a specific time, 
repeated indefinitely, and so on. One way to achieve this result is to use the methods of the 
MediaElement class at the appropriate time. 
The startup behavior of the MediaElement is determined by its AutoPlay property. If this property is 
set to false, the audio file is loaded, but your code takes responsibility for starting the playback at the 
right time: 
<MediaElement x:Name="media" Source="test.mp3" AutoPlay="False"></MediaElement> 
When using this approach, you must make sure to give the MediaElement a name so that you can 
interact with it in code. Generally, interaction consists of calling the Play(), Pause(), and Stop() methods. 
You can also use the SetSource() method to load new media content from a stream (which is useful if 
you’re downloading media files asynchronously using the WebClient class, as described in Chapter 6), 
and you can change the Position property to move through the audio. 
Here’s a simple event handler that seeks to the beginning of the current audio file and then starts 
private void cmdPlay_Click(object sender, RoutedEventArgs e) 
media.Position = TimeSpan.Zero; 
If this code runs while playback is already under way, the first line resets the position to the 
beginning, and playback continues from that point. In this case, the second line has no effect because 
the media file is already being played.
C# PDF insert image Library: insert images into PDF in, ASP
image adding library control for PDF document, you can easily and quickly add an image, picture or logo to any position of specified PDF document file page.
add a page to a pdf file; add page break to pdf
C# PDF File & Page Process Library SDK for, ASP.NET, MVC
Provides you with examples for adding an (empty) page to a PDF and adding empty pages to a PDF from a supported file format, with customized options.
add page to existing pdf file; adding page numbers to pdf documents
 Note  Depending on the types of media files you support, you may want to check the CanPause and CanSeek 
properties befo
don’t support pausing and seeking. 
Handling Errors 
MediaElement doesn’t throw an exception if it can’t find or load a file. Instead, it’s up to you to handle 
the MediaFailed event. Fortunately, this task is easy. First, tweak your MediaElement tag as shown here: 
<MediaElement ... MediaFailed="media_MediaFailed"></MediaElement> 
Then, in the event handler, you can use the ExceptionRoutedEventArgs.ErrorException property to 
get an exception object that describes the problem. Here’s an example that displays the appropriate 
error message: 
private void media_MediaFailed(object sender, ExceptionRoutedEventArgs e) 
lblErrorText.Text = e.ErrorException.Message; 
Playing Multiple Sounds 
The MediaElement is limited to playing a single media file. If you change the Source property (or call the 
SetSource() method), any playback that’s currently taking place stops immediately. However, this 
limitation doesn’t apply to Silverlight as a whole. Silverlight can quite easily play multiple media files at 
once, as long as each one has its own MediaElement. 
You can use two approaches to create an application with multiple sounds. Your first option is to 
create all the MediaElement objects you need at design time. This approach is useful if you plan to reuse 
the same two or three MediaElement objects. For example, you can define two MediaElement objects 
and flip between them each time you play a new sound. (You can keep track of which object you used 
last using a Boolean variable in your page class.) To make this technique really effortless, you can store 
the audio file names in the Tag property of the appropriate element, so all your event-handling code 
needs to do is read the file name from the Tag property, find the right MediaElement to use, set its 
Source property, and then call its Play() method. Because this example uses two MediaElement objects, 
you’re limited to two simultaneous sounds, which is a reasonable compromise if you don’t think the 
user will be able pick out a third sound out over the din anyway. 
Your other option is to create every MediaElement object you need dynamically. This approach 
requires more overhead, but the difference is minimal (unless you go overboard and play dozens of 
simultaneous media files). When you create a MediaElement in code, you need to remember to add it to 
a container in your application. Assuming you haven’t changed the AutoPlay property, the 
MediaElement will begin playing as soon as you add it. If you set AutoPlay to false, you’ll need to use the 
Play() method. Finally, it’s also a good idea to handle the MediaEnded event to remove the 
MediaElement after playback is finished. 
Here’s some code for a button that starts a new playback of the same sound file each time it’s 
C# PDF insert text Library: insert text into PDF content in
C#.NET PDF SDK - Insert Text to PDF Document in C#.NET. Providing C# Demo Code for Adding and Inserting Text to PDF File Page with .NET PDF Library.
add blank page to pdf preview; add a page to pdf file
VB.NET PDF insert text library: insert text into PDF content in vb
VB.NET PDF - Insert Text to PDF Document in VB.NET. Providing Demo Code for Adding and Inserting Text to PDF File Page in VB.NET Program.
add page number to pdf online; adding pages to a pdf document in preview
private void cmdPlay_Click(object sender, RoutedEventArgs e) 
MediaElement media = new MediaElement(); 
media.Source = new Uri("test.mp3"UriKind.Relative); 
media.MediaEnded += new RoutedEventHandler(media_MediaEnded); 
private void media_MediaEnded(object sender, RoutedEventArgs e) 
To make it easier to keep track of a batch of dynamically generated MediaElement objects, you can 
add them all to a designated container (for example, an invisible stack panel). This allows you to quickly 
examine all the currently playing media files and stop them all. Figure 12-1 shows an example that uses 
this approach and displays the element count of the invisible StackPanel every time a MediaElement is 
inserted or removed. 
Figure 12-1. Playing media files simultaneously 
Changing Volume, Balance, and Position 
The MediaElement exposes a number of properties that allow you to control your playback. The most 
fundamental are as follows: 
• Volume: Sets the volume as a number from 0 (completely muted) to 1 (full 
volume). The default value is 0.5. To temporarily mute playback without pausing it 
or changing the volume setting, set IsMuted to true.
C# PDF Annotate Library: Draw, edit PDF annotation, markups in C#.
text comments on PDF page using C# demo code in Visual Stuodio .NET class. C#.NET: Add Text Box to PDF Document. Provide users with examples for adding text box
add page to pdf reader; adding page numbers to pdf in preview
VB.NET TIFF: Add New Image to TIFF File in Visual Basic .NET
However, RasterEdge VB.NET TIFF document processing SDK can offer you the reliable and extensive TIFF page image adding tool that allows you to directly insert
adding a page to a pdf in preview; add page numbers to a pdf file
• Balance: Sets the balance between the left and right speaker as a number from -1 
(left speaker only) to 1 (right speaker only). The default is 0, which splits the sound 
• CurrentState: Indicates whether the player is currently Playing, Paused, Stopped, 
downloading a media file (Opening), buffering it (Buffering), or acquiring a license 
for DRM content (AcquiringLicense). If no media file was supplied, CurrentState is 
• Position: Provides a TimeSpan object that indicates the current location in the 
media file. You can set this property to skip to a specific time position. 
Figure 12-2 shows a simple page that allows the user to control playback. 
Figure 12-2. Controlling more playback details 
At the top of the window are three buttons for controlling playback. They use rather unremarkable 
code—they call the Start(), Stop(), and Play() methods of the MediaElement when clicked. 
Underneath are two sliders for adjusting volume and balance. These sliders are set to the 
appropriate ranges (0 to 1 and -1 to 1): 
<Slider Grid.Column="1" x:Name="sliderVolume" Minimum="0" Maximum="1" Value="0.5" 
ValueChanged="sliderVolume_ValueChanged" ></Slider> 
<Slider Grid.Row="1" Grid.Column="1" x:Name="sliderBalance" Minimum="-1" Maximum="1" 
When the user drags the thumb in the slider, the change is applied to the MediaElement: 
private void sliderVolume_ValueChanged(object sender, 
RoutedPropertyChangedEventArgs<double> e) 
media.Volume = sliderVolume.Value; 
private void sliderBalance_ValueChanged(object sender, 
RoutedPropertyChangedEventArgs<double> e) 
media.Balance = sliderBalance.Value; 
The third slider lets the user jump to a new position. It actually consists of two sliders that are 
superimposed on top of one another. The slider in the background (the one defined first) is the position 
slider that the user drags to jump to a new part of the audio file: 
<Slider Minimum="0" Grid.Column="1" Grid.Row="2" x:Name="sliderPosition" 
In front is a slider that ignores mouse activity (because its IsHitTestVisible property is set to false) 
and is partially transparent (because its Opacity property is set to 0.5). As a result, the slider appears to 
be a faint image behind the position slider: 
<Slider Minimum="0" Grid.Column="1" Grid.Row="2" x:Name="sliderPositionBackground" 
IsHitTestVisible="False" Opacity="0.5"></Slider> 
This slider (sliderPositionBackground) represents the current position of the audio file. As the audio 
advances, the code moves the thumb in sliderPositionBackground along the track to give the user a 
visual indication of how far playback has progressed. You could do much the same trick by moving the 
sliderPosition slider, but this could become problematic because your code would need to distinguish 
between user-initiated changes (when the user drags the slider, at which point your code should change 
the current position of the MediaElement) and playback synchronization (at which point your code 
should do nothing). 
The code sets up the position sliders by reading the full running time from the NaturalDuration 
property after the media file has been opened: 
private void media_MediaOpened(object sender, RoutedEventArgs e) 
You can then jump to a specific position when the topmost slider tab is moved: 
private void sliderPosition_ValueChanged(object sender, RoutedEventArgs e) 
// Pausing the player before moving it reduces audio "glitches" 
// when the value changes several times in quick succession. 
media.Position = TimeSpan.FromSeconds(sliderPosition.Value); 
Incidentally, the MediaElement doesn’t fire any sort of event to notify you that playback is 
underway. Thus, if you want to move the thumb for sliderPositionBackground along the track or you 
want to update the TextBlock with the current time offset at the bottom of the page, you need to use a 
The DispatcherTimer is a perfect solution. You can create one when the page loads, use a short 0.1-
second interval, and start and stop it along with your playback: 
private DispatcherTimer timer = new DispatcherTimer(); 
public MediaPlayer() 
timer.Interval = TimeSpan.FromSeconds(0.1); 
timer.Tick += timer_Tick; 
private void cmdPlay_Click(object sender, RoutedEventArgs e) 
When the DispatcherTimer.Tick event fires, you can update your user interface by displaying the 
current time position in a TextBlock and moving the position indicator (the semi-transparent 
noninteractive thumb of the background slider): 
private void timer_Tick(object sender, EventArgs e) 
lblStatus.Text = media.Position.ToString().TrimEnd(new char[]{'0'}); 
sliderPositionBackground.Value = media.Position.TotalSeconds; 
The two check boxes on the page are the last ingredient in this media player and one of the simplest 
details. The Mute check box sets the corresponding IsMuted property of the MediaElement: 
private void chkMute_Click(object sender, RoutedEventArgs e) 
media.IsMuted = (bool)chkMute.IsChecked; 
The MediaElement has no built-in support for looping playback. If the Loop check box is set, the 
code in the page restarts playback when the MediaEnded event fires: 
private void media_MediaEnded(object sender, RoutedEventArgs e) 
if ((bool)chkLoop.IsChecked) 
media.Position = TimeSpan.Zero; 
Although relatively simple, this example could be the springboard for a more advanced player—all 
you need is a heavy dose of animation, transparency, and eye candy. You’ll see some examples of more 
stylized media players that have mostly the same functionality when you consider Expression Encoder 
later in this chapter. 
Playing Video 
Everything you’ve learned about using the MediaElement class applies equally well when you use a 
video file instead of an audio file. 
The key difference with video files is that the visual and layout-related properties of the 
MediaElement are suddenly important. The original size of the video is provided through the 
NaturalVideoHeight and NaturalVideoWidth properties of the MediaElement. You can also scale or 
stretch a video to fit different page sizes using the Stretch property. Use None to keep the native size 
(which is recommended for optimum performance), Uniform to stretch the video to fit its container 
without changing its aspect ratio (which is the default), Fill to stretch it to fit its container in both 
dimensions (even if that means stretching the picture), and UniformToFill to resize the picture to fit the 
largest dimension of its container while preserving its aspect ratio (which guarantees that part of the 
video page will be clipped out if the container doesn’t have the same aspect ratio as the video). 
 Tip  The MediaElement’s preferred size is based on the native video dimensions. For example, if you create a 
MediaElement with a Stretch value of Uniform (the default) and place it inside a Grid row with a Height value of 
Auto, the row will be sized just large enough to keep the video at its standard size, so no scaling is required. 
Trick Play 
Trick play is a feature that lets you accelerate or slow down the speed of video playback, without 
changing the pitch of the audio. (Ordinarily, the audio in a sped-up video will be not only faster but 
shifted to a higher pitch. Similarly, a slowed-down video gets lower-pitch audio. At worst, spoken words 
and other parts of the audio become distorted or unintelligible.) 
 Tip  Trick play is useful in certain specialized scenarios. For example, it allows power users to review training 
videos more quickly. Trick play works with video or audio, although it’s most commonly used with video playback. 
To use trick play, you simply set the MediaElement.PlaybackRate property. A value of 1 (the default) 
represents normal speed playback. A value of 1.5 is 50 percent faster, while a value of 2 is double the 
normal speed. Similarly, you can slow down playback using values less than 1. Set PlaybackRate to 0.5, 
for instance, to get half-normal playback speed. 
Here’s a slider that makes it easy to test the effect of different PlaybackRate settings. As you drag the 
slider, the slider value is passed along to the MediaElement through a simple data binding expression, 
and the video speed is adjusted immediately.
<MediaElement x:Name="media" Source="OldSpice.mp4" Stretch="Uniform"></MediaElement> 
<Slider Grid.Row="1" Margin="5" Minimum="0.5" Maximum="2" 
Value="{Binding ElementName=media,Path=PlaybackRate,Mode=TwoWay}"></Slider>  
Note that extremely fast or slow speeds won’t support this effect. For example, try to play a video at 
four times its normal speed, and you’ll probably hear no audio at all. 
Media Commands 
Silverlight has the built-in smarts to receive hardware-initiated playback commands, such as play, 
pause, rewind, volume up, and so on. These are called media commands. 
To send a media command, a user can need the help of a wireless home-theater-style remote (like 
the kind that are commonly sold for use with Windows Media Center) or a media-enhanced keyboard 
that has dedicated media buttons (like most of Microsoft’s keyboards). When a button is pressed and 
Silverlight receives the message, it fires the MediaCommand event on whatever element has focus. This 
event then bubbles up the element hierarchy, until it reaches the containing page. 
Technically, the MediaCommand feature isn’t linked to the MediaElement class. Instead, all 
Silverlight elements can receive the MediaCommand event. Furthermore, it’s up to you to decide what 
action you want to carry out when you receive a media command. It makes most sense to carry out a 
media action (for example, starting a video when the user presses the play button), but you could just as 
easily start an animation or perform a completely different task. 
Before you use media commands, you need to understand one significant caveat. Unless your 
application is running in full-screen mode, they are unlikely to work. That’s because the operating 
system will intercept your media commands and direct them to the appropriate program (like Media 
Player on Windows or iTunes on Mac). And contrary to what you might expect, the operating system will 
continue to intercept (and suppress) media commands when these programs aren’t running. 
Figure 12-3 shows a program that uses media commands. It includes a button that switches the 
application between normal and full-screen mode: 
private void cmdToggleFullScreen_Click(object sender, RoutedEventArgs e) 
Application.Current.Host.Content.IsFullScreen =  
Documents you may be interested
Documents you may be interested