I really like Corel VideoStudio Pro for video editing, and I’ve been using it for 4 years now.  Unfortunately it really falls down when it comes to QuickTime videos.  Now that I own a Canon 7D that records in QuickTime format, this is a problem.

The underlying issue is that the software seems to lose all knowledge of its QuickTime capabilities when QuickTime has been upgraded on the machine.  Since I use iTunes on this computer for my iPhone and iPad, there’s no possibility for me to downgrade QuickTime for VideoStudio.

So tonight I set out to find a solution.

QuickTime Pro and some C#

I purchased QuickTime Pro ($30) and found that I could take a .mov file and perform a Pass Through MP4 conversion which essentially just strips the embedded mp4 data from the .mov file without doing any real transcoding.  This is exactly what I want – I don’t want to lose any video quality just because I want the raw mp4.

The problem now is that this is a completely manual process that I would need to do on each and every video file.  File -> Export -> MPEG-4 -> Pass Through -> blah blah.

There’s just no way that was going to work, so I decided to write some code against the QuickTime COM api to automate the process.

The following code is for a command-line executable that will do this mov to mp4 conversion to a batch of mov files:

using System;
using System.IO;
using System.Reflection;
using System.Threading;
using QTOControlLib;
using QTOLibrary;
using QuickTimePlayerLib;

namespace QTExtractor
{
    class Program
    {
        static void Main(string[] args)
        {
            // get the player, and the "control"
            QuickTimePlayerApp qtApp = new QuickTimePlayerApp();

            // have to wait for QT to open up.
            Thread.Sleep(5000);

            // get a Player instance
            QuickTimePlayer qtPlayer = qtApp.Players[1];

            // the exporter we will configure once and re-use
            QTExporter exporter = null;
            foreach (string movFile in args)
            {
                // open the movie
                qtPlayer.OpenURL(movFile);

                // get the QTControl
                QTControl control = qtPlayer.QTControl;

                // configure the exporter
                if (exporter == null)
                {
                    if (control.QuickTime.Exporters.Count == 0)
                    {
                        control.QuickTime.Exporters.Add();
                    }

                    exporter = control.QuickTime.Exporters[1];
                    exporter.TypeName = "MPEG-4";
                    exporter.ShowProgressDialog = true;

                    // load our embedded settings
                    string settingsXml = "";
                    using (Stream resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("QTExtractor.Settings.Settings.xml"))
                    {
                        if (resourceStream == null)
                        {
                            throw new InvalidOperationException("Unable to locate the embedded settings.xml file for use with QuickTime Pro.");
                        }

                        using (StreamReader reader = new StreamReader(resourceStream))
                        {
                            settingsXml = reader.ReadToEnd();
                        }
                    }

                    // set the settings xml
                    CFObject newSettings = new CFObject();
                    newSettings.XML = settingsXml;
                    exporter.Settings = newSettings;
                }

                // set the datasource to the new movie
                exporter.SetDataSource(control.Movie);

                // uncomment to obtain new settings xml for use in exports
                //exporter.ShowSettingsDialog();
                //string settings = exporter.Settings.XML;
                //File.WriteAllText(@"C:tempsettings.xml", settings);

                // just place the mp4 alongside the mov
                string targetFile = Path.Combine(Path.GetDirectoryName(movFile), Path.GetFileNameWithoutExtension(movFile) + ".mp4");
                exporter.DestinationFileName = targetFile;

                // Go!
                exporter.BeginExport();
            }

            // close the player
            qtPlayer.Close();
        }
    }
}

After building this, I added a shortcut to my Windows 7 SendTo folder.

Now, in my video folder I’m able to multi-select as many .mov files as necessary, righ-click and select Send To -> QTExtractor.  An .mp4 file will be created for each .mov!

The only downside is that the QT UI pops up as it is working – I haven’t looked but I suspect I can’t get around this.  Oh well, this should suffice until Corel gets their act together.

2 responses to “Corel VideoStudio Pro and QuickTime, a Workaround”

  1. […] Copyright wareplanet.com Contact Powered by apanel for software. Corel VideoStudio Pro and QuickTime, a Workaround | The Johnson … […]

    Like

I’m Eric

Welcome to my corner of the web. Here you’ll find an archive of a wide range of topics, from wood working to code to photography – wherever my interests and hobbies have taken me. Look around, comment, or just hit the Back button!

Let’s connect