Archive

Archive for the ‘How-To’ Category

New FFMpeg Changes Headers Location; Breaks Stuff

May 19, 2008 Leave a comment

Recently, and it’s hard to say exactly which SVN snapshot this occured in, the FFMpeg project changed the location of a number of its header files. This has caused soem havoc with other applications that use FFmpeg for video decoding or encoding.

Amongst other things, Open Movie Editor complained that certain libraries were not installed, which they plainly were. This could be seen from running a simple “ffmpeg -i” command to see what which libraries FFmpeg had been configured again.

Trying to re-compile Open Movie Editor from source struck some problems, in that OME was looking for FFmpeg headers in the wrong place. To overcome this issue, so that OME would compile and then install correctly, I made the following changes.

The first crash will be with regards to avformat.h in the file nle_main.cxx

nle_main.cxx
and the other two files you need to make some small edits to can be
found in the “src” directory created when OME is unpacked.

There are three files you’ll need to edit in the text editor of your choice:

nle_main.cxx
VideoFileFfmpeg.H
AudioFileFfmepg.H

Open each of those files and near the beginning (around line 35) will be references that look something like this:

#include <ffmpeg/avformat.h>

You’ll need to find where avformat.h, avcodec.h and swscale.h are residing on your machine.

You can do this by using the following command:

>sudo find / avformat.h

On my machine, a build of Debian Lenny, these files can all be found in /usr/local/include

I edited the files so the code looks like this (example from VideoFileFfmpeg.H):

#include </usr/local/include/libavcodec/avcodec.h>
#include </usr/local/include/libavformat/avformat.h>
#ifdef SWSCALE
    #include </usr/local/include/libswscale/swscale.h>

Once you’ve saved those files, OME should now be able to find the FFmpeg header files and build correctly.

Hopefully a new version of Open Movie Editor will soon be available where these issues have been rectified in the source.

How-To: Alter Video Speed with FFmpeg and mjpegtools

February 6, 2008 2 comments

Unfortunately my Linux based non-linear editing tool of choice, Open Movie Editor, doesn’t currently support directly altering video playback speed. For example, if you wanted a portion of your new compilation to run at 200% of original recorded speed, it can’t be done within OME. This exact functionality was something I needed for an existing editing project.

After some thought and investigation, such changes can be achieved through using a combination of FFmpeg and yuvfps, which is part of mjpeg tools, to alter the framerate of the desired footage. If your original file is PAL based, with a framerate of 25fps, changing the framerate to 50fps will result in the video running twice as fast, for half as long.

I didn’t initially have mjpegtools installed, but on my Debian based system this was easy enough with

sudo apt-get install mjpegtools

Next, the input video needs to be converted to yuv4mpegpipe format, passed through yuvfps and output to a new avi file. Here’s the command line I used to create a clip at 50fps:

ffmpeg -i input.dv -f yuv4mpegpipe - | yuvfps -s 50:1
-r 50:1  | ffmpeg -f yuv4mpegpipe -i - -b 28800k -y output.avi

Change the 50:1 ratios to whatever framerate you require. e.g. 100:1 for 100fps. Be sure to set the output file bitrate to a relevant quality level. Omitting this flag will result in a poor quality AVI output file by default.

The resulting AVI file was easily played back with Totem, and handled on the timeline admirably by OME.

Thanks to Victor Paesa on the FFmpeg mailing list for pointing me in the right direction.

Some other options to investigate include the new Libavfilter for FFmpeg and converting the original footage to a raw data file, which will lost the audio.

How-To: Extract images from a video file using FFmpeg

February 6, 2008 5 comments

Extracting all frames from a video file is easily achieved with FFmpeg.

Here’s a simple command line that will create 25 PNG images from every second of footage in the input DV file. The images will be saved in the current directory.

ffmpeg -i input.dv -r 25 -f image2 images%05d.png

The newly created files will all start with the word “images” and be numbered consecutively, including five pre-appended zeros. e.g. images000001.png.

From a video that was 104 seconds long, for a random example, this command would create 2600 PNG files! Quite messy in the current directory, so instead use this command to save the files in a sub-directory called extracted_images:

ffmpeg -i input.dv -r 25 -f image2 extracted_images/images%05d.png

Moving on, let’s say you just wanted 25 frames from the first 1 second, then this line will work:

