<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Diego's Rants &#187; aacPlus</title>
	<atom:link href="http://blog.massanti.com/tag/aacplus/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.massanti.com</link>
	<description>Confessions from a Geek</description>
	<lastBuildDate>Wed, 27 Oct 2010 11:22:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>Updated HE-AAC (aacPlus) reference encoder for Mac OS X</title>
		<link>http://blog.massanti.com/2009/12/07/updated-he-aac-aacplus-reference-encoder-for-mac-os-x/</link>
		<comments>http://blog.massanti.com/2009/12/07/updated-he-aac-aacplus-reference-encoder-for-mac-os-x/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 00:10:55 +0000</pubDate>
		<dc:creator>Diego Massanti</dc:creator>
				<category><![CDATA[Apple / Macintosh]]></category>
		<category><![CDATA[Audio Tech]]></category>
		<category><![CDATA[Computers & Tech]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[aac]]></category>
		<category><![CDATA[aacPlus]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[encoding]]></category>

		<guid isPermaLink="false">http://blog.massanti.com/?p=1038</guid>
		<description><![CDATA[This is an updated build of the 3GPP group AAC Plus (or HE-AAC) reference audio encoder for Mac OS X 10.5 &#8220;Leopard&#8221; or newer. You can get the binary build (3 way universal binary with PowerPC, i386 and x86_64 architectures) here: enhAacPlusEnc for Mac OS X Leopard, Binary build with 3 architectures. Xcode project (3.2 [...]]]></description>
			<content:encoded><![CDATA[<p>This is an updated build of the 3GPP group AAC Plus (or HE-AAC) reference audio encoder for Mac OS X 10.5 &#8220;Leopard&#8221; or newer.</p>
<p>You can get the binary build (3 way universal binary with PowerPC, i386 and x86_64 architectures) here:</p>
<p><a href="http://blog.massanti.com/wp-content/uploads/2009/12/enhAacPlusEnc.zip">enhAacPlusEnc for Mac OS X Leopard, Binary build with 3 architectures.</a></p>
<p>Xcode project (3.2 or newer) can be downloaded here:</p>
<p><a href="http://blog.massanti.com/wp-content/uploads/2009/12/enhAacPlusEnc1.zip">enhAacPlusEnc Xcode project (3.2 or newer)</a></p>
<p>For more info visit the original post <a href="/2007/09/30/he-aac-plus-encoder-mac-universal-binary/">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.massanti.com/2009/12/07/updated-he-aac-aacplus-reference-encoder-for-mac-os-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MKMP4: An automated H264 / HE-AAC (aacPlus) encoder script for Mac and Linux / Unix</title>
		<link>http://blog.massanti.com/2008/09/26/mkmp4-automated-h264-aacplus-encoder-script-mac-linux/</link>
		<comments>http://blog.massanti.com/2008/09/26/mkmp4-automated-h264-aacplus-encoder-script-mac-linux/#comments</comments>
		<pubDate>Fri, 26 Sep 2008 23:43:30 +0000</pubDate>
		<dc:creator>Diego Massanti</dc:creator>
				<category><![CDATA[Computers & Tech]]></category>
		<category><![CDATA[Video Encoding]]></category>
		<category><![CDATA[aacPlus]]></category>
		<category><![CDATA[encoding]]></category>
		<category><![CDATA[h264]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://blog.massanti.com/?p=562</guid>
		<description><![CDATA[I have been nothing but amazed about the feedback that i got on my prior tutorials on how to automate the whole chain of free and open source tools to create amazing quality video at really low bitrates (great for flash streaming, etcetera). I usually write such tools and scripts for myself or for clients, [...]]]></description>
			<content:encoded><![CDATA[<p>I have been nothing but amazed about the feedback that i got on my prior tutorials on how to automate the whole chain of free and open source tools to create amazing quality video at really low bitrates (great for flash streaming, etcetera).</p>
<p>I usually write such tools and scripts for myself or for clients, but due to the fact that it seems a lot of people is interested in the process, I&#8217;m releasing here the new version of my encoding tools for the Mac and any Linux / Unix variant.</p>
<h3>Needed tools and applications</h3>
<p>For all this to work, you will need the following things</p>
<ul>
<li>The latest GIT version of the one and only <a href="http://www.videolan.org/developers/x264.html">x264 encoder</a>.</li>
<li>The latest SVN version of <a href="http://www.mplayerhq.hu/design7/dload.html">mplayer</a></li>
<li>The latest version of the <a href="http://gpac.sourceforge.net/home_download.php">GPAC utilities</a></li>
<li>My build of the <a href="http://blog.massanti.com/wp-content/uploads/2008/09/aacplusencoder.zip">3GPP HE-AAC encoder</a> if you are on a Mac, or the <a href="http://www.nero.com/enu/nero-aac-codec.html">Nero Digital Audio Encoder</a> if you are on unix / linux.</li>
</ul>
<blockquote class="mac">
<h3>Extra pre-requisites for Mac OS X</h3>
<p>Mac OS X users need to install the <a title="Mac Developer's Center" href="http://developer.apple.com/mac/">Apple Developer Tools (aka XCode)</a> in order to compile software, also, for building the x264 encoder, you will need to get and install <a href="http://www.tortall.net/projects/yasm/wiki/Download">YASM</a>.</p></blockquote>
<p>Now, you have to build and install all the tools, AND they have to be on any directory in your executable path. M<strong>y scripts assume that all the tools are in your executable path</strong>.<br />
<span id="more-562"></span></p>
<h2>Building x264</h2>
<p>Building x264 is usually a matter of just typing:</p>
<pre>./configure</pre>
<p>in the source directory, and then the usual:</p>
<pre>make</pre>
<p>and</p>
<pre>make install</pre>
<p>If you happen to have any problem with the building process, usually a simple google search with the error string is all you need.</p>
<h2>Building mplayer</h2>
<p>The process of building mplayer is certainly similar, BUT if you plan to use the video thumbnail and poster frame generation on my scripts, you will have to get and compile the jpeg libraries (if you don&#8217;t have them already) BEFORE building mplayer, this should be also a really easy thing to do: go get the libjpeg sources from <a href="http://www.ijg.org/">HERE</a>, and then configure, build and install.</p>
<p>Now, you have to download the latest SVN version of mplayer, assuming that you have the subversion client enabled, you can get the whole source tree by typing:</p>
<pre>svn checkout svn://svn.mplayerhq.hu/mplayer/trunk mplayer</pre>
<p>Now, you need to enable some things at configure time for mplayer and mencoder to work nice with the scripts, so our configure line will look something like this</p>
<pre>./configure --disable-gui --enable-png --enable-jpeg</pre>
<p>Note: there should be no reason at all for the &#8211;enable-jpeg flag, but for some reason that I ignore, mplayer wont detect my libjpeg install if i don&#8217;t force it like that, also, the &#8211;disable-gui option is to save some compile time, since we don&#8217;t plan to use any of the GUI features on mplayer.</p>
<p>Now, its time to build, so type:</p>
<pre>make</pre>
<p>and then, if you get no errors, you are safe to type:</p>
<pre>make install</pre>
<p>At this point you should have a working install, but since we want to be 100% sure that you REALLY have a working install, in any terminal type this:</p>
<pre>mencoder -ovc help</pre>
<p>and you should get something like this (please notice the x264 part, that is fundamental for everything to work)</p>
<pre>Available codecs:

   copy     - frame copy, without re-encoding. Doesn't work with filters.
   frameno  - special audio-only file for 3-pass encoding, see DOCS.
   raw      - uncompressed video. Use fourcc option to set format explicitly.
   lavc     - libavcodec codecs - best quality!
   vfw      - VfW DLLs, read DOCS/HTML/en/encoding-guide.html.
   qtvideo  - QuickTime DLLs, currently only SVQ1/3 are supported.
   x264     - H.264 encoding</pre>
<p>now let&#8217;s verify the mplayer part, again, in any terminal type:</p>
<pre class="pre_terminal">mplayer -vo help</pre>
<p>and you should get something like this (here, notice the PNG and JPEG bits, this is fundamental if you plan to use the thumbnail and poster generation features).</p>
<pre>Available video output drivers:
	macosx	Mac OSX Core Video
	quartz	Mac OSX (Quartz)
	xv	X11/Xv
	x11	X11 ( XImage/Shm )
	xover	General X11 driver for overlay capable video output drivers
	gl	X11 (OpenGL)
	gl2	X11 (OpenGL) - multiple textures version
	null	Null video output
	mpegpes	MPEG-PES file
	yuv4mpeg	yuv4mpeg output for mjpegtools
	png	PNG file
	jpeg	JPEG file
	tga	Targa output
	pnm	PPM/PGM/PGMYUV file
	md5sum	md5sum of each frame</pre>
<blockquote class="warning">
<h3>Very Important!</h3>
<p>After you compile and install mplayer, <strong>you need to copy</strong><strong> the midentify.sh script into any directory inside your executable path</strong>, for example <em>/usr/local/bin</em>. <strong>This is mandatory</strong>, because the <em>MKMP4</em> script will <strong>NOT</strong> be able to correctly identify the source video files without this tool. The <em><strong>midentify</strong></em> script (called <em>midentify.sh</em>) is located inside the <strong>TOOLS</strong> directory in the mplayer source tree.</p></blockquote>
<p>At this point, almost everything is ready, now it is time for the next step.</p>
<h2>Building and configuring the GPAC utilities</h2>
<p>If you are on Linux / Unix, building the GPAC utilities is a really simple process.</p>
<p>Get the latest stable release from <a href="http://gpac.sourceforge.net/home_download.php">here</a>, and then do the usual ./configure, make and make install.</p>
<blockquote class="mac"><p>For Mac OS users there is an extra step that you have to do if you want to be able to build and install the GPAC utilities without headaches, and it involves the editing of a source file in the package.</p>
<p>So, after you have downloaded the sources, open the file <strong>src/utils/os_net.c</strong> , line <strong>78</strong> reads:</p>
<pre>#ifndef __DARWIN__</pre>
<p>right <strong>AFTER</strong> it, add the following:</p>
<pre>typedef unsigned long u_long;</pre>
<p>save the file, and you can now configure, build and install the GPAC utilities (MP4Box) on Mac OS without any problem.</p></blockquote>
<h2>Installing the HE-AAC (aacPlus) audio encoder.</h2>
<p>This is a pretty simple step, if you are on a Mac, <a title="Download the AacPlus Encoder for Mac OS" href="http://blog.massanti.com/wp-content/uploads/2008/09/aacplusencoder.zip">get this encoder that i have built myself from the 3GPP sources</a> and copy it to <strong>/usr/local/bin</strong>, and if you are on linux, get the <a href="http://www.nero.com/enu/nero-aac-codec.html">Nero Digital Audio Encoder</a> from <a href="http://www.nero.com/enu/down-ndaudio.html">HERE</a> and again, copy it to <strong>/usr/local/bin</strong>. You can actually move the encoders to any directory that IS inside your executable path, /usr/local/bin is a good choice though <img src='http://blog.massanti.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<h2>Putting it all togheter.</h2>
<p>At this point, you have pretty much everything you would need to encode amazing quality H264 video and aacPlus audio, the only one remaining thing is some tool to put all this togheter in an *easy to use* way, so i have created the following bash script which pretty much simplifies the whole process.</p>
<pre class="brush: bash; title: ;">#! /bin/bash

# This bash script has been created by Diego Massanti
# www.massanti.com
#
# set -x # uncomment this for debugging
shopt -s nullglob # so the glob expands to nothing when there are no .mov files.

# User settings:

fileext=&quot;.mov&quot; # Set this variable to the video file extension that you want to search for when encoding whole directories.

# End user settings
# You should not change anything below this line unless you know what you are doing.

usage()
{
cat &lt;&lt; EOF
usage: $0 -f  [-w ] -b  [-q][-k][-t][-o ]

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* h264 video with he-aac audio encoding script by Diego Massanti. *
*                September 2008, Made in Argentina.               *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

OPTIONS:
   	-h	Show this message
-f	Path to the file to encode &lt; REQUIRED
   	-w	Resize video to fit inside this width while keeping the aspect ratio &lt; OPTIONAL
   	-b	Desired video bitrate &lt; REQUIRED
-o	Output directory for compressed media &lt; OPTIONAL (will use same as source if ommited)
   	-q 	Better quality encoding using 2 passes (slower) &lt; OPTIONAL
-k	Do not delete (keep) temporary files &lt; OPTIONAL
EOF
}
audiobitrate=48000
platform=&quot;&quot;
uname=`uname`
if [ $uname == &quot;Darwin&quot; ]; then
## 99% of chances that this is a Mac
platform=&quot;Mac&quot;
else
platform=&quot;Linux&quot;
fi

width=&quot;&quot;
bitrate=
deltemp=TRUE
quality=FALSE
poster=FALSE
filename=&quot;&quot;
rsize=&quot;&quot;
outdir=`pwd`
outFileName=&quot;&quot;
itemVideoBitrate=&quot;&quot;

while getopts &quot;:f:w:o:b:qktv&quot; OPTION; do
case $OPTION in
w ) width=$OPTARG;;
f ) filename=$OPTARG;;
b ) bitrate=$OPTARG;;
k ) deltemp=FALSE;;
q ) quality=TRUE;;
t ) poster=TRUE;;
o ) outdir=`cd &quot;$OPTARG&quot;; pwd`;;
h ) usage;;
\? ) usage
exit 1;;
* ) echo $usage
exit 1;;
esac
done

