Encoding Smooth Streaming videos
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.
