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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
| 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:\temp\settings.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.