if [ &quot;$1&quot; == &quot;&quot; ]; then
usage
exit 0
fi

if [ &quot;$filename&quot; == &quot;&quot; ]; then
echo
echo you MUST supply a file to encode!, use the -f parameter. i.e: -f mymovie.avi
echo
usage
exit 1
fi
if [ &quot;$bitrate&quot; == &quot;&quot; ]; then
echo
echo you MUST specify a target bitrate!, use the -b parameter. i.e: -b 512
echo
usage
exit 1
fi

if [ &quot;$width&quot; != &quot;&quot; ]; then
rsize=&quot;-vf scale=$width:-3&quot;
rsizemsg=&quot;fit into $width pixels wide&quot;
else
rsize=&quot;&quot;
rsizemsg=&quot;Movie is not being resized.&quot;
fi

# Check if output directory exists
if [ -d &quot;$outdir&quot; ]; then
echo &quot;Target directory set to: $outdir&quot;

else
echo &quot;Error: '$outdir' does not exist!!&quot;
echo &quot;Can not continue, please make sure that the specified output directory exists. Exiting...&quot;
exit 1
fi

# Start the magic...

showMessage() {
echo &quot;MKMP4 : &quot;$1&quot;&quot;
}

initialize() {
if [ -d &quot;$filename&quot; ]; then
$filename = `cd $filename; pwd`
showMessage &quot;Output directory set to: $outdir.&quot;
showMessage &quot;Triggering the encoder with all media files in directory: $filename.&quot;
for file in &quot;$filename&quot;*$fileext; do
if [ -f &quot;$file&quot; ]; then
showMessage &quot;Will encode file: $file&quot;
startEncoders &quot;$file&quot;

fi
done
elif [ -f &quot;$filename&quot; ]; then
showMessage &quot;Triggering the encoder with source media: $filename.&quot;
startEncoders &quot;$filename&quot;

else
# input is no file and no directory ? WTF ?
echo &quot;Something really weird has happened here: $filename is not valid, exiting...&quot;
exit 1
fi
}

