DVD with a Title Menu

This topic describes how you can use DVDBuilder to create a DVD with two titles and a title menu.

Project Directory

You need a directory to store the source images and the DVDBuilder project. This can be anywhere on your machine. For example create C:\TitleMenuDVD directory. We will refer to that as the DVD Project Directory.

Assets

Video Clips

Download the files Elephant_512kb.mp4 and Hippo_512kb.mp4 from the Internet Archive to the DVD Project Directory.

Download the Menu_NTSC.jpg and the Menu_NTSC_Mask.bmp images below to the DVD Project Directory.

Menu_NTSC.jpg Menu_NTSC_Mask.bmp

See Create Thumbnail Menu Background and Mask in GIMP for the steps to create the background and mask images.

DVDBuilder Project

In the DVD Project Directory create a file project.xml with the following contents:


<?xml version='1.0' encoding='utf-8'?>
<dvd version='2.3' xmlns='http://www.primosoftware.com/dvdbuilder/2.3'>
    <videoManager firstPlayNavigate='Menu=1001;'>
        <menus>
            <menu id='1001' entry='title'>
                <button left='130' top='150' width='200' height='150' navigate='Title=1;' />
                <button left='370' top='150' width='200' height='150' navigate='Title=2;' />
                <background file='Menu_NTSC.mpg' />
                <mask
                    file='Menu_NTSC_Mask.bmp'
                    patternColor    ='#FF0000'
                    backgroundColor ='#000000'
                    emphasisColor1  ='#00FF00'
                    emphasisColor2  ='#0000FF' />
                <display
                    patternColor   ='#FFFFFF' patternContrast   ='3'
                    backgroundColor='#000000' backgroundContrast='0'
                    emphasis1Color ='#000000' emphasis1Contrast ='0'
                    emphasis2Color ='#000000' emphasis2Contrast ='0' />
                <selection
                    patternColor   ='#000000' patternContrast   ='0'
                    backgroundColor='#000000' backgroundContrast='0'
                    emphasis1Color ='#FF00FF' emphasis1Contrast ='15'
                    emphasis2Color ='#000000' emphasis2Contrast ='0' />
                <action
                    patternColor   ='#000000' patternContrast   ='0'
                    backgroundColor='#000000' backgroundContrast='0'
                    emphasis1Color ='#FF00FF' emphasis1Contrast ='15'
                    emphasis2Color ='#FFFF00' emphasis2Contrast ='10' />
            </menu>
        </menus>
    </videoManager>
    <titleSet>
        <titles>
            <title id='1' chapters='00:00:00;'>
                <videoObject file='Elephant.mpg'/>
            </title>
            <title id='2' chapters='00:00:00;'>
                <videoObject file='Hippo.mpg'/>
            </title>
        </titles>
    </titleSet>
</dvd>

For detailed explanation of the DVDBuilder project XML elements and attributes, see the DVD Title Menu with Thumbnail Images topic in the DVD Projects | Menus section.

Prepare Assets

Convert Menu Background to MPEG-2

You can use AVBlocks to convert JPG to MPG (MPEG-2 Program Stream).


string background = Path.Combine(DVDProjectDirectory, "Menu_NTSC.jpg");
string backgroundMpeg2 = Path.Combine(DVDProjectDirectory, "Menu_NTSC.mpg");

ConvertImageToMpeg2(background, backgroundMpeg2);

The ConvertImageToMpeg2 method:


using avb = PrimoSoftware.AVBlocks;

private static void ConvertImageToMpeg2(string inputFile, string outputFile)
{
    if (File.Exists(outputFile))
        File.Delete(outputFile);

    var inputSocket = new avb.MediaSocket { File = inputFile };

    var outputSocket = avb.MediaSocket.FromPreset(avb.Preset.Video.DVD.NTSC_4x3_PCM);
    outputSocket.File = outputFile;

    using (var transcoder = new avb.Transcoder())
    {
        transcoder.AllowDemoMode = true;

        transcoder.Inputs.Add(inputSocket);
        transcoder.Outputs.Add(outputSocket);

        if (transcoder.Open())
        {
            transcoder.Run();
            transcoder.Close();
        }
    }
}

Convert Video Clips to MPEG-2

You can use AVBlocks to convert MP4 to MPG (MPEG-2 Program Stream).


string sourceMp4 = Path.Combine(DVDProjectDirectory, "Elephant_512kb.mp4");
string sourceMpeg2 = Path.Combine(DVDProjectDirectory, "Elephant.mpg");

ConvertVideoToMpeg2(sourceMp4, sourceMpeg2);

sourceMp4 = Path.Combine(DVDProjectDirectory, "Hippo_512kb.mp4");
sourceMpeg2 = Path.Combine(DVDProjectDirectory, "Hippo.mpg");

ConvertVideoToMpeg2(sourceMp4, sourceMpeg2);

The ConvertVideoToMpeg2 method:


using avb = PrimoSoftware.AVBlocks;

