Converting PAL to NTSC on Linux
Posted by Skrud at Saturday, October 15th 2005 at 3:33am
I had a bitch of a time trying to convert a PAL version of the (most awesome) Thai movie, The Bodyguard, to a locally playable NTSC encoded disc. After much googling and reading many guides and tutorials and other various things I realized that it would be much simpler to just buy an all region DVD player. I still agree. But after two days of wrestling with mplayer, mjpegtools, ffmpeg, and dvdauthor I’m proud to say that I’ve emerged victorious, and I can’t wait to watch The Bodyguard with friends and all.
I figured I’d help the next poor soul goolging for PAL -> NTSC conversions by describing what worked for me. In short, these are the steps:
- Use ffmpeg to reencode the video and (if necessary) audio.
- Use spumux for DVD Menus (although it’s not that important).
- Use dvdauthor for authoring the DVD.
Originally I had tried using a method I read about in this forum involving mplayer and mjpegtools, but this left me with out of sync audio (and, on top of that, mplayer would downmix the 5.1 AC3 Audio track to 2.0 channels).
I’m going to assume that you already have the DVD ripped and are dealing with straight VOB files now, and there are plenty of real guides out there for ripping/decrypting DVDs. vobcopy works great. You can then use mplayer to play the VOBs directly so you know which ones you want to convert (or you can just convert them all … totally up to you).
You can actually use ffmpeg to reencode and resize the video and audio together in one shot. Just like this:
ffmpeg -i /path/to/vobfile -target ntsc-dvd -r '30000/1001' -aspect 16:9 -acodec copy outputfile.mpg
Obviously -i takes the input files as a paramenter, and -target ntsc-dvd is fairly straightforward. The -r option tells ffmpeg to encode at the standard NTSC framerate which is 29.997 fps (or, more accurately, 30000/1001) as oppose to PAL’s 25 fps. Meanwhile -aspect forces the output to be in a 16:9 (NTSC Widescreen) format. You could also use 4:3 for standard NTSC TV format. The -acodec copy option tells ffmpeg to copy the audio stream from the source. If you want, you can reencode it by using the -ar, -ab and -ac options…. check ffmpeg’s help for that. And finally you give it an output file. Remember, the main feature of a DVD can often take up more than one VOB file, so make sure you’re not forgetting any. Having more than one mpg file is fine, you can always string them together with DVDAuthor.
I’m not going to bother dealing with menus, because it can be really tedious (especially if you’re trying to rip the menus off an original DVD) or even make your own … but this tutorial explains it much better than I could, and it’s what I followed.
The man page for dvdauthor was my best friend during the next process, and I had to make many small changes to the XML file to get it to work just right. dvdauthor is a neat little program that takes an XML file as input and produces an authored DVD ready to be burned. It’s kind of tricky doing this by hand, so I would suggest just using one of the many frontends available from the list on the dvdauthor website. The only time a frontend wouldn’t really help you is if you’re making your own menus, or you’re trying to have a movie in a menu …
Anyway, the XML file is fairly straightforward. This is what the one I used looked like:
<dvdauthor dest="/home/skrud/bodyguard_vts">
<vmgm>
<menus>
<video format="ntsc" aspect="16:9" widescreen="nopanscan" />
<audio format="ac3" channels="2" samplerate="48khz" />
<pgc entry="title">
<vob file="momentum_asia.mpg" />
<vob file="momentum_pictures.mpg" />
<vob file="piracy.mpg" />
<post>jump titleset 1 menu;</post>
</pgc>
</menus>
</vmgm>
<titleset>
<menus>
<pgc entry="root">
<vob file="spu_main_menu.mpg" />
<button name="play">jump title 1 chapter 1;</button>
<button name="bonus">jump title 2 chapter 1;</button>
</pgc>
</menus>
<titles>
<pgc>
<vob file="movie_1.mpg" />
<vob file="movie_2.mpg" />
<vob file="movie_3.mpg" />
<vob file="movie_4.mpg" />
<post>call menu;</post>
</pgc>
<pgc>
<vob file="making_of.mpg" />
<vob file="trailer_borntofight.mpg" />
<vob file="trailer_ongbak.mpg" />
<post>call menu;</post>
</pgc>
</titles>
</titleset>
</dvdauthor>The dest attribute in the root tag is the directory where your output will go to.
Giving those menus the “title” and “root” names will link them up to your DVD Player’s Title and Root Menu buttons. The VMGM tag specifies what gets played as soon as you pop the DVD in. In this case, the studio’s logos and an anti-piracy ad. (The video and audio tags are optional, but there’s more detail on them in the dvdauthor man page). Each pgc tag declares a new title, and each vob entry implicitly declares a chapter. If you want to painstakingly set up chapters and times and crazy things like that, then follow another tutorial. Because I’m too lazy, and as you can see, I didn’t bother.
The post tag under pgc contains an action (in dvdauthor’s language) on what to do once everything in that pgc has finished playing. By the same token, there’s a pre tag that will let you set up an action to do something before a pgc starts playing. The vob tags just take a video file as an argument. In this case, following the anti-piracy ad, the DVD will jump to the “root” menu, which it recognizes as being the menu of the first titleset tag. A dvdauthor XML file can have plenty of titleset tags. And the jump command will take a number of “targets” as a parameter. Namely: titleset <n> menu; (play the menu from titleset number n) or titleset <n> title <m>; (play title m in titleset n). More details again are in the man page. You’ll notice there is also a call function. This works similarly to jump, only it can be used to jump to a menu from a different titleset, which the jump command won’t do.
You’ll notice my root menu actually has buttons defined. The button names correspond to the names given in the spumux configuarion XML file that I used to create the menu mpg. dvdauthor and spumux are bundled together, so they understand each other when it comes to that kind of stuff. But again, I don’t want to go into detail about spumux, because imo it’s a bit of a waste of time and you’ll be better off using a frontend for it anyway. (I actually handcoded menu highlight images using The GIMP of all things …. it was really cool, but still quite tedious).
Then all you have to do is run dvdauthor:
dvdauthor -x <xml file>
And then use growisofs to burn a DVD image:
growisofs -dvd-video -Z /dev/dvdrw /folder/with/video_ts
Anyway, I hope this helps someone out sometime! Really, the meat of the operation is done with that one ffmpeg command, and everything else is can be done with a dvd authoring tool… Good luck!






I have looking all over for that movie since last year’s Fantasia. Where did you get it? I would really appreciate it if you could tell me.
It looks like there should be 30000/1001 instead of 30000/10001 in the ffmpeg commandline options.
Ooops, typo… thanks :) (At least the description below it was accurate!)
Hi there- thanks for the tutorial; much appreciated. Plan to use it to include re-region encoded versions of gift dvds for my techno-phobic parents… titles available here in NA, not in Australasia. Erg. Have a quick question for you- did you find anyway to reuse the original menu’s from a DVD? It seems that some apps (e.g. dvdshrink) are able to do this- but I can’t find any info on how that’s done. Perhaps it’s as easy as just reusing the original? Unfortunately I don’t have a lot of time to experiment with this… so any pointers appreciated! Thanks again!
This worked great, however, when copying the audio it only took one of the audio tracks instead of all of the available audio tracks. I want to keep the director commentaries and original language audio.