Converting TWiT Video

From The Official TWiT Wiki
Jump to: navigation, search

This page describes the process of converting a stream captured from BitGravity to an mp4 (or another container of your choosing) using free and open source software. The three pieces of software we'll need for this process are ffmpeg (0.5 or later), MP4Box and FAAC.

Contents

Setting Up For The First Time

We have guides for installing wget, curl, ffmpeg and mp4box on the following operating systems:

Capturing The Stream

There are several methods of capturing the stream. The one that's recommended by Odtv is wget. You can learn how to capture the stream and install wget in detail at How to Record TWiT, but if it's already installed you just need to remember the following command:

wget http://bglive-a.bitgravity.com/twit/live/high --ignore-length -O output.flv

Or if you prefer to use cURL you use this command instead:

curl http://bglive-a.bitgravity.com/twit/live/high --ignore-content-length -o output.flv

Once the episode has finished you simply use the key combination 'ctrl-c' to end the capture. You now have an flv to work with.

Converting To An MP4

We now want to convert this flv to an mp4 so we can distribute it and use it on a greater variety of video players. A neat thing we can do is convert this flv to an mp4 without losing a single bit of quality on the video because they both use h.264. We will however need to transcode the audio from mp3 to aac or the finished mp4 will not work on some video players (including Quicktime). To start converting the video you need to issue the command:

ffmpeg -i output.flv -vcodec copy -acodec libfaac -ac 1 -ab 64k output.mp4

Lets take a look at what this command does. You first have a flag called -i output.flv which tells ffmpeg that output.flv is the file we want to convert from. -vcodec copy tells ffmpeg that we want to use the video as is, with no transcoding. -acodec libfaac tells ffmpeg that we want the audio to be transcoded to aac using the FAAC encoder. -ac 1 means that we only want a single audio channel (ie: mono sound). TWiT only sends the left channel to BitGravity so we want to have that single channel outputted to both the left and right speakers. -ab 64k simply means that we want the bitrate of the aac to be 64kbps. The final parameter specifies the name of the output file, output.mp4.

After that command is finished you will have a new file named output.mp4 which should play on most media players.

More information on ffmpeg can be found here.

iPhone and iPod compatibility; also, Converting to other bit rates

This mp4 will not play on an iPod or iPhone because of the way the h.264 is encoded by the BitGravity software. You will need to transcode the video using the x264 encoder in order for that to work. This too can be done with ffmpeg.

Starting with the output.mp4 file from the previous step, one could use the following command:

ffmpeg -i output.mp4 -f mp4 -vcodec mpeg4 -maxrate 250000 -b 225000 -qmin 3 -qmax 5 -bufsize 16384 -g 300 -acodec libfaac -ab 64k -ac 1 -s 480x320 -dts_delta_threshold 1000 -aspect 16:9 output-iphone.mp4

The resulting file output-iphone.mp4 is sized for the iPhone (the "-s 480x320" and "-aspect 16:9" result in 480x270 video within the iPhone's 480x320 screen) and uses standard h.264 format, so should play on any h.264-compatible player. It will also be much smaller than the original captured .flv or the output.mp4 file, as it uses an average video bit rate of only 225 kbits/second with a maximum peak of 250 kbits/sec. This will result in a file about one fourth the size of the previous file (assuming the .flv was captured from the BitGravity high-quality stream). There will of course be a loss of quality, but that is usually acceptable on a small screen like the iPhone's.

These particular parameters are very similar to those used to encode the video files offered by Odtv. Other output frame sizes and bit rates can be tried for different players and situations.

n.b.: The two ffmpeg steps cannot be combined into one, logical though that might seem.

Attaching Two MP4s (optional)

If you want to attach two mp4 files together there's a fairly simple way of doing so. You might want to do this if you're attaching bumpers to the show you just downloaded or if there was a network problem and the show was downloaded in multiple files. For this example we will be joining output.mp4 to outputpart2'mp4 and saving it as finaloutput.mp4. First we need to separate the video and audio from both files using MP4Box. Before you start keep in mind that the audio in the mp4 needs to be the same format and bitrate. The video also needs to be the same format, bitrate and framerate. Issue the following commands to separate the video from the audio:

$ MP4Box -raw 1 -v output.mp4
$ MP4Box -raw 2 -v output.mp4
$ MP4Box -raw 1 -v outputpart2.mp4
$ MP4Box -raw 2 -v outputpart2.mp4

You will now have four new files; output_track1.h264, output_track2.aac, outputpart2_track1.h264 and outputpart2_track2.aac. You will now want to concatenate the video files to one another and the audio files to one another.

On Windows:

C:\> copy output_track1.h264 + outputpart2_track1.h264 concatvideo.h264
C:\> copy output_track2.aac + outputpart2_track2.aac concataudio.aac

On *NIX:

$ cat output_track1.h264 outputpart2_track1.h264 > concatvideo.h264
$ cat output_track2.aac outputpart2_track2.aac > concataudio.aac

You will then have two new files; concatvideo.h264 and concataudio.aac. These have all of the video and audio information of each of the original files combined. The last step is to put the video and audio back into an mp4 container with the following command:

$ MP4Box -add "concatvideo.h264:fps=29.970" -add "concataudio.aac" -v finaloutput.mp4
-substitute 29.970 for the framerate of the video such as 30.000 for 30 frames per second

You should now have a file named finaloutput.mp4 which seamlessly combines both of the videos you had at the beginning of this process.

Cutting an MP4 File (optional)

You may also need to cut or trim an MP4 file if you started capturing too early or didn't stop when the end of the netcast ended. This is accomplished by using MP4Box from GPAC. To cut or trim the MP4 file, issue the following command:

$ MP4Box -splitx 1:220 -v output.mp4

This outputs an MP4 file named output_1_220.mp4. The 1 here corresponds to when the cut video should start and the 220 here says where the cut video should end. The 1 and 220 mean seconds. So the length of the cut video is 1 minute and 59 seconds or 119 seconds. You will need to change these values to what is appropriate for the MP4 file you are cutting. If you specify 0 for the start, then it starts at the beginning. You cannot specify a higher value then the length of the original MP4 file.

Converting To An OGV

Instead of converting from flv to mp4, you can convert to ogv (OGG Video). This consists of the OGG Theora video codec, and the OGG Vorbis audio codec. To do this, simply compile ffmpeg with x264 support (using the instructions above, under Getting Started) and run the command:

$ ffmpeg -i output.flv -vcodec libtheora -acodec libvorbis -aspect 16:9 output.ogv
Personal tools