For those of you who want to get started with hypervideo and don’t want to wait for the videos or the full tutorial, here is the first of a series of fast mini-tutorials.
The first step is to pick a video you’d like to use as your “source.” The source will be the video you’ll link from.
If you don’t have it already, you’ll need to download Encoder by going to the Expression Web Site and clicking on Encoder in the lower right hand corner as shown in the cut-down image below
3. Buy (or try) Encoder, and be sure to download Service Pack 1 and the Encoder SDK
Once you are set up, you are ready to use Encoder to add markers to your video and to ask Encoder to emit a player for you that you will modify.
Importing The Video
Open Encoder and choose File->Import
and navigate to the video you want to import. It will appear in the Media content window of Encoder and you can watch it by pressing the play button.
The area I marked A represents the imported video. On the control toolbar you can see the elapsed time (area B). Above that, in the area marked C is the “playhead.”
The right side of Encoder has four tabs:
For now, we care only about the last two. The Metadata tab offers the ability to name the output video (and add an enormous amount of metadata such as copyright, genre, etc.) and to add markers,
There are many ways to add markers, but one of the easiest is to move the playhead to the place in the video you want the marker, and then to press the Add button.
Four editable fields are made available for each marker:
- Time (Elapsed time into the video in thousandths of a second)
- Value (any arbitrary value that will serve as a name for the marker)
- Thumbnail (a boolean indicating whether or not a thumbnail should be created)
- Keyframe (a boolean indicating whether or not a keyframe should be created)
The thumbnail is used when creating chapters (as for a DVD movie) to show an image indicating what is in that scene of the film.
Creating a keyframe instructs Encoder to put an IFrame at that location. The documentation notes that this can shorten seek time for the marker” but again is not relevant for the work we’ll be doing.
For our purposes Thumbnail and Keyframe should be unchecked
What To Put In Value
Traditionally, the Value field is filled with some indication of what is happening in the video at that time location, though see my previous blog entry for a discussion of why that may or my not be desirable.
Once You’ve Added The Markers
Once you’ve added all the markers that you wish to add, and adjusted their exact timing to whatever level of precision you choose, you are ready to encode the video and to enlist Encoder in creating a player for you.
Creating The Player
Switch to the output panel, where you will pick a Silverlight 2 player and you want to click on the white dot (shown surrounded in red here)
When you choose the Silverlight 2 Default player template an image of the player will appear.
Clicking on the white dot and choosing Edit Copy in Expression Blend will open a dialog box asking you for a name for the template. Give it a name and click OK and Blend will open with a security warning. You can click Yes and Blend will fully open and inform you that you must build the project to work with it. Click Project->Build Solution and when it completes you should see the player in the art board and the Objects and Timeline will indicate that within the Layout Root is a single object: myPlayer.
Encoding the Video
Before you go any further, don’t forget to return to Encoder and finish encoding the video! Make sure the output tab is active and examine the Media File Name and the Directory,
The default name for your new encoded video is created by appending the default extension (wmv) to the original file name. You can change either or both parts of this. You can also pick the directory you’d like to place the encoded video into. There are some checkboxes below that can be helpful as well.
Once you have this set as you like, click the Encode button in the lower left hand corner and your video will begin encoding, with a countdown clock telling you how much time remains. If you checked “Preview in Browser” when you finish a browser will open and your video will display (though there may be a short delay).
Files, Files, Who Has The Files?
At this point you have two sets of important files:
- The encoded video and some helper files to look at it
- The emitted player and the source code for modifying it
The encoded video should be in the directory you chose (in the example shown above, the files would be in c:\demo\HyperVideo Blog 1\VISTA64DT 12-30-2008 12.45.51 PM\ where VISTA64DT is the name of my machine and the rest of the name is a time stamp.
Inside that directory will be a copy of the .xap file for the emitted player, a .dat file that contains a great deal of information about the video and the markers, a default.html and the encoded wmv file. Double clicking on the html file will bring up your video in the emitted video player.
Where is the Player?
The player itself is in the default output location unless you took steps to put it elsewhere. On my machine that is C:\Users\Jesse\Documents\Expression\Expression Encoder\Templates
Under that directory I will find a directory with the name of the template, in this case, Silverlight 2 Blog Version inside of which is another Default.html and copy of the .xap file, but more important, is also a Source directory. In that directory is the complete source for the custom control player that I will want to modify.
Spec’ing the Player
The player that is emitted by encoder is a good start, but it encourages use of markers in exactly the wrong way for our purposes. We are not interested in chapters, we are interested in providing metadata and reacting to embedded markers as events. Thus, there is much we want to strip away: specifically everything circled in red in this next image:
You can see, however, why we wanted Encoder to create the player; it is far easier to start with this and remove what we don’t want than to create all the functionality from scratch.
Working With The Project
If you open this project in Blend and Visual Studio (and I recommend opening it in both) there is a fleeting temptation to panic when you look in page.xaml:
<UserControl x:Class="MediaPlayerTemplate.Page" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:ExpressionPlayer="clr-namespace:ExpressionMediaPlayer; assembly=ExpressionPlayer" mc:Ignorable="d" Width="Auto" Height="Auto"> <Grid x:Name="LayoutRoot"> <ExpressionPlayer:ExpressionPlayer Margin="0,0,0,0" x:Name="myPlayer" /> </Grid> </UserControl>
All that you have is a single, monolithic control. How are you going to modify that??
It’s Just A Skinnable Custom Control
Great news! What Encoder has provided to you is a skinnable custom control, exactly as described in these four videos:
- Building a skinnable custom control part 1
- Building a skinnable custom control part 2
- Building a skinnable custom control part 3
- Building a skinnable custom control part 4
What encoder has done is to create a custom class, ExpressionPlayer that derives from MediaPlayer.
public class ExpressionPlayer : MediaPlayer
Rather than providing ExpressionPlayer with a default look, they rely on MediaPlayer for that, but wonderfully, MediaPlayer’s source is also included, and as you’d expect there is a Themes folder with a generic.xaml file that does contain the default appearance.
In addition, MediaPlayer.cs provides the attributes that constitute the Parts and States contract
[TemplatePart(Name=MediaPlayer.StretchBox, Type=typeof(FrameworkElement))] [TemplatePart(Name=MediaPlayer.VideoWindow, Type=typeof(FrameworkElement))] [TemplatePart(Name=MediaPlayer.TextblockErrorMessage, Type = typeof(TextBlock))] [TemplatePart(Name=MediaPlayer.ClosedCaptionBackground, Type = typeof(Rectangle))]
which makes skinning (templating) the Expression player far easier.
What We’ll Do In the Next Installment
Having encoded the video and emitted a player, and having explored enough to see that we have the resources to template that player we’ve reached a good stopping point.
Next time we’ll modify the player to strip it down and we’ll teach it to respond to markers by placing the name of the marker just below the player. Once we can do that, we’ll have established the fundamental architecture and we can begin to enhance the player to respond in more meaningful ways.
Previous: Hypervideo- Continuing the Dialog Next: Building a Hyper-Video Player: Phase I