Welcome to the bulix.org / pastebin. Please don't use this pastebin for illegal purposes, defamation or kitten-squashing.
This pastebin is written using PHP and MySQL and relies on Alex Gorbatchev's syntax hhighlighter (JavaScript based). To avoid spam, you will be required to complete a small mathematical challenge when adding a new paste.
#!/bin/bash
declare -a MOVIE_FRAMES
if [ -z "`echo $@`" ]; then
cat << EOF
Usage:
$0 input1.mpg input2.mpg [...]
The following environmental variables matter:
FADE_FRAMES The number of frames to fade on
each side of each splice
[DEFAULT=50]
BLACK_PICTURE_FILE The filename of your all-black
image file.
[DEFAULT="black.png"]
OUTPUT_FILE The output filename.
[DEFAULT="output.mpg"]
Caveats:
This script makes no attempt to make sure that
your input files are '.mpg', that they have the
same frame rate, that they are the same size, or any-
thing else. You *must* do this yourself. You will
need ffmpeg patched with the pip vhook filter for
this to work. You will also need to a solid still
image file with the same dimensions as your videos (see
BLACK_PICTURE_FILE above). JPG, PNG, GIF and probably
some other formats are fine. You should probably
rewrite all of this, especially the text processing on
line 57.
EOF
exit
fi
if [ -z "$BLACK_PICTURE_FILE" ]; then
BLACK_PICTURE_FILE="black.png"
fi
if [ -z "$FADE_FRAMES" ]; then
FADE_FRAMES=50
fi
if [ -z "$OUTPUT_FILE" ]; then
OUTPUT_FILE="output.mpg"
fi
COUNT=1
cat << EOF
Determining number of frames each input movie.
This could take some time. The only way to count
the frames is to read the entire file, transcoding
the video is a slow but convenient way to do this
from a shell script. It would probably be easy to
write a frame counter with libavcodec or libavfilter.
EOF
#Get the lengths and frame rates of the movies using ffmpeg
for movie in $@; do
ffmpeg -i $movie -qscale 255 temp_testlength.mpg 2> temp_testlength
MOVIE_FRAMES[$COUNT]=`echo \`cat temp_testlength | tr "\015" "\012" | grep frame= | tail -n 1 | cut -d = -f 2 | cut -d 'f' -f 1\``
rm -f temp_testlength.mpg
COUNT=$(($COUNT+1))
done
rm -f temp_testlength
COUNT=1
#Make one big movie
cat $@ > temp_movie.mpg
COUNT=1
TOTAL_FRAMES=0
#We need to build our command into a string because we don't know how many vhooks we'll need
FFMPEG_COMMAND="ffmpeg -i temp_movie.mpg "
#Insert the transitions into the ffmpeg command
for movie in $@; do
FFMPEG_COMMAND="$FFMPEG_COMMAND -vhook '/usr/lib/vhook/pip.so -f "$BLACK_PICTURE_FILE" -t FFFFFF -x 0 -y 0 -s $((${MOVIE_FRAMES[$COUNT]}+$TOTAL_FRAMES-$FADE_FRAMES)) -e $((${MOVIE_FRAMES[$COUNT]}+$TOTAL_FRAMES+$FADE_FRAMES)) -d $FADE_FRAMES -m 0' "
TOTAL_FRAMES=$(($TOTAL_FRAMES+${MOVIE_FRAMES[$COUNT]}))
done
FFMPEG_COMMAND="$FFMPEG_COMMAND -sameq \"$OUTPUT_FILE\""
echo Here\'s the command we\'re running:
echo
echo $FFMPEG_COMMAND
echo
echo
#Run the command!
bash -c "$FFMPEG_COMMAND"
if [ "$?" -eq 0 ]; then
echo
echo Success! Output file is: $OUTPUT_FILE
echo
else
echo
echo Failure. ffmpeg could not create video.
echo
fi
rm -f temp_movie.mpg
Powered by the Bulix.org Code Pastebin, by Maxime Petazzoni. View pastebin statistics.