Overlay Text On Video Using Expression Encoder 4

I recently built an application where I wanted to write some arbitrary text onto a video.  I was using Expression Encoder 4 and had a difficult time finding some examples and documentation, aside from some basic MSDN documentation on the MediaItem class.  I was eventually able to figure it out, but it took a little time.  Even though the end result is not particularly glamorous, I thought I’d save you some time and share what I learned.

The first thing to recognize is that you have to create a Bitmap of the text you want to overlay.  This Bitmap is then overlayed on to the MediaItem.  So, first things first, create your Bitmap.  Here’s an approach:

Code Snippet
  1. /// <summary>
  2. /// This method will create a bitmap based
  3. /// </summary>
  4. /// <param name="overlayText"></param>
  5. /// <param name="rootPath"></param>
  6. /// <param name="width"></param>
  7. /// <param name="height"></param>
  8. /// <returns></returns>
  9. private static string createOverlayImage(string overlayText, string rootPath, int width, int height)
  10. {
  11.     // full path for a temporary bitmap
  12.     string overlayFileName = rootPath + "\\" + Guid.NewGuid().ToString() + ".bmp";
  13.  
  14.     // create a bitmap
  15.     Bitmap bitmap = new Bitmap(width, height);
  16.     Graphics g = Graphics.FromImage(bitmap);
  17.  
  18.     // define the font
  19.     Font font = new Font("Arial", (float)14.0);
  20.  
  21.     // define the area to draw on
  22.     Rectangle area = new Rectangle(new Point(0, 0), new Size(width, height));
  23.  
  24.     // draw the new image
  25.     g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
  26.     g.DrawString(overlayText, font, Brushes.Red, area);
  27.  
  28.     // save the picture with the text overlay
  29.     bitmap.Save(overlayFileName);
  30.  
  31.     // return the path to the overlay image
  32.     return overlayFileName;
  33. }

Nothing too surprising here:

  • Line #9: Pass in the text you want to overlay, the path for where you’ll store the created bitmap, and the width/height.
  • Line #12: Create a random file name for the Bitmap.
  • Line #26: You can change the font, color, and locations here if you’d like.

Now, with this method, you can set the overlay properties on the MediaItem like this:

Code Snippet
  1. // sets file name to media item
  2. mediaItem = new MediaItem("test.wmv");
  3.  
  4. // create the overlay image and return the path
  5. string overlayFileName = createOverlayImage("Thank you for encoding this video!", Environment.CurrentDirectory, mediaItem.VideoSize.Width, mediaItem.VideoSize.Height);
  6.                 
  7. // create the overlay on the media item
  8. mediaItem.OverlayFileName = overlayFileName;
  9. mediaItem.OverlayLayoutMode = OverlayLayoutMode.WholeSequence;
  10. mediaItem.OverlayRect = new Rectangle(new Point(30, 10), new Size((mediaItem.VideoSize.Width – 30), (mediaItem.VideoSize.Height – 10)));

Breaking it down:

  • Line #5: Grab the full path to the newly created Bitmap over your text overlay.
  • Line #8: Set the OverlayFileName to your Bitmap.
  • Line #9: Choose the layout mode.  There are a few options here that you can explore; details are on MSDN.
  • Line #10: The OverlayRect defines where your Bitmap lives on the video.  I indented it a bit, but it’s up to you.

image

I’ve modified the Simple template provided by the Expression Encoder 4 SDK with the code.  You can find it below.  Hope this helps.

4 Comments

  1. [...] This post was mentioned on Twitter by MSExpression, Rodolpho Sa, Emmanuel yazid, Antonio Raga, Kunal Chowdhury and others. Kunal Chowdhury said: RT @MSExpression: Overlay Text On Video Using #Expression #Encoder 4 – http://bit.ly/e7w2ym – #msexp [...]

  2. James Brown says:

    Is there a way to feed MediaItem a livejob ?
    MediaItem mediaItem = new MediaItem(“test.wmv”);

  3. Iain B says:

    If you’re using the EE4 GUI, you can do this with a XAML overlay… I’ve used this for doing burn-in captions (source at https://github.com/i-e-b/TimedTextToXaml ). Not sure if this can be done with the SDK, but I’d guess so.

Leave a Reply