Halfviking get’s videos (ffmpeg, convert, flvmdi, flvplayer)

I've always wanted my online gallery export script to handle videos and last weekend, I bit the bullet and wrote it. I used quite a few Open source projects to accomplish this which means that PEAExport has a few dependencies but I think it's worth it. My Canon Ixus takes AVI movies. The sizes of the movies range from 1MB to 50MB. To upload these would just be silly and each viewer would have to have an AVI viewer, which probably wouldn't load in the browser. I really like flash movies players like those found on YouTube and Google Video so I anted to find a free one to use, I found the wonderful flvplayer @ http://www.jeroenwijering.com/. It's an excellent player and free for non-commercial use.

So at this stage, I have my Videos in AVI format and a flash video (flv) player. I need to transcode them from AVI to FLV to work with the player. In work a few weeks ago we came across the SUPER application. This is a GUI front end to FFMPEG which is an absolutely wonderful utility, It handles tens of formats and hundreds of options. I used the FFMPEG.exe bundled with SUPER to tanscode them from AVI to FLV

ffmpeg.exe -i 'video.avi' -y -ab 64 -ar 22050 -b 200 -r 25 -s 650*450 'video.flv'

The options above (full list of options):

  • -i 'video.avi'= input file is video.avi
  • -y = overwrite existing file if it exists
  • -ab 64 = audio bitrate is 64 kbit/s
  • -ar 22050 = audio sampling rate is 22050 Hz
  • -b 200 = video bitrate is 200 kbit/s
  • -r 25 = frame rate is 25Hz
  • -s 650*450 = rame size is 650 pixels by 450 pixels (WxH)
  • 'video.flv' = output file

Running this converts the hefty AVI video to a lightweight (relatively) FLV video. I then need to get the flvplayer playing this newly generated FLV.

<object data="flvplayer.swf" type="application/x-shockwave-flash">
<param value="file=video.flv&image=medium.jpg&linkfromdisplay=true&link=../14" name="flashvars" />
<param name="movie" value="flvplayer.swf?file=video.flv&image=medium.jpg&linkfromdisplay=true&link=../14" />
</object>

There are many options for the flvplayer (full list of options). I only needed a few -

  • file=video.flv = input file is video.flv
  • image=medium.jpg = the loading image before you press play is medium.jpg
  • linkfromdisplay=true = when the user clicks directly on the movie area then they will be redirected to another page
  • link=../14 = when they click on the video, they will be redirected to the relative link "../14"

This plays fine but the progressbar isn't running, This is a known limitation of FFMPEG (it's fixed in the SVN version), FFMPEG does not write the metadata like video length etc to the FLV file. To do this, I was able to use another free utility called FLVMDI

flvdmi.exe video.flv video.flv

Running this inserts all the required metadata into the FLV video. The progress Bar now works perfectly.

You'll notice that in the options for the flvplayer, I included "image=medium.jpg". I could have used any image here but I wanted to use a frame from the video. Fortunately FFMPEG can do this.

ffmpeg.exe -i 'video.avi' -y -vcodec png -vframes 1 -an -f rawvideo -s 650x450 'videoimage.png'

The options above (full list of options):

  • -i 'video.avi'= input file is video.avi
  • -y = overwrite existing file if it exists
  • -vcodec png = force video codec to png
  • -vframes 1 = set the number of video frames to one
  • -an = disable audio
  • -f rawvideo = force format to rawvideo
  • -s 650*450 = frame size is 650 pixels by 450 pixels (WxH)
  • 'videoimage.png' = output file

This results in a PNG file, quite a big one, taken from the first frame of the video. The file was too big for web use so I needed to convert it to JPEG. I could have used the Python image library PIL to do this (PEAExport already uses PIL) but I was already using some command utilities utilites to create videos and images. I thought, there's no harm in another. That other was Convert.exe from the ImageMagick Library.

convert.exe -quality 75 videoimage.png videoimage.jpg

