May 18, 2011, 11:28 p.m.
posted by ccall
Convert from One Video Format to Another
They say that the problem with standards is that there are so many to choose from. This is definitely true when it comes to video formats. It would be nice to store all video just as it was recorded, but the fact is it would take up more space than many people have available on their computers. As a result, a number of different lossy compression formats have been developed to try to reduce the file size for video while still maintaining reasonable quality. There is also a battle raging between various companies such as Microsoft, Apple, and Real each with their own competing video formats. Plus, as the technology improves, new revisions of old formats appear. The end result is a jumble of MPEG1, MPEG2, DivX, ASF, XVID, and other video formatsall different from one another.
When wading through these choices, often you find you need to convert a video from one format to another. There are a number of special-purpose tools that excel at one particular formats or group of formats, but with transcode you have a single conversion tool you can apply to all of the various video files you might have. Transcode not only supports converting to and from a variety of formats, it also can perform cropping and resizing [Hack #68].
The first step is installing transcode. Because of the number of formats transcode supports, in general it's simpler to use a precompiled binary for your distribution. Most major distributions offer transcode either as part of the distribution or from third-party packagers. These are preferred since you can grab all of the library dependencies from the same place. To install from source, download the latest version from http://www.transcoding.org and follow the instructions at http://www.transcoding.org/cgi-bin/transcode?Building_Transcode.
The most important aspect of installation from source is the options you pass to the configure script. A majority of the useful import and export plug-ins, including ogg, mjpegtools, libquickime, libdv, and others, aren't enabled by default in the source (while usually they are enabled in prepackaged binaries). The number of arguments to pass configure are too numerous to list here, but check the install page linked above for the list of options that aren't enabled by default.
With transcode installed, the next thing to consider is which video format you wish to convert to. The transcode manpage lists all of the different video and audio export modules in the manpage under the -y option. Some export modules are only for video or for audio. In those cases, the manpage will list null next to the video or audio section of the description.
To see what modules your transcode install has, type:
$ ls -1 `tcmodinfo -p`/export*.so /usr/lib/transcode/export_ac3.so /usr/lib/transcode/export_af6.so /usr/lib/transcode/export_debugppm.so /usr/lib/transcode/export_divx5raw.so … /usr/lib/transcode/export_xvid2.so /usr/lib/transcode/export_xvid3.so /usr/lib/transcode/export_xvid4.so /usr/lib/transcode/export_xvid.so /usr/lib/transcode/export_yuv4mpeg.so $
Figure lists some of the more popular video and audio export modules.
Video codecs supported
Audio codecs supported
Uses ffmpeg to encode audio to AC3.
Encodes MPEG4 video using the closed-source binaries from divx.com.
Encodes MPEG4 video using the closed-source binaries from divx.com.
Encodes DV into an AVI container. DV is a codec used in digital camcorders.
Encodes audio to MPEG layer III (MP3) using LAME.
Encodes MJPEG-based AVI files.
Encodes into MPEG1 video and can encode VCD-compliant streams.
Writes an MP2 (MPEG1-Layer2) audio file.
Uses mpeg2enc to encode MPEG1, VCD, SVCD, MPEG2, and DVD videos.
Encodes audio to Ogg Vorbis.
Encodes audio to PCM format.
Does no encoding and instead processes raw streams. Used also for pass-through mode.
Encodes MPEG4 video using xvid.org encoding libraries. The "xvid" option often is a symlink to this library.
Simple Example: Encode a Video to XviD
One of the easier examples for transcode is to turn a video (such as an .mpg file) into XviD format. XviD is a particular set of MPEG4 encoding libraries that provide high quality encodes with small file sizes. transcode has many different options you can use to tweak its outputso many it's easy to get lost in them all. For the purposes of this hack I'm going to try to limit it down to some essential arguments that you need to convert video between formats.
Many examples you see on the Web show people passing transcode import format options, but this isn't necessary, and if you omit the import format option, transcode will scan the video and figure it out for itself. I've found that for my videos, transcode is good at figuring it out, and one less option on the command line makes things easier to read and understand. So, to convert a sample MPEG file to an XviD AVI, type:
$ transcode -i sample.mpg -o output.avi -y xvid transcode v0.6.14 (C) 2001-2003 Thomas Oestreich, 2003-2004 T. Bitterberg [transcode] (probe) suggested AV correction -D 0 (0 ms) | AV 0 ms | 0 ms [transcode] auto-probing source sample.mpg (ok) [transcode] V: import format | MPEG (V=mpeg2|A=mp3) [transcode] V: AV demux/sync | (0) sync AV at PTS start - demuxer disabled [transcode] V: import frame | 352x240 1.47:1 encoded @ 4:3 [transcode] V: bits/pixel | 0.711 [transcode] V: decoding fps,frc | 29.970,4 [transcode] V: Y'CbCr | YV12/I420 [transcode] A: import format | 0x50 MPEG layer-2 [44100,16,2] 224 kbps [transcode] A: export format | 0x55 MPEG layer-3 [44100,16,2] 128 kbps [transcode] V: encoding fps,frc | 29.970,4 [transcode] A: bytes per frame | 5884 (5885.880000) [transcode] A: adjustment | [email protected] [transcode] V: IA32 accel mode | sse2 (sse2 sse mmxext mmx asm C) tc_memcpy: using mmxext for memcpy [transcode] V: video buffer | 10 @ 352x240 [import_mp3.so] v0.1.4 (2003-08-04) (audio) MPEG [import_mpeg2.so] v0.4.0 (2003-10-02) (video) MPEG2 [export_xvid4.so] v0.0.5 (2003-12-05) (video) XviD 1.0.x series (aka API 4. 0) | (audio) MPEG/AC3/PCM …
As transcode processes the file, it will indicate how many frames per second it is processing and how far along in the video it is, so you can track its progress.
Notice that, by default, transcode used MPEG layer-3 for the audio, since I didn't specify an audio format to use. If you want, you can change that. For instance, to create an XviD with Ogg Vorbis audio, you pass transcode an audio export module as well as a video export module. In this case you also need to provide transcode with a filename to save the audio track to with the -m argument, so that you can combine it and the video later on:
$ transcode -i sample.mpg -o output.avi -m output.ogg -y xvid,ogg transcode v0.6.14 (C) 2001-2003 Thomas Oestreich, 2003-2004 T. Bitterberg [transcode] (probe) suggested AV correction -D 0 (0 ms) | AV 0 ms | 0 ms [transcode] auto-probing source sample.mpg (ok) [transcode] V: import format | MPEG (V=mpeg2|A=mp3) [transcode] V: AV demux/sync | (0) sync AV at PTS start - demuxer disabled [transcode] V: import frame | 320x240 1.33:1 encoded @ 1:1 [transcode] V: bits/pixel | 0.782 [transcode] V: decoding fps,frc | 29.970,4 [transcode] V: Y'CbCr | YV12/I420 [transcode] A: import format | 0x50 MPEG layer-2 [44100,16,2] 224 kbps [transcode] A: export format | 0x55 MPEG layer-3 [44100,16,2] 128 kbps [transcode] V: encoding fps,frc | 29.970,4 [transcode] A: bytes per frame | 5884 (5885.880000) [transcode] A: adjustment | [email protected] [transcode] V: IA32 accel mode | sse2 (sse2 sse mmxext mmx asm C) tc_memcpy: using mmxext for memcpy [transcode] V: video buffer | 10 @ 320x240 [import_mp3.so] v0.1.4 (2003-08-04) (audio) MPEG [import_mpeg2.so] v0.4.0 (2003-10-02) (video) MPEG2 [export_ogg.so] v0.0.5 (2003-08-31) (video) null | (audio) ogg [export_xvid4.so] v0.0.5 (2003-12-05) (video) XviD 1.0.x series (aka API 4. 0) | (audio) MPEG/AC3/PCM [import_mp3.so] MP3->PCM [import_mp3.so] tcextract -a 0 -i "sample.mpg" -x mp2 -d 0 | tcdecode -x mp2 -d 0 -z 0 [import_mpeg2.so] tcextract -x mpeg2 -i "sample.mpg" -d 0 | tcdecode -x mpeg2 -d 0 -y yv12 … [export_ogg.so] Hint: Now merge the files with [export_ogg.so] Hint: ogmmerge -o complete.ogg output.avi output.ogg clean up | frame threads | unload modules | cancel signal | internal threads | done [transcode] encoded 15491 frames (0 dropped, 0 cloned), clip length 516.88 s $
The transcode command even provides you with a hint on how to merge the audio and video streams once it is finished. In the case of Ogg files, use ogmmerge (part of the Ogg Vorbis toolset) to merge the video and audio streams:
$ ogmmerge -o final.avi output.avi output.ogg Using AVI demultiplexer for output.avi. Opening file. This may take some time depending on the file's size. +-> Using video output module for video stream. Using OGG/OGM demultiplexer for output.ogg. +-> Using Vorbis audio output module for stream 1. progress: 15490/15490 frames (100%) $
In this example, final.avi would be the final combined video.
Other Multipart Video Formats
When creating other video files, particularly (S)VCDs, DVD, or other MPEG files, often transcode will output into multiple files that you then need to combine into a single file. The complete process of creating (S)VCDs and DVDs is covered in [Hacks #69 and #70] respectively, but if you want, you can also create these file types with transcode.
For this example, I have an MPEG1 file, sample.mpg, that I want to convert to an MPEG2 file. I use transcode with both video and audio export modules selectedin this case mpeg2enc and mp2enc for video and audio, respectively. In addition, since the mpeg2enc supports both MPEG1 and MPEG2, I need to pass an extra option, -F, to specify what type of video to create. The options for the -F argument vary depending on the type of video module you have selected, and all the various options are described in the transcode manpage. For mpeg2enc, the primary option for the -F argument is a number between 0 and 8. Read the manpage for more information on these options, but as an example, 0 specifies a MPEG1 (and is the default), 1 specifies VCD, 3 specifies MPEG2, 4 specifies SVCD, and 8 specifies DVD. Since I want MPEG2, I type the following:
$ transcode -i sample.mpg -o output -y mpeg2enc,mp2enc -F 3
Notice that I didn't add an extension to the output filename. That's because transcode is going to create two files for me, output.m2v (my MPEG2 video) and output.mpa (my MPEG2 audio). Since these files are MPEG format, the next step is to combine these two files into a single file with the tcmplex utility. tcmplex is part of the transcode toolkit up through 0.6.14, although it was removed due to lack of maintenance. If you have a newer version of transcode you can use the mplex tool that is part of the mjpegtools suite (http://mjpeg.sourceforge.net). To combine these two files, I type the following command for tcmplex:
$ tcmplex -m 2 -i output.m2v -p output.mpa -o output.mpg
The -m option sets the output to one of a few predefined modes. In this case I set it to 2, which is the predefined mode for MPEG2, but I could have set it to 1 (MPEG1 VBR), d (DVD), s (SVCD), or v (VCD). The -i option specifies the input video stream, and -p specifies the input audio stream. You can even specify multiple audio streams, just use -s to specify the second audio track. Finally, the -o argument specifies the output file to use.
In the case of mplex, type:
$ mplexf 3o output.mpg i output.m2voutput.mpa
Thef option is like them option in tcmplex and specifies a predefined mode for the output file. In this case, I chose 3 for standard MPEG2, but I could have set it to 0 (generic MPEG1), 1 (VCD), 2 (SVCD), or 9 (DVD). The manpage for mplex lists a number of other format options. Finally theo argument specifies the output file to use.
Once the command completes, I have an MPEG2 file named output.mpg.
Transcode is a very complicated program with a large number of options. While I can't easily cover all the processes of conversion to every format you might want, the previous examples should be enough to get you started with converting files to various MPEG1, MPEG2, and MPEG4 or XviD files. Generally speaking, to change to a different output format, just change the argument you pass -y, and optionally add -F arguments if they exist for that output module.
For more information on tweaks to specific formats, be sure to read through the examples given in the transcode manpage (type man transcode) as well as the numerous examples on the official transcode page at http://www.transcoding.org.