private static void ConvertVideoToMpeg2(string inputFile, string outputFile)
{
    if (File.Exists(outputFile))
        File.Delete(outputFile);

    var inputInfo = new avb.MediaInfo()
    {
        InputFile = inputFile
    };

    if (inputInfo.Load())
    {
        var inputSocket = avb.MediaSocket.FromMediaInfo(inputInfo);

        var outputSocket = avb.MediaSocket.FromPreset(avb.Preset.Video.DVD.NTSC_16x9_PCM);
        outputSocket.File = outputFile;

        using (var transcoder = new avb.Transcoder())
        {
            transcoder.AllowDemoMode = true;

            transcoder.Inputs.Add(inputSocket);
            transcoder.Outputs.Add(outputSocket);

            if (transcoder.Open())
            {
                transcoder.Run();
                transcoder.Close();
            }
        }
    }
}

Build DVD Structures

Simply create a DVDBuilder object, set the ProjectFile and OutputFolder properties, and call the Build method.


string project = Path.Combine(DVDProjectDirectory, "project.xml");
string dvdFiles = Path.Combine(DVDProjectDirectory, "dvd");

BuildDVDStructures(project, dvdFiles);

The BuildDVDStructures method:


using dvdb = PrimoSoftware.DVDBuilder;

private static void BuildDVDStructures(string project, string dvdFiles)
{
    if (Directory.Exists(dvdFiles))
        Directory.Delete(dvdFiles, true);

    using (var dvdBuilder = new dvdb.DVDBuilder())
    {
        dvdBuilder.ProjectFile = project;
        dvdBuilder.OutputFolder = dvdFiles;

        dvdBuilder.Build();
    }
}

Complete .NET Code


using System;
using System.IO;

using avb = PrimoSoftware.AVBlocks;
using dvdb = PrimoSoftware.DVDBuilder;

namespace CreateDVDTitleMenu
{
    class Program
    {
        const string DVDProjectDirectory = "C:/TitleMenuDVD";

        static void Main(string[] args)
        {
            PrimoSoftware.AVBlocks.Library.Initialize();
            PrimoSoftware.AVBlocks.Library.SetLicense("license_xml_string");

            // DVD authoring
            PrimoSoftware.DVDBuilder.Library.Initialize();
            PrimoSoftware.DVDBuilder.Library.SetLicense("license_xml_string");

            // Step 1: Convert menu background
            string background = Path.Combine(DVDProjectDirectory, "Menu_NTSC.jpg");
            string backgroundMpeg2 = Path.Combine(DVDProjectDirectory, "Menu_NTSC.mpg");

            ConvertImageToMpeg2(background, backgroundMpeg2);

            // Step 2: Convert title videos
            string sourceMp4 = Path.Combine(DVDProjectDirectory, "Elephant_512kb.mp4");
            string sourceMpeg2 = Path.Combine(DVDProjectDirectory, "Elephant.mpg");

            ConvertVideoToMpeg2(sourceMp4, sourceMpeg2);

            sourceMp4 = Path.Combine(DVDProjectDirectory, "Hippo_512kb.mp4");
            sourceMpeg2 = Path.Combine(DVDProjectDirectory, "Hippo.mpg");

            ConvertVideoToMpeg2(sourceMp4, sourceMpeg2);

            // Step 3: Build DVD structures
            string project = Path.Combine(DVDProjectDirectory, "project.xml");
            string dvdFiles = Path.Combine(DVDProjectDirectory, "dvd");

            BuildDVDStructures(project, dvdFiles);

            PrimoSoftware.DVDBuilder.Library.Shutdown();
            PrimoSoftware.AVBlocks.Library.Shutdown();
        }

        private static void ConvertImageToMpeg2(string inputFile, string outputFile)
        {
            if (File.Exists(outputFile))
                File.Delete(outputFile);

            var inputSocket = new avb.MediaSocket { File = inputFile };

            var outputSocket =
                avb.MediaSocket.FromPreset(avb.Preset.Video.DVD.NTSC_4x3_PCM);

            outputSocket.File = outputFile;

            using (var transcoder = new avb.Transcoder())
            {
                transcoder.AllowDemoMode = true;

                transcoder.Inputs.Add(inputSocket);
                transcoder.Outputs.Add(outputSocket);

                if (transcoder.Open())
                {
                    transcoder.Run();
                    transcoder.Close();
                }
            }
        }

        private static void ConvertVideoToMpeg2(string inputFile, string outputFile)
        {
            if (File.Exists(outputFile))
                File.Delete(outputFile);

            var inputInfo = new avb.MediaInfo()
            {
                InputFile = inputFile
            };

            if (inputInfo.Load())
            {
                var inputSocket = avb.MediaSocket.FromMediaInfo(inputInfo);

                var outputSocket =
                    avb.MediaSocket.FromPreset(avb.Preset.Video.DVD.NTSC_16x9_PCM);

                outputSocket.File = outputFile;

                using (var transcoder = new avb.Transcoder())
                {
                    transcoder.AllowDemoMode = true;

                    transcoder.Inputs.Add(inputSocket);
                    transcoder.Outputs.Add(outputSocket);

                    if (transcoder.Open())
                    {
                        transcoder.Run();
                        transcoder.Close();
                    }
                }
            }
        }

        private static void BuildDVDStructures(string project, string dvdFiles)
        {
            if (Directory.Exists(dvdFiles))
                Directory.Delete(dvdFiles, true);

            using (var dvdBuilder = new dvdb.DVDBuilder())
            {
                dvdBuilder.ProjectFile = project;
                dvdBuilder.OutputFolder = dvdFiles;

                dvdBuilder.Build();
            }
        }
    }
}


Last updated on May 12th, 2015 12:00:00 AM