The Johnson Blog

Ramblings of a geek with a few hobbies…

Tag: quicktime

  • Corel VideoStudio Pro and QuickTime, a Workaround

    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.