The options above (full list of options):

  • -quality 75 = compression level set to 75%
  • videoimage.png = videoimage.png is the input file
  • videoimage.jpg = videoimage.jpg is the output file

Excellent, I now have a lightweight flv video but I want a thumbnail to display in my gallery index pages. I ran the FFMPEG fram grap command but with "-s 250x186" to reduce the size to thumbnail size. I also want to indicate that it's a video that the users is going to see and not another photo. So I need to Annotate it with the word "Video"

convert.exe -quality 75 -gravity South -font C:WINDOWSFontsGOTHICB.TTF -pointsize 50 -fill black -annotate +1+1 Video -fill white -annotate +0+0 Video videoimage.png videoimage.jpg

The options above (full list of options):

  • -quality 75 = compression level set to 75%
  • -gravity South = direction primitive gravitates to when annotating the image - In this case, we want the annotation loacted in the South of the image
  • -font C:\\WINDOWS\\Fonts\\GOTHICB.TTF = The font for the annotation. In this case I am using Century Gothic Bold
  • -pointsize 50 = The font size is set to 50 points
  • -fill black = The fill of the annotation is to be black
  • -annotate +1+1 Video = Annotate the word "Video" plus one pixel in both directions from the base position of "South"
  • -fill white = The fill of the next annotation is to be white
  • -annotate +0+0 Video = Annotate the word "Video" plus zero pixels in both directions from the base position of "South"
  • videoimage.png = videoimage.png is the input file
  • videoimage.jpg = videoimage.jpg is the output file

This creates a thumbnail image with the word "Video" in white with a black drop shadow, in Century Gothic Bold font, size 50 points.

thumbnail image with the word Video

And that my friends is it. Enjoy all my vidoes @ http://www.halfviking.com. I have also created a new page @ http://www.halfviking.com/videos using flvplayer's playlist feature. My favourite single video is Bobby very bemused as to what on earth is planted in the ground at Crosby beach north of Liverpool.

9 Comments

  1. richy smart
    Posted February 10, 2007 at 11:47 am | Permalink

    HI Nice site. Can you give me some easier instructions on how to do this .avi video conversion stuff(above), never used pearl before.
    richy

  2. ketan
    Posted March 8, 2007 at 8:51 am | Permalink

    Thanks for your code reference

  3. Posted March 24, 2007 at 5:23 am | Permalink

    wow! this is exactly what I’ve been looking for. I’ve found pieces and parts of your howto all over the place, thanks for summing it all up with an easy to read (and understand) guide. good work.

  4. don
    Posted April 3, 2007 at 8:42 am | Permalink

    Is there a way to determine the length or duration of a video file? Can ffmpeg be used to determine the video duration?

    Thanks,
    -don

  5. Posted April 3, 2007 at 9:30 am | Permalink

    Hi Don,

    The only way I can think of doing it here is to convert to flash and the run flvmdi with the “/v” argument so that the metadata is output to an xml file rather than embedded.

  6. Posted April 19, 2007 at 2:45 pm | Permalink

    For some video I can get duration by using ffmpeg, but some not. any suggesions? flvmdi is only for winxp. is there any one for linux?

    secondly after convert mov to flv, why does the flv file size is double bigger than the mov? I did something wrong? any ideas? or It should be that way.

    thanks

  7. coolguy
    Posted May 27, 2007 at 2:01 am | Permalink

    Hi pelli cui, what ffmpeg command did you use to get the movie duration?

    Thanks.

  8. sbn
    Posted June 16, 2008 at 5:48 am | Permalink

    Hi peili cui,
    I cant able to convert .mov to flv i got an unsupported codec error.which codec u installed on your system for mov to flv conversion.

    Thanks,
    sbn

  9. Adeel
    Posted October 31, 2009 at 9:48 am | Permalink

    Hi..Nice information. My question does this will be work to run video on browser like firefox.Waiting for urgent reply

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*