FFMPEG is the jack of all trades utility for both audio and video files. You can record, convert, and even live stream an audio or video file in just about any file format. In this example, I will be sending a RTMP stream of a MP4 file to a Wowza streaming server. I can easily send the same stream to YouTube, Facebook or any streaming server that accepts a RTMP source. In this example, I created simple Bash script called play.sh, with all the options needed to live stream to Wowza Streaming server.

Here are the options in play.sh.

ffmpeg -re -i $1 -acodec libmp3lame -ar 44100 -b:a 128k \
-pix_fmt yuv420p -profile:v baseline -s 1280x720 -bufsize 6000k \
-vb 1200k -maxrate 1500k -deinterlace -vcodec libx264           \
-preset veryfast -g 30 -r 30 -f flv                            \
-flvflags no_duration_filesize                                 \

To launch, run the script.

bash play.sh filename.mp4


A couple of personal statistics scripts.

# create stats. can be run from cron.
# fix. must supply date.
/var/www/statsmaker/fix.sh 190201

Parsing Wowza Logs

I’ve been wanting to look at Wowza logs for a very long time. I just spent a couple of hours writing a Bash script that generates a stats report. It parses the Wowza log file for the IP addresses, and runs them and against a site called ipinfo.io to get the viewer’s geo location. The output is filtered, sorted, takes a count, and finally generates a webpage. Here’s the Bash script.

# Can be placed in cron to run.
create-wowza-report.sh wowzastreamingengine_access.log
# check for missing argument
if [ -z "$1" ]
    echo "No arguments supplied. Format: create-wowza-report.sh wowzastreamingengine_access.log"
    exit 1
# get the ips from the wowza log file
awk '{print $17}' $1 > output1.txt
# exclude invalid ips 
grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' output1.txt > output2.txt
# sort unique ips
cat output2.txt | sort -u | uniq > ips.txt
# pause for 1s
sleep 1s
# empty file just in case
> output3.txt
# set filename
# read filename and get geo info
while read -r ipaddress; do
  curl ipinfo.io/"$ipaddress" 2>/dev/null | awk -F'"' '$2=="city"{printf("%s, ", $4)}$2=="region"{print $4}' >> output3.txt
done < "$filename"
# cleanup empty geo locations
grep -v '^,' output3.txt > output4.txt
# sort output alphabetically
cat output4.txt | sort > output5.txt
# get a count of connections
count=$(wc -l < output5.txt)
# get today's date
filename=$(date +%Y%m%d)
date=`date +'%A %B %d, %Y'`
# rename file
mv output5.txt $filename.txt
# generate web page
cat <<EOF > $filename.php
<title>Wowza Streaming Stats on $date</title>
<h1>Live Streaming Stats</h1>
<p>Number of connections on $date: $count</p>
<?php include('$filename.txt');?>
# move files to web directory
cp $filename.* /var/www/html
# cleanup files
rm output*.txt
rm ips.txt