dvgrab / ffmpeg capture / compression
Recently I volunteered to record video for the DrupalCamp Seattle 2008. It quickly dawned on me that to record 10 hours of video, bring it home and capture it to disk and then compress it would take 30+ hours. Also, that wouldn't be anywhere close to live and they were hoping to post the video as soon as possible. Since I am only running Linux on my laptops now, I decided to see what could be accomplished via command line tools in Linux. I quickly stumbled on ffmpeg and dvgrab. DVgrab can capture raw dv from firewire and has features for detecting scenes when capturing from tape. FFMPEG can also capture directly from the firewire, but specializes in converting (transcoding) video from one format to another.
When capturing directly from firewire using ffmpeg I would get glitches every now and then.
ffmpeg -f dv -i /dev/dv1394/0 -target ntsc-svcd output.mpg
FFMpeg takes an input file (or multiple input files) and an output file.
The parameters for each come before the file.
If I tried writing raw DV from ffmpeg I would get IO errors basically stating my computer couldn't andle the throughput.
But, dvgrab worked flawlessly!
dvgrab -format raw test.dv
Since both can use pipes I tried piping dvgrab directly into ffmpeg.
dvgrab -format dv1 - | ffmpeg -f dv -i - -target ntsc-vcd test.mpg
This worked wiithout any glitches.
So the next step was to figure out which format would give me the best compression vs. quality.
To do this I wrote a perl script which allowed me to easily experiment by converting a raw dv input file to various formats.
I have attached that script called encodetest.pl below.
After experimenting, I decided to go with flv since the video was to be posted to blip.tv, and blip.tv will convert anything posted to flv accept for flv which it leaves alone.
I tried posting some short xvid samples, ad they were taking an hour or more for blip.tv to convert, so flv had the additional advantage of being available instantly.
Next I wrote a very tiny perl script to encode video using the current timestamp as the filename and added it as a command to my desktop. Now all I had to do is literally click an icon to record and compress video to the conference. I have attached this perl script as well named rec_druplicon.pl
essentially the command it produces is:
dvgrab -format dv1 - | ffmpeg -deinterlace -f dv -i - -f flv -vcodec flv -s 480x270 -aspect 16:9 -qscale 3.5 -acodec libmp3lame -ab 32k -ar 22050 timestamp.flv
So how did it turn out?
As far as the recording, it went flawlessly. I was even able to post some of the videos during the next talk. The conditions could have been better. For some talks the lighting was poor in that the ambient light in the room was too bright to see the projector. In the main theatre, I was in the far back of the room and there was no PA, so the audio is faint, but the realtime recording/encoding worked better than expected. You can view all of the recordings at http://seadug.blip.tv/posts?view=archive&nsfw=dc
Some of the benefits of realtime encoding.
1. I could change tape without interupting the hard disk recording.
2. I could stop and start which automatically created multiple files named by timestamp.
3. All of the video from 2 days of recording fit easily n a DVD.
4. Most important, no slow post capture / compression so I was done as soon as I left the conference.