ffmpeg -i input.dv -r 25 -t 00:00:01 -f image2 images%05d.png

The -t flag in FFmpeg specifies the length of time to transcode. This can either be in whole seconds or hh:mm:ss format.

Making things a little more complex we can create images from all frames, beginning at the tenth second, and continuing for 5 seconds, with this line:

ffmpeg -i input.dv -r 25 -ss 00:00:10 -t 00:00:05 -f image2 images%05d.png

The -ss flag is used to denote start position, again in whole seconds or hh:mm:ss format.

Maybe extracting an image from every single frame in a video, resulting in a large number of output files, is not what you need. Here’s how to create a single indicative poster frame, of the video clip, from the first second of footage:

ffmpeg -i input.dv -r 1  -t 00:00:01 -f image2 images%05d.png

Notice that the -r flag is now set to 1.

If you want the poster frame from a different part of the clip, then specify which second to take it from using the -ss tag, in conjunction with the line above.

Lastly, if you wanted to create a thumbnail story board, showing action throughout the entire length of the video clip, you’ll need to specify the output image dimensions. Use the following line:

ffmpeg -i input.dv -r 1 -f image2 -s 120x96 images%05d.png

My original file was 720×576, so the image dimensions are a whole division of this.

Open Movie Editor How-To: Fade to Black Transition

January 31, 2008 1 comment

After my previous overview of Open Movie Editor (OME), I decided to create a small How-To regarding an easily obtainable piece of functionality that’s not yet standard within OME.

Open Movie Editor natively contains only one transition between clips – a simple cross fade. However, one of the most used transitions in video editing is a fade to black. By adding a black still image, between two clips on a single video track in OME, it is possible to generate exactly what you need.

Here’s how by following the steps below:

1. Open your favourite image editor, in this example we’ve used the GIMP.
2. Create a new image with a solid black background, at the same size as your video clips. We’ve used PAL 720×576.
3. Save the image as a PNG, although JPG will also work.
4. Switch to Open Movie Editor and navigate to your footage in the Media Browser window. We’ve previously downloaded two QuickTime clips from stock footage supplier BBC Motion Gallery, to use in this example.
5. Add the first clip to video track one.
6. Add the black still image to the same video track.
7. Add the second video clip to the same video track.
8. Now, overlap the beginning of the black still image with the end of the first clip. A blue area with a red cross through it should appear – this is the length of time that the fade will occur.
9. Adjust the length of the black still image to suit the speed of the fade to black required.
10. Now, drag the beginning of the second video clip over the end of the still image, so that another blue box and red cross appears.
11. Move the timeline marker before the first blue box and test your fade out to and in from black.

Easy! Move the clips, and adjust the length of the black still image until you are happy with the fade.

To make is even easier, we’ve created a screen cast for you to watch, complete with a couple of extra fades created in OME. Don’t adjust your volume, there is no sound.

Get Flash Player 9 to see this movie.

