[MPlayer-users] Using ffmpeg or mencoder to edit files with a edit list

houghi houghi at houghi.org
Sat Jul 13 17:51:29 CEST 2013


On Sat, Jul 13, 2013 at 07:03:40AM -0700, James Board wrote:
> My input file is in a raw frame-by-frame format: there's no MPEG
> encoding or groups of pictures.  Each frame is stored by itself.  I'd
> like to do frame-exact editing on the file.  For example: remove
> commercials in an hour long show.

OK, so for frame 1 - 10.000 you only want to show e.g. 1 -5.000 and
5.500 - 8.000  and then 8.500 to 10.000 (Yeah 10.000 is made up)
Or just show 0:00:00 to 0:15:00 and 0:20:00 to 0:40:00 and then 0:45:00 to
1:00:00 ?

> I have an edit list, which is a text file.  It consists of a list of start and
> end frame for each sequence of frames of the input file that I would
> like to include in the output file.  Alternatively, I could generate a list 
> 
> of sequences that I would like to delete from the output file.

OK, so you have frames.

> This seems like a simple thing to do, but I'm not sure if it's common 
> 
> enough for it to have been coded into ffmpeg.  Is there a way, with
> ffmpeg or mencoder, to somehow produce the output file with only
> the desired sequences?  I didn't see this is in the documentation, but 
> 
> then I only searched on 'edit' and didn't find what I wanted.

When you have frames and the frames per second, you can calculate the
time. e.g. mplayer -ss 600 -endpos 1300
That you can output to a file and then join the different files.
Same goes with ffmpeg:
ffmpeg -i in.mp4 -ss [start] -t [duration]

Yet another method could be melt. Melt works with frames, so with the
first example you would get:
melt file.raw in=1 out=5000 \
	file.raw in=5500 out=8000 \
	file.raw in=8500 out=10000

Adding -consumer and other things will see to the output.

melt is more precise, because it is per frame. It is also much, much
slower.

What I do is something similar. Instead of doing a timelapse for a
roadtrip (1 frame per X time) I take 1 second per X time. Part one of the
script looks like this:
for I in `seq 0 60 3600` #3600 is 1 hour
do
	MIN=$(printf %06d $I)
	mencoder -ss $MIN -endpos 60 -nosound -noskip \
	-mc 0 -ovc copy movie.mp4 -o movie.$MIN.mp4
done

The second part looks like:
FILES=$(ls -1 $DIR/out.*.mp4|sort)
mencoder -really-quiet -nosound -noskip -mc 0 -ovc copy -o seconds.mp4 $FILES

Hopefully this is enough to get you going.

houghi
-- 
"Other than the fact Linux has a cool name, could someone explain why I should
use Linux over BSD? No. That's it. The cool name, that is. We worked very hard
on creating a name that would appeal to the majority of people, and it
certainly paid off [...]                                     -- Linus Torvalds


More information about the MPlayer-users mailing list