startEncoders() {
firstPass &quot;$1&quot;
if [ &quot;$quality&quot; == &quot;TRUE&quot; ]; then
secondPass &quot;$1&quot;
fi
extractAudio &quot;$1&quot;
encodeAAC &quot;$1&quot;
mux &quot;$1&quot;
if [ $poster == &quot;TRUE&quot; ]; then
createThumbnail &quot;$1&quot;
fi
if [ $deltemp == &quot;TRUE&quot; ]; then
cleanTemporaryFiles &quot;$1&quot;
fi
}
firstPass() {
local iFile=&quot;${1##*/}&quot;	# remove directory and keep only file name.
# First, lets get some basical information about this file, as FPS.
MOVIE_FPS=`midentify &quot;$1&quot; | grep FPS | cut -d = -f 2`
# Lets print some info to stdout.
showMessage &quot;Encoding: $1&quot;
showMessage &quot;Resizing to: $rsizemsg.&quot;
showMessage &quot;Total Bitrate: $bitrate kbps.&quot;
let &quot;caudiobitrate = $audiobitrate / 1000&quot;
let &quot;itemVideoBitrate = $bitrate - $caudiobitrate&quot;
showMessage &quot;Video Bitrate: $itemVideoBitrate kbps.&quot;
showMessage &quot;Audio Bitrate: $caudiobitrate kbps.&quot;
showMessage &quot;Platform: $platform.&quot;
# Lets start the encoding for the first pass.
showMessage &quot;Starting video encoding pass 1...&quot;
mencoder &quot;$1&quot; -o &quot;$outdir/${iFile%%.*}_temp.264&quot; -passlogfile &quot;$outdir/${iFile%%.*}&quot;_temp.log $rsize -ovc x264 -x264encopts bitrate=$itemVideoBitrate:frameref=8:bframes=3:b_adapt:b_pyramid:weight_b:partitions=all:8x8dct:me=umh:subq=6:trellis=2:brdo:threads=auto:pass=1:analyse=all -of rawvideo -nosound

}

secondPass() {
local iFile=&quot;${1##*/}&quot;	# remove directory and keep only file name.
showMessage &quot;Starting video encoding pass 2...&quot;
mencoder &quot;$1&quot; -o &quot;$outdir/${iFile%%.*}_temp.264&quot; -passlogfile &quot;$outdir/${iFile%%.*}&quot;_temp.log $rsize -ovc x264 -x264encopts bitrate=$itemVideoBitrate:frameref=8:bframes=3:b_adapt:b_pyramid:weight_b:partitions=all:8x8dct:me=umh:subq=6:trellis=2:brdo:threads=auto:pass=2:analyse=all -of rawvideo -nosound
}

extractAudio() {
local iFile=&quot;${1##*/}&quot;	# remove directory and keep only file name.
showMessage &quot;Extracting Audio...&quot;
mplayer &quot;$1&quot; -af resample=48000:0:2,channels=2,volnorm=1:0.25,format=s16le -ao pcm:file=&quot;$outdir/${iFile%.*}_temp.wav&quot; -vc dummy -vo null
}

encodeAAC() {
local iFile=&quot;${1##*/}&quot;	# remove directory and keep only file name.
if [ &quot;$platform&quot; == &quot;Mac&quot; ]; then
enhAacPlusEnc &quot;$outdir/${iFile%.*}_temp.wav&quot; &quot;$outdir/${iFile%.*}_temp.aac&quot; $audiobitrate s
else
neroAacEnc -br 48000 -he -if $outdir/${iFile%.*}_temp.wav -of $outdir/${iFile%.*}_temp.mp4
fi
}

mux() {
local iFile=&quot;${1##*/}&quot;	# remove directory and keep only file name.
MP4Box -add &quot;$outdir/${iFile%.*}_temp.264#video:fps=$MOVIE_FPS&quot; &quot;$outdir/${iFile%.*}.m4v&quot;
if [ &quot;$platform&quot; == &quot;Mac&quot; ]; then
MP4Box -add &quot;$outdir/${iFile%.*}_temp.aac&quot; -sbr &quot;$outdir/${iFile%.*}.m4v&quot;
else
MP4Box -add &quot;$outdir/${iFile%.*}_temp.mp4#audio&quot; &quot;$outdir/${iFile%.*}.m4v&quot;
fi
name=$outdir/${iFile%.*}
album=&quot;The Mac Video Archive&quot;
author=&quot;Apple Computer // massanti.com&quot;
comment=&quot;Professionally encoded by Diego Massanti&quot;
created=&quot;2007&quot;
MP4Box -inter 500 -itags album=&quot;$album&quot;:artist=&quot;$author&quot;:comment=&quot;$comment&quot;:created=&quot;$created&quot;:name=&quot;$name&quot; -lang English &quot;$outdir/${iFile%.*}&quot;.m4v
}

createThumbnail() {
local iFile=&quot;${1##*/}&quot;	# remove directory and keep only file name.
mplayer &quot;$1&quot; -ss 10 -nosound $rsize -ssf lgb=1.0 -sws 7 -vo jpeg:outdir=$outdir -frames 1
mv &quot;$outdir/00000001.jpg&quot; &quot;$outdir/${iFile%.*}.jpg&quot;
mplayer &quot;$1&quot; -ss 10 -nosound -vf scale=150:-3 -ssf lgb=1.0 -sws 7 -vo jpeg:outdir=$outdir -frames 1
mv &quot;$outdir/00000001.jpg&quot; &quot;$outdir/${iFile%.*}_small.jpg&quot;
}

cleanTemporaryFiles() {
local iFile=&quot;${1##*/}&quot;	# remove directory and keep only file name.
showMessage &quot;Removing temporary files...&quot;
rm &quot;$outdir/${iFile%.*}&quot;_temp*
}

initialize</pre>
<p>You can also download the script by clicking <a title="Download the MKMP4 encoding script" href="http://blog.massanti.com/wp-content/uploads/2008/09/mkmp4.zip">here</a> in order to keep proper code formatting. Installation is really simple, just move it to <strong>/usr/local/bin</strong>, give it execution rights (<strong>chmod +x /usr/local/bin/mkmp4</strong>) and done.</p>
<p>This script is really easy to use and implement, basically the script expects the following <strong>MANDATORY</strong> parameters in the command line:</p>
<ul>
<li>-f to specify the source media <strong>(can be a single file or a whole directory with media files)</strong></li>
<li>-b to specify the target bitrate for the final h264 encoded movie</li>
<li>-w to specify the target width for the final h264 encoded movie</li>
</ul>
<p>So for example, typing:</p>
<pre>mkmp4 -f /path/to/some/video.avi -b 512 -w 640</pre>
<p>will create a MP4 video file with a bitrate of 512kbps and a frame width of 640 pixels (please note that mencoder will correctly take care of the aspect ratio for the final movie and the resize will just look OK.)</p>
<p>Optional parameters for the MKMP4 script:</p>
<ul>
<li>-q turns on 2 pass encoding: This will increase the final quality (and the encoding time), but it worths the extra wait if you care about quality.</li>
<li>-k to keep temporary files: The script will create several temporary files during the encoding process, if for whatever reason you want to keep that files, you should use this option.</li>
<li>-o to specify a target directory: By default, the mkmp4 script will place the output video in the working directory (the directory from where you called the script), if you want to change that behavior, just use this option.</li>
<li>-t to turn ON thumbnail and poster frame generation: If you use this flag, mkmp4 will create a thumbnail and a poster frame that you can then use if you plan to publish your videos on the web.</li>
</ul>
<p>The following command line will create a 512kbps video, will set the target width to 640 pixels AND will use 2 pass encoding, will <strong>not</strong> delete temporary files, will create thumbnails and poster frames, and will place the files on the <em><strong>/target/directory/</strong></em> directory.</p>
<pre>mkmp4 -f /path/to/some/video.avi -b 512 -w 640 -k -q -t -o /target/directory/</pre>
<h3>Some things you need to know and FAQ&#8217;s about this script:</h3>
<ul>
<li>By default, when the -f parameter is a directory, the script will search for any .mov file inside it, encode it, and place the final mp4 file into the directory set in the -o parameter (or the current directory if you have ommited that parameter), if you want to change that behavior, just change the value of the <em><strong>fileext</strong></em> variable inside the script to whatever file extension you want to process.</li>
<li>Why are you reducing the audio level by 5db ? This is because with some old audio formats, for some reason that I really ignore, mplayer will distort the audio output. Now, if you take a closer look, you will see that right after the volume filter, im applying a normalization filter to get the audio back to 0db, so the output audio level will always be correct no matter what happens.</li>
<li>Why are you forcing the audio output to be always stereo ? what if i want to encode mono material ?: Just modify the audio encoder trigger.</li>
<li>The output media produced by this script is automatically interleaved and is fully compatible (and has been tested) with <a href="http://www.adobe.com/products/flashmediaserver/">Flash Media Server 3</a> and <a href="http://www.wowzamedia.com/">Wowza Media Server Pro</a>.</li>
</ul>
<p>There are a lot of things that could be improved around here, and so far i have not tested this in any platform other than Mac OS Leopard, but so far, this should work in any Linux / Unix variant too without too much work.</p>
<p>If you are interested to get an idea of how the video results will look, you can take a look a <a href="http://blog.massanti.com/apple-video-archive/iphone/">The Apple Video Archive</a> here on this site.</p>
<p>As usual, comments / feedback and suggestions are welcome.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.massanti.com/2008/09/26/mkmp4-automated-h264-aacplus-encoder-script-mac-linux/feed/</wfw:commentRss>
		<slash:comments>67</slash:comments>
		</item>
		<item>
		<title>Encoding high quality h.264 / aacPlus v2 media for web streaming with Flash 9, version 2.</title>
		<link>http://blog.massanti.com/2008/01/01/encoding-h264-aacplus-with-mencoder-for-flash/</link>
		<comments>http://blog.massanti.com/2008/01/01/encoding-h264-aacplus-with-mencoder-for-flash/#comments</comments>
		<pubDate>Tue, 01 Jan 2008 12:11:43 +0000</pubDate>
		<dc:creator>Diego Massanti</dc:creator>
				<category><![CDATA[Computers & Tech]]></category>
		<category><![CDATA[Video Encoding]]></category>
		<category><![CDATA[Web & Design]]></category>
		<category><![CDATA[aacPlus]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[encoding]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[h264]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[media]]></category>
		<category><![CDATA[quality]]></category>
		<category><![CDATA[streaming]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[unix]]></category>
		<category><![CDATA[video]]></category>

		<guid isPermaLink="false">http://massanti.com/2008/01/01/encoding-h264-aacplus-with-mencoder-for-flash/</guid>
		<description><![CDATA[Update Notice This post has been updated with a newer and improved script and instructions, please visit the new one HERE. It was some months ago when I wrote a tutorial about how to encode good quality h.264 video with aacPlus audio in order to use the great capabilities of the new flash player version [...]]]></description>
			<content:encoded><![CDATA[<blockquote class="warning"><h3>Update Notice</h3>
<p>This post has been updated with a newer and improved script and instructions, please visit the new one <a href="http://blog.massanti.com/2008/09/26/mkmp4-automated-h264-aacplus-encoder-script-mac-linux/#more-562">HERE</a>.</p></blockquote>
<p>It was some months ago when I wrote a <a href="http://massanti.com/2007/09/28/encoding-h264-video-aac-plus-audio-for-flash/">tutorial about how to encode good quality h.264 video with aacPlus audio</a> in order to use the great capabilities of the new flash player version 9.0.115 (that in case you missed it, now <a href="http://www.adobe.com/aboutadobe/pressroom/pressreleases/200708/082107FlashPlayer.html">can play h264 video and aacPlus v2 audio</a>).<br />
Due to some personal convictions for my prior tutorial, i decided to use <a href="http://ffmpeg.mplayerhq.hu/">FFMPEG</a>, and while it does the job pretty well, it has some limitations (specially in the video scaling / resizing area). So in my particular case, I had to use <a href="http://massanti.com/2007/10/01/serverside-video-resizing-script/">several php / bash scripts</a> in order to feed the encoders with the proper resizing data, etcetera.<br />
<strong>Well, let me introduce you to the 2nd version of my h.264 / aacPlus v2 tutorial.</strong></p>
<p>This time I used Mencoder, an amazing tool that comes with the <a href="http://www.mplayerhq.hu/">mPlayer</a> package, and i also created what i think is a really nice bash script to make the process almost 100% smooth and simple.</p>
<h3>These are the things you will need:</h3>
<ul>
<li>the <a href="http://www.mplayerhq.hu/design7/dload.html">mPlayer package</a> for whatever platform you&#8217;re running</li>
<li>the <a href="http://www.nero.com/enu/nero-aac-codec.html">Nero enhanced AAC audio encoder</a> if you are on linux / unix or <a href="http://massanti.com/2007/09/30/he-aac-plus-encoder-mac-universal-binary/">my build of the 3GPP HE-AAC encoder</a> if you are on a Mac.</li>
<li>the <a href="http://gpac.sourceforge.net/home_download.php">GPAC utilities</a></li>
<li>the <a href="http://www.videolan.org/developers/x264.html">x264 video encoder</a></li>
</ul>
<p><span id="more-96"></span><br />
So let&#8217;s start. As usual, I wont dig a lot in the details about how to install or build software on linux / unix / mac, because you can find several <a href="http://www.tuxfiles.org/linuxhelp/softinstall.html">tutorials about those matters</a> by using google.</p>
<h3>Building and installing the x264 encoder</h3>
<p>In order to compile and install the x264 encoder, i recommend you to get <strong>the latest SVN</strong> version and build it yourself.<br />
There are not any specific parameters at all for x264 other than the install path because the bash script that i will show you later <strong>assumes that you have all the tools in a directory that is inside your executable path</strong>.<br />
So&#8230; get the latest sources for x264:<br />
<code>svn co svn://svn.videolan.org/x264/trunk x264</code><br />
and then just run:<br />
<code>./configure --prefix=/usr<br />
make<br />
make install<br />
</code><br />
After you have the x264 encoder installed, its time to get and build mPlayer.</p>
<h3>Installing mPlayer and Mencoder</h3>
<p>Again, get the latest sources for mPlayer:<br />
<code>svn checkout svn://svn.mplayerhq.hu/mplayer/trunk mplayer</code><br />
and this is the configuration that you **should** use:<br />
<code>./configure --prefix=/usr</code></p>
<blockquote class="mac"><p><strong>If you are on MacOS and you get errors when building, do this:</strong><br />
<code>./configure --prefix=/usr --disable-encoder=flac --disable-encoder=cavs --disable-decoder=cavs</code><br />
and then the usual&#8230;<br />
<code>make<br />
make install</code></p></blockquote>
<blockquote class="warning">
<h2>Very Important:</h2>
<p>After you compile and install all the tools, you will find a directory called &#8220;TOOLS&#8221; inside the mplayer source tree, go inside it, and look for an small script called &#8220;midentify&#8221;, you MUST COPY this script to your <code>/usr/bin</code> directory or any other dir inside your executable path for the bash script to work. This is mandatory.</p></blockquote>
<h2> The bash magic&#8230;</h2>
<p>Ok, so after you have all the tools built, **AND** in your path, let me show you this simple script that i have written in order to make things really simple.</p>
<pre><code class="bash">#! /bin/bash   

# This bash script has been created by Diego Massanti
# You are free and welcome to do whatever you want with it.
# www.massanti.com

usage()
{
cat &lt; &lt; EOF
usage: $0 -f  [-w ] -b  [-q][-k]

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* h264 video with he-aac audio encoding script by Diego Massanti. *
*                January 2008, Made in Argentina.                 *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

OPTIONS:
   	-h	Show this message
 -f	Path to the file to encode &lt; REQUIRED
   	-w	Resize video to fit inside this width while keeping the aspect ratio &lt; OPTIONAL
   	-b	Desired video bitrate &lt; REQUIRED
   	-q 	Better quality encoding using 2 passes (slower) &lt; OPTIONAL
 -k	Do not delete (keep) temporary files &lt; OPTIONAL
EOF
}
audiobitrate=48000
platform=""
uname=`uname`
if [ $uname == "Darwin" ]; then
 ## 99% of chances that this is a Mac
 platform="Mac"
else
 platform="Linux"
fi

width=""
bitrate=
deltemp=TRUE
quality=FALSE
filename=
rsize=""

while getopts ":f:w:b:qkv" OPTION; do
  case $OPTION in
    w ) width=$OPTARG;;
 f ) filename=$OPTARG;;
    b ) bitrate=$OPTARG;;
    k ) deltemp=FALSE;;
 q )	quality=TRUE;;
    h ) usage;;
    \? ) usage
         exit 1;;
    * ) echo $usage
          exit 1;;
  esac
done

if [ "$1" == "" ]; then
 usage
 exit 0
fi

if [ "$filename" == "" ]; then
 echo
 echo you MUST supply a file to encode!, use the -f parameter. i.e: -f mymovie.avi
 echo
 usage
 exit 1
fi
if [ "$bitrate" == "" ]; then
 echo
 echo you MUST specify a target bitrate!, use the -b parameter. i.e: -b 512
 echo
 usage
 exit 1
fi

if [ "$width" != "" ]; then
 rsize="-vf scale=$width:-3"
 rsizemsg="fit into $width pixels wide"
else
 rsize=""
 rsizemsg="Movie is not being resized."
fi

MOVIE_FPS=`midentify "$filename" | grep FPS | cut -d = -f 2`
#clear
echo "*    Encoding: $filename"
echo "*    Resizing to: $rsizemsg."
echo "*    Total Bitrate: $bitrate kbps."
let "caudiobitrate = $audiobitrate / 1000"
let "bitrate = $bitrate - $caudiobitrate"
echo "*    Video Bitrate: $bitrate kbps."
echo "*    Audio Bitrate: $caudiobitrate kbps."
echo "*    Platform: $platform."

# Encoding phase starts here...
# Encoding Video...
echo "* * * Starting video encoding pass 1... * * *"
mencoder "$filename" -o "${filename%.*}_temp.264" -passlogfile "${filename%.*}"_temp.log $rsize -ovc x264 -x264encopts bitrate=$bitrate:frameref=8:bframes=3:b_adapt:b_pyramid:weight_b:partitions=all:8x8dct:me=umh:subq=6:trellis=2:brdo:threads=auto:pass=1:analyse=all -of rawvideo -nosound

if [ "$quality" == "TRUE" ]; then
echo "* * * Starting video encoding pass 2... * * *"
mencoder "$filename" -o "${filename%.*}_temp.264" -passlogfile "${filename%.*}"_temp.log $rsize -ovc x264 -x264encopts bitrate=$bitrate:frameref=8:bframes=3:b_adapt:b_pyramid:weight_b:partitions=all:8x8dct:me=umh:subq=6:trellis=2:brdo:threads=auto:pass=2:analyse=all -of rawvideo -nosound
fi

# Extracting audio to a 48khz WAV file.
echo "* * * Extracting Audio... * * *"
mplayer "$filename" -af resample=48000:0:2,volnorm=2:0.25 -ao pcm:file="${filename%.*}_temp.wav" -vc dummy -vo null

# Encoding Audio to HE-AAC plus file
echo "* * * Encoding Audio... * * *"

if [ "$platform" == "Mac" ]; then
enhAacPlusEnc "${filename%.*}_temp.wav" "${filename%.*}_temp.aac" $audiobitrate s
else
neroAacEnc -br 48000 -he -if ${filename%.*}_temp.wav -of ${filename%.*}_temp.mp4
fi

# Muxing
echo "* * * Generating final MP4 container... * * *"

MP4Box -add "${filename%.*}_temp.264#video:fps=$MOVIE_FPS" "${filename%.*}.m4v"
if [ "$platform" == "Mac" ]; then
MP4Box -add "${filename%.*}_temp.aac" "${filename%.*}.m4v"
else
MP4Box -add "${filename%.*}_temp.mp4#audio" "${filename%.*}.m4v"
fi

# MetaData and interleaving
name=${filename%.*}
album="Some Album"
author="Some Author"
comment="Some Comment"
created="2007"
MP4Box -inter 500 -itags album="$album":artist="$author":comment="$comment":created="$created":name="$name" -lang English "${filename%.*}".m4v

# Clean up temporary files...
if [ $deltemp == "TRUE" ]; then
 echo "* * * Removing temporary files... * * *"
 rm "${filename%.*}"_temp*
fi</code></pre>
<p>You can also <a title="download the mkmp4 shell script" href="http://massanti.com/wp-content/uploads/2008/01/mkmp4.sh">download the mkmp4 shell script</a> in order to keep proper tabulations and code formatting.</p>
<p>You should save the code here into a simple text file, give it any name you want (i call mine &#8220;mkmp4&#8243;) and dont forget to <em>chmod +x</em> it.<br />
Usage is really simple:<br />
The scripts expects 2 main parameters that are mandatory:</p>
<ul>
<li>-f</li>
<li>-b</li>
</ul>
<p>So for example, typing <code>./mkmp4 -f myvideo.avi -b 512</code> will create a H.264 video file, with aacPlus v2 audio inside an MP4 container with a total <strong>bitrate of 512kbps</strong> and using <em>myvideo.avi</em> as source.<br />
The resulting file is ready for <strong>HTTP Streaming</strong> or <strong>FlashMedia Streaming Server 3</strong>, and of course, it will also play in any video player out there capable of H.264 and aacPlus v2 decoding.<br />
The script also accepts some other optional parameters.</p>
<ul>
<li>-q to use <strong>2 pass encoding</strong>, slower, but better quality <strong>specially</strong> at low bitrates</li>
<li>-w to resize the output video, for example &#8220;-w 480&#8243; will resize the video to 480 pixels wide <strong>while keeping the correct aspect ratio</strong>.</li>
<li>-k to keep temporary files</li>
<li>-h to show inline help</li>
</ul>
<p><strong>The script will detect if you are running it on a Mac or on any kind of linux / unix variant, and use the proper audio encoder for each platform.</strong><br />
Also, in lines 133 to 136 in the script code, you will find some meta information variables that you can customize. That information is used by players like QuickTime, iTunes and many others in order to correctly organize the file inside a user&#8217;s media library.</p>
<h3>Final considerations</h3>
<p>This script can use as source, any video format supported by mPlayer, wich in other words means that almost any kind of video file can be transcoded by using this method.<br />
If you are wondering what kind of quality / bitrate relation you will get by using this method, you are free to <a href="http://massanti.com/macvideo/ipod-itunes/ipod-touch/">watch this 512kbps video stream</a> (feel free to press the fullscreen button on the player <img src='http://blog.massanti.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )<br />
When i released the first version of this tutorial 3 months ago, somebody asked how to get better quality for screencasts, and i guess the answer to that question would be something like: Framerate is not important at all, anything over 10FPS is useless for a screencast, by lowering the video framerate you get more quality at the same bandwidth, also, if you are doing a screencast, most probably you want your viewers to be able to &#8220;read&#8221; at texts, etc, so, a resolution of at least 640&#215;480 is a must, and for bitrate, i think 512kbps with a two pass encoding process will be more than enough.</p>
<p>If you have any comment or suggestion you can leave a coment below. Thanks for reading !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.massanti.com/2008/01/01/encoding-h264-aacplus-with-mencoder-for-flash/feed/</wfw:commentRss>
		<slash:comments>78</slash:comments>
		</item>
	</channel>
</rss>

