wiki:Smooth-Streaming-Encoding-FFmpeg

Encoding Smooth Streaming videos

back


Encoding Smooth Streaming with FFmpeg

Assuming Oceans.mov is our input file at 1280x536 and we want to encode it in 8 bitrates/resolutions.

AUDIO_NONE=-an
AUDIO_OPTIONS=-acodec libfaac -ac 2 -ab 64k
VIDEO_OPTIONS=-g 100 -keyint_min 50 -flags2 -mbtree
VIDEO_PASS1=-vcodec libx264 -vpre veryfast_firstpass $(VIDEO_OPTIONS)
VIDEO_PASS2=-vcodec libx264 -vpre veryfast $(VIDEO_OPTIONS)

# iPhone compatible streams
VIDEO_PASS1 += -vpre baseline
VIDEO_PASS2 += -vpre baseline

ffmpeg -y -i $(INPUTFILE) $(AUDIO_NONE) $(VIDEO_PASS1) -pass 1 -b 230k -s 224x92 oceans-230k.mp4
ffmpeg -y -i $(INPUTFILE) $(AUDIO_NONE) $(VIDEO_PASS2) -pass 2 -b 230k -s 224x92 oceans-230k.mp4
ffmpeg -y -i $(INPUTFILE) $(AUDIO_NONE) $(VIDEO_PASS2) -pass 2 -b 331k -s 288x120 oceans-331k.mp4
ffmpeg -y -i $(INPUTFILE) $(AUDIO_NONE) $(VIDEO_PASS2) -pass 2 -b 477k -s 368x152 oceans-477k.mp4
ffmpeg -y -i $(INPUTFILE) $(AUDIO_NONE) $(VIDEO_PASS2) -pass 2 -b 688k -s 448x188 oceans-688k.mp4
ffmpeg -y -i $(INPUTFILE) $(AUDIO_NONE) $(VIDEO_PASS2) -pass 2 -b 991k -s 592x248 oceans-991k.mp4
ffmpeg -y -i $(INPUTFILE) $(AUDIO_NONE) $(VIDEO_PASS2) -pass 2 -b 1427k -s 768x320 oceans-1427k.mp4
ffmpeg -y -i $(INPUTFILE) $(AUDIO_NONE) $(VIDEO_PASS2) -pass 2 -b 2056k -s 992x412 oceans-2056k.mp4
ffmpeg -y -i $(INPUTFILE) $(AUDIO_OPTIONS) $(VIDEO_PASS2) -pass 2 -b 2962k -s 1280x536 oceans-2962k.mp4

After the encoding is finished, we have to process the file with the commandline tool mp4split. Assuming that the encoded file is stored in 't:\tmp' and our webserver's document root is at 'c:\inetpub\wwwroot'.

Create a directory in the document root:

cd c:\inetpub\wwwroot
mkdir oceans.ism
cd oceans.ism
mp4split -o oceans-230k.ismv t:/tmp/oceans-230k.mp4
mp4split -o oceans-331k.ismv t:/tmp/oceans-331k.mp4
mp4split -o oceans-477k.ismv t:/tmp/oceans-477k.mp4
mp4split -o oceans-688k.ismv t:/tmp/oceans-688k.mp4
mp4split -o oceans-991k.ismv t:/tmp/oceans-991k.mp4
mp4split -o oceans-1427k.ismv t:/tmp/oceans-1427k.mp4
mp4split -o oceans-2056k.ismv t:/tmp/oceans-2056k.mp4
mp4split -o oceans-2962k.ismv t:/tmp/oceans-2962k.mp4

Create the server manifest file used by the Smooth Streaming module:

mp4split -o oceans.ism oceans-230k.ismv oceans-331k.ismv oceans-477k.ismv oceans-688k.ismv oceans-991k.ismv oceans-1427k.ismv oceans-2056k.ismv oceans-2962k.ismv

Create the client manifest file used by the Silverlight and Flash player:

mp4split -o oceans.ismc oceans-230k.ismv oceans-331k.ismv oceans-477k.ismv oceans-688k.ismv oceans-991k.ismv oceans-1427k.ismv oceans-2056k.ismv oceans-2962k.ismv

Create the iPhone playlist:

mp4split -o oceans.m3u8 oceans-230k.ismv oceans-331k.ismv oceans-477k.ismv oceans-688k.ismv oceans-991k.ismv oceans-1427k.ismv oceans-2056k.ismv oceans-2962k.ismv

An example bash script