var so = new SWFObject(‘http://stream0.org/flash/flvplayer.swf&#8217;,’player’,’640′,’500′,’9′);
so.addVariable(‘height’,’500′);
so.addVariable(‘width’,’640′);
so.addVariable(“displayheight”,”480″);
so.addParam(“allowfullscreen”,”true”);
so.addParam(“allowscriptaccess”,”always”);
so.addVariable(“file”,”http://stream0.org/video_files/OMEfadehowto.mov&#8221;);
so.addVariable(“backcolor”,”0x000000″);
so.addVariable(“frontcolor”,”0xCCCCCC”);
so.addVariable(‘lightcolor’,’0xCC0000′);
so.addVariable(“screencolor”, “0x000000″);
so.addVariable(“shownavigation”,”true”);
so.addVariable(“autostart”, “false”);
so.addVariable(“smoothing”,”true”);
so.addVariable(“showvolume”,”false”);
so.addVariable(“shownavigation”, “false”);
so.addVariable(“overstretch”, “fit”);
so.write(‘player’);

This screen cast was created with RecordMyDesktop, edited with Open Movie Editor, and transcoded into an x264 file, using a custom Perl script to control FFmpeg.

How-To: Find and Extract Video File Details

January 22, 2008 Leave a comment

Using FFMpeg it is relatively simple to query an existing video file to find details such as video codec, audio codec, bitrates, duration and dimensions.

Use the following FFmpeg command in a terminal window:

ffmpeg -i input_file.extension

FFmpeg will just open your input file without doing anything to it. Something like this will be returned in the terminal window:

phillc@phillc-laptop:~$ ffmpeg -i 848_Termi.mov
FFmpeg version SVN-r11213, Copyright (c) 2000-2007 Fabrice Bellard, et al.
configuration: –enable-gpl –enable-pp –enable-libvorbis
–enable-libtheora –enable-liba52 –enable-libdc1394 –enable-libgsm
–enable-libmp3lame –enable-libfaad –enable-libfaac –enable-libxvid
–enable-pthreads –enable-libx264
libavutil version: 49.6.0
libavcodec version: 51.49.0
libavformat version: 52.2.0
built on Dec 13 2007 20:20:36, gcc: 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from ‘848_Termi.mov':
Duration: 00:00:51.7, start: 0.000000, bitrate: 862 kb/s
Stream #0.0(eng): Video: h264, yuv420p, 480×360 [PAR 0:1 DAR 0:1], 25.00 tb(r)
Stream #0.1(eng): Audio: mpeg4aac, 44100 Hz, stereo
Must supply at least one output file

All very interesting, but what if you want to do something more with this information, like write it to a file for use in another program, or just want a more convenient way of viewing the details without having to remember an FFmpeg command? Write a small script to do the work for you. Here’s one I created earlier in Perl…….

#!/usr/bin/perl

# Read command line input file

 
$input_file = shift;

 
# Read details of input file and display to user

 
$ffmpeg_input_details="ffmpeg -i ${input_file} 2>input_file.txt";

system($ffmpeg_input_details);

 
open(INPUTFILE,"input_file.txt");

@inputfile = <INPUTFILE>;

@input_file_video = grep (/Video:/i, @inputfile);

@input_file_audio = grep (/Audio:/i, @inputfile);
@input_file_duration = grep (/Duration:/i, @inputfile); 
 
print "Details for the file $input_file.\n";

print "It contains the following video data:\n"; 

print "@input_file_video\n";

print "It contains the following audio data:\n"; 

print "@input_file_audio\n";
print "It has a duration and bitrate of:\n"; 

print "@input_file_duration\n";

To use this script simply type the following at your command prompt:

perl scriptname.pl input_file.extension

Good luck extending this small script for your own uses.

How-To: Install FFMPEG on Ubuntu Gutsy

January 20, 2008 Leave a comment

I wanted to install FFmpeg on my Ubuntu Gutsy
Gibbon (7.10) desktop machine. This is so I can encode and transcode
video files to various formats locally, and also render projects from
the non-linear editor (NLE) PiTiVi.

This post will mainly cover just the commands I used to install FFmpeg on Gutsy, with very little commentary regarding why or how
things work. If you want a more in-depth look at installing FFmpeg, you
can read about the installation
of FFmpeg on my Debian Etch server earlier today – which ultimately
moves me closer to on-the-fly video transcoding of user submitted
content on Kapital Moto TV

Installing FFmpeg on Ubuntu Gutsy:

sudo apt-get build-dep ffmpeg

sudo apt-get install liblame-dev libfaad2-dev libfaac-dev
libxvidcore4-dev liba52-0.7.4 liba52-0.7.4-dev libx264-dev libdts-dev
checkinstall build-essential subversion

svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg

cd ffmpeg

make distclean (I used this because I already had an older SVN snapshot of FFMPEG downloaded, configured and made from last night)

./configure –enable-gpl –enable-pp
–enable-libvorbis –enable-libtheora –enable-liba52
–enable-libdc1394 –enable-libgsm –enable-libmp3lame –enable-libfaad
–enable-libfaac –enable-libxvid –enable-pthreads –enable-libx264 –enable-shared

make

sudo checkinstall

Some things you might want to do when prompted to by checkinstall:

  • Select 0 change maintainer name
  • Select 3 to set version name. I used svn11213-ubuntu-gutsy-20071213

And that’s it FFmpeg installed on Ubuntu Gutsy.

Other links:

Categories: FFmpeg, How-To, Video Tags: , , ,

How-To: Install FFmpeg on Debian Etch

January 20, 2008 8 comments

NB: This How-To is now almost totally worthless as it is so out of date. Please click here for an updated version explaining how to install FFmpeg on Debian Squeeze.

I have to say, that the video manipulation
program FFmpeg, while very powerful, is not very user-friendly when it
comes to installation. While many Linux programs can be happily
installed from either a pre-compiled package, or downloading source and
compiling yourself, this isn’t necessarily the case with FFmpeg. The
ease of FFmpeg installation largely depends on how many different video
codecs and containers you want to be able to input or output. The
greater the number, the exponential increase in installation
difficulty. My main need was for FFmpeg to accept a wide range of input
formats, while outputting H.264 encoded QuickTime (MOV) files. Here’s
how I achieved this on a Debian Etch server……..

I’m going to assume that you are familiar with using the Linux
command prompt, moving between directories, editing text files and have
at least some experience compiling programs.

The first thing I would recommend doing is making an addition to your source repository lists.

pico /etc/apt/sources.list

Add the following line:

deb http://www.debian-multimedia.org stable main

This repository contains some essential libraries for xvid and
x264 (an open source H.264 codec) amongst other things. You’ll need to
install some software from here. The software may well be available
from other repositories too, that are already in your sources.list
file, but add this one to be safe.

Next rebuild your sources:

apt-get update

I would also recommend installing checkinstall. This program can
be used instead of a regular “make install” command and produces a deb
package file that will make re-installation or multiple machine
installs much easier. If checkinstall isn’t already on your machine
download it from:

http://www.asic-linux.com.mx/~izto/checkinstall/download.php

Maybe navigate here with lynx, maybe use wget once you’ve found
the actual file you need, maybe download it with a GUI based web
browser and then copy it to your desired directory. It’s your choice. I
grabbed the latest .deb package. After the download, execute the following as root:

dpkg -i checkinstall_1.6.1-1_i386.deb

Checkinstall should have happily installed on your system. Now it’s time to really get into FFmpeg.

Build the dependencies:

apt-get build-dep ffmpeg

Next we’re going to install a whole lot more useful software
that will allow FFmpeg to output many more than just the minimal file
types.

apt-get install liblame-dev libfaad-dev libfaac-dev
libxvidcore4-dev liba52-0.7.4 liba52-0.7.4-dev libx264-dev
build-essential subversion,

We’ve also ensured that you have the necessary tools installed
to compile from source (build-essential) and obtain files from the Subversion version control repositories.

We’re ready to checkout FFmpeg itself:

svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg,

At the time of writing the latest revision was 11212. If you’d
feel more comfortable not using the lastest bleeding edge version of FFmpeg, issue the Subversion command as follows:

svn checkout -r 11212 svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg

This will ensure that you are also downloading the 11212 revision. Once downloaded, move into the ffmpeg directory (cd ffmpeg) and configure:

./configure –enable-gpl –enable-pp
–enable-libvorbis –enable-liba52 –enable-libdc1394 –enable-libgsm
–enable-libmp3lame –enable-libfaad –enable-libfaac –enable-pthreads
–enable-libx264 -enable-libxvid
–enable-shared

So, what have we done here……

The essence of his information, and many more options, can be found by typing ./configure –help first.

(You might also consider including libtheora in your configuration, but I forgot at the time)

We’re now ready to make the installation files so at the command prompt:

make

If something goes wrong, and you need to start again, a useful command to know is:

make distclean

Make sure you do this first and then run the configure command again.

A finally:

checkinstall

You will be asked a few questions, which should be
straightforward enough to answer – yes to creating the documentation,
choose a name, select D for Debian package, lastly select number 3 and
type a version name that means something to you. Mine was
svn11212-etch-20071213. Checkinstall will now create a Debian package
of FFmpeg, bespoke for your system with the configuration options
you’ve selected earlier. Checkinstall WILL NOT install the package, so
don’t forget to do that:

dpkg -i ffmpeg_svn11212-etch-20071213-1_i386.deb

With some small amount of luck, you should now have a working
version of FFmpeg installed on your Debian Etch server. You will be
able to output H.264 encoded files in a variety of containers.

Now the fun part really begins as you spend days tinkering with
commands to output the best possible files. Documentation for using
FFMPEG can be found at:

http://ffmpeg.mplayerhq.hu/ffmpeg-doc.html

Have fun!

(Credit for getting me started in the right direction goes to Paul Battley and his FFmpeg Ubuntu Feisty install how-to)

Categories: FFmpeg, How-To, Video Tags: , , ,
Follow

Get every new post delivered to your Inbox.