On observing a colleague at work with a Macintosh, I was impressed with the FFMPEGX tool, and disappointed that there was no equivalent on Linux. Thankfully, I couldn’t have been more wrong – it’s built around the FFMPEG tool, which is originally for the Unix / Linux platform. You will have to prepare yourself for the command line, but you won’t have the nag screen and waves of brushed metal you get on the Mac.
- Video codec: MPEG4 (DivX or Xvid are specifically mentioned)
- Video bitrate: between 700 and 1000 kbps
- Audio codec: MP3
- Resolution: 320×240
First, let’s install ffmpeg:
sudo apt-get install ffmpeg
Next, run ffmpeg to figure out what format your source video is actually in. In my case, I was manipulating video coming from a Fujifilm F31FD camera. Here’s what I typed:
$ ffmpeg -i DSCF0370.AVI
And here’s the important part of the output:
Input #0, avi, from 'DSCF0370.AVI':
Duration: 00:03:51.0, start: 0.000000, bitrate: 9350 kb/s
Stream #0.0: Video: mjpeg, yuvj422p, 640x480, 30.00 fps(r)
Stream #0.1: Audio: pcm_u8, 16000 Hz, mono, 128 kb/s
So, we can pretty clearly see that it’s 640×480 MJPEG video at 30fps with 16KHz mono audio. In order to optimize for Youtube, I need to change the resolution and video codec, and possibly also encode the audio to MP3 (but it’s such a low bitrate that it’s not going to make much difference).
Here’s the command line to do that:
$ ffmpeg -i DSCF0370.AVI -b 800 -s 320x240 -vcodec mpeg4 -r 30000/1001 out.avi
To break this down quickly:
- -i denotes the input file
- -b denotes the output bitrate
- -s denotes the output size
- -vcodec sets the output codec to MPEG4. What comes out is actually a kind of DivX5 file. We could have set this FLV and got the Flash video format that Youtube actually uses, but I’m following the instructions!
- -r 30000/1001 sets the framerate to 30000/1001 = 29.97003 fps, which is the standard frame rate for NTSC video. Oddly, I couldn’t get the encode to work without this.
- I could have set the output audio to MP3 using the -acodec mp3 option, but the ffmpeg that comes as standard in the Ubuntu repositories doesn’t support it. Ya boo sucks. The default output is MP2 format – I guess I can live with that.
So – while executing that command, the salient part of ffmpeg’s output looks like this:
Output #0, avi, to 'out.avi':
Stream #0.0: Video: mpeg4, yuv420p, 320x240, q=2-31, 800 kb/s, 29.97 fps(c)
Stream #0.1: Audio: mp2, 16000 Hz, mono, 64 kb/s
… and we can check that plays OK like this:
Voila! Now you can upload right into Youtube while preserving a modicum of quality.