#!/bin/sh
INPUTFILE=$1
OUTPUTFILE=$2
AUDIO_NONE="-an"
AUDIO_OPTIONS="-acodec libfaac -ac 2 -ab 64k"
VIDEO_OPTIONS="-g 100 -keyint_min 50 -flags2 -mbtree"
VIDEO_PASS1="-vcodec libx264 -vpre veryfast_firstpass ${VIDEO_OPTIONS}"
VIDEO_PASS2=-"vcodec libx264 -vpre veryfast ${VIDEO_OPTIONS}"

# iPhone compatible streams
VIDEO_PASS1="$VIDEO_PASS1 -vpre baseline"
VIDEO_PASS2="$VIDEO_PASS2 -vpre baseline"

echo $INPUTFILE $OUTPUTFILE $AUDIO_NONE $VIDEO_PASS1

ffmpeg -y -i $INPUTFILE $AUDIO_NONE $VIDEO_PASS1 -pass 1 -b 230k -s 224x92 $OUTPUTFILE-230k.mp4
ffmpeg -y -i $INPUTFILE $AUDIO_NONE $VIDEO_PASS2 -pass 2 -b 230k -s 224x92 $OUTPUTFILE-230k.mp4
ffmpeg -y -i $INPUTFILE $AUDIO_NONE $VIDEO_PASS2 -pass 2 -b 331k -s 288x120 $OUTPUTFILE-331k.mp4
ffmpeg -y -i $INPUTFILE $AUDIO_NONE $VIDEO_PASS2 -pass 2 -b 477k -s 368x152 $OUTPUTFILE-477k.mp4
ffmpeg -y -i $INPUTFILE $AUDIO_NONE $VIDEO_PASS2 -pass 2 -b 688k -s 448x188 $OUTPUTFILE-688k.mp4
ffmpeg -y -i $INPUTFILE $AUDIO_NONE $VIDEO_PASS2 -pass 2 -b 991k -s 592x248 $OUTPUTFILE-991k.mp4
ffmpeg -y -i $INPUTFILE $AUDIO_NONE $VIDEO_PASS2 -pass 2 -b 1427k -s 768x320 $OUTPUTFILE-1427k.mp4
ffmpeg -y -i $INPUTFILE $AUDIO_NONE $VIDEO_PASS2 -pass 2 -b 2056k -s 992x412 $OUTPUTFILE-2056k.mp4
ffmpeg -y -i $INPUTFILE $AUDIO_OPTIONS $VIDEO_PASS2 -pass 2 -b 2962k -s 1280x536 $OUTPUTFILE-2962k.mp4

mp4split -o $OUTPUTFILE-230k.ismv $OUTPUTFILE-230k.mp4
mp4split -o $OUTPUTFILE-331k.ismv $OUTPUTFILE-331k.mp4
mp4split -o $OUTPUTFILE-477k.ismv $OUTPUTFILE-477k.mp4
mp4split -o $OUTPUTFILE-688k.ismv $OUTPUTFILE-688k.mp4
mp4split -o $OUTPUTFILE-991k.ismv $OUTPUTFILE-991k.mp4
mp4split -o $OUTPUTFILE-1427k.ismv $OUTPUTFILE-1427k.mp4
mp4split -o $OUTPUTFILE-2056k.ismv $OUTPUTFILE-2056k.mp4
mp4split -o $OUTPUTFILE-2962k.ismv $OUTPUTFILE-2962k.mp4

mp4split -o $OUTPUTFILE.ism $OUTPUTFILE-230k.ismv $OUTPUTFILE-331k.ismv $OUTPUTFILE-477k.ismv $OUTPUTFILE-688k.ismv $OUTPUTFILE-991k.ismv $OUTPUTFILE-1427k.ismv $OUTPUTFILE-2056k.ismv $OUTPUTFILE-2962k.ismv
mp4split -o $OUTPUTFILE.ismc $OUTPUTFILE-230k.ismv $OUTPUTFILE-331k.ismv $OUTPUTFILE-477k.ismv $OUTPUTFILE-688k.ismv $OUTPUTFILE-991k.ismv $OUTPUTFILE-1427k.ismv $OUTPUTFILE-2056k.ismv $OUTPUTFILE-2962k.ismv
mp4split -o $OUTPUTFILE.m3u8 $OUTPUTFILE-230k.ismv $OUTPUTFILE-331k.ismv $OUTPUTFILE-477k.ismv $OUTPUTFILE-688k.ismv $OUTPUTFILE-991k.ismv $OUTPUTFILE-1427k.ismv $OUTPUTFILE-2056k.ismv $OUTPUTFILE-2962k.ismv

Information & Questions

If you have any questions, feel free to write us a private mail.