<?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>Helyar.net &#187; ffmpeg</title>
	<atom:link href="http://www.helyar.net/tag/ffmpeg/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.helyar.net</link>
	<description>From the desktop of George Helyar</description>
	<lastBuildDate>Thu, 26 Jan 2012 16:11:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>How to compile ffmpeg from source</title>
		<link>http://www.helyar.net/2010/how-to-compile-ffmpeg-from-source/</link>
		<comments>http://www.helyar.net/2010/how-to-compile-ffmpeg-from-source/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 13:15:43 +0000</pubDate>
		<dc:creator>George Helyar</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[compile]]></category>
		<category><![CDATA[ffmpeg]]></category>

		<guid isPermaLink="false">http://www.helyar.net/?p=512</guid>
		<description><![CDATA[ffmpeg is a free and very powerful video encoding tool that is the basis of many other popular video encoding tools, with a command line interface. Because of the frequent updates to ffmpeg and the codecs it uses, it is often best to download the latest source and compile it yourself. These updates usually include [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ffmpeg.org/">ffmpeg</a> is a free and very powerful video encoding tool that is the basis of many other popular video encoding tools, with a command line interface.</p>
<p>Because of the frequent updates to ffmpeg and the codecs it uses, it is often best to download the latest source and compile it yourself. These updates usually include new features, bug fixes, support for new codecs and noticeable speed improvements. Most Linux distributions have outdated packages in their repositories so being able to compile the latest code from source is very useful</p>
<p>I use ffmpeg to output H.264 video with AAC audio in a MP4 container. I also occasionally convert audio to mp3. This means I will be compiling the following:</p>
<ul>
<li><a href="http://ffmpeg.org/">ffmpeg</a></li>
<li><a href="http://www.videolan.org/developers/x264.html">x264</a></li>
<li><a href="http://www.audiocoding.com/">faac/faad</a></li>
<li><a href="http://lame.sourceforge.net/">LAME</a></li>
</ul>
<h3>Preparing to compile on Linux</h3>
<p><em>(If you already compile things on Linux, skip to the next section.)</em><br />
First make sure that you have all of the tools and headers required to compile on Linux. On Debian based systems (including Ubuntu) you can usually run the following as root to get everything you need. First update your system. It is important that you get the latest kernel and the correct sources for it.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: black;"><span style="color: #c20cb9; font-weight: bold;color: blue;">apt-get</span> update
<span style="color: #c20cb9; font-weight: bold;color: blue;">apt-get</span> dist-upgrade</pre></div></div>

<p>A reboot may be required here if your kernel updated.</p>
<p>Now get the compilers, tools and headers needed to compile software on Linux:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: black;"><span style="color: #c20cb9; font-weight: bold;color: blue;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;color: blue;">install</span> build-essential linux-headers-<span style="color: #000000; font-weight: bold;color: black;">`</span><span style="color: #c20cb9; font-weight: bold;color: blue;">uname</span> -r<span style="color: #000000; font-weight: bold;color: black;">`</span> <span style="color: #c20cb9; font-weight: bold;color: blue;">git</span> subversion yasm</pre></div></div>

<p>NB: your &#8220;git&#8221; package may be called something like &#8220;git-core&#8221;</p>
<h3>Compile ffmpeg (empty)</h3>
<p>Because some libraries require ffmpeg to be installed, we will first install a blank copy with no additional codecs specified.</p>
<p>When I update, I often find that I need to recompile a blank version of ffmpeg before I can compile x264.</p>
<p>Download the latest ffmpeg source with subversion, configure, compile:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: black;"><span style="color: #c20cb9; font-weight: bold;color: blue;">svn</span> checkout <span style="color: #c20cb9; font-weight: bold;color: blue;">svn</span>:<span style="color: #000000; font-weight: bold;color: black;">//</span>svn.ffmpeg.org<span style="color: #000000; font-weight: bold;color: black;">/</span>ffmpeg<span style="color: #000000; font-weight: bold;color: black;">/</span>trunk <span style="color: #c20cb9; font-weight: bold;color: blue;">ffmpeg</span>
<span style="color: #7a0874; font-weight: bold;color: blue;">cd</span> <span style="color: #c20cb9; font-weight: bold;color: blue;">ffmpeg</span>
.<span style="color: #000000; font-weight: bold;color: black;">/</span>configure
<span style="color: #c20cb9; font-weight: bold;color: blue;">make</span></pre></div></div>

<p>If this all worked with no errors (you can check with <code>echo $?</code>), run</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: black;"><span style="color: #c20cb9; font-weight: bold;color: blue;">make</span> <span style="color: #c20cb9; font-weight: bold;color: blue;">install</span></pre></div></div>

<p> as root. Use su or sudo if you need to. I use su.</p>
<h3>Compile faac and faad</h3>
<p>Download and extract faac and faad from <a href="http://www.audiocoding.com/">audiocoding.com</a>.</p>
<p>As above, run</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: black;">.<span style="color: #000000; font-weight: bold;color: black;">/</span>configure
<span style="color: #c20cb9; font-weight: bold;color: blue;">make</span>
<span style="color: #c20cb9; font-weight: bold;color: blue;">su</span> <span style="color: #660033;">-c</span> <span style="color: #ff0000;">'make install'</span></pre></div></div>

<p>on both libraries.</p>
<p>You can optionally do the same thing with <a href="http://lame.sourceforge.net/">LAME</a> if you want to be able to encode mp3 audio.</p>
<p><em>NB: if you get a <code>strcasestr</code> error compiling faac, just comment it out in faac_1.28/common/mp4v2/mpeg4ip.h</em></p>
<h3>Compile x264</h3>
<p>Download and compile the latest x264 source with git:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: black;"><span style="color: #c20cb9; font-weight: bold;color: blue;">git</span> clone <span style="color: #c20cb9; font-weight: bold;color: blue;">git</span>:<span style="color: #000000; font-weight: bold;color: black;">//</span>git.videolan.org<span style="color: #000000; font-weight: bold;color: black;">/</span>x264.git
<span style="color: #7a0874; font-weight: bold;color: blue;">cd</span> x264
.<span style="color: #000000; font-weight: bold;color: black;">/</span>configure <span style="color: #660033;">--enable-static</span> <span style="color: #660033;">--enable-shared</span>
<span style="color: #c20cb9; font-weight: bold;color: blue;">make</span>
<span style="color: #c20cb9; font-weight: bold;color: blue;">su</span> <span style="color: #660033;">-c</span> <span style="color: #ff0000;">'make install'</span></pre></div></div>

<h3>Compile ffmpeg with the above codecs</h3>
<p>Now that we have all of the codecs (x264, aac, mp3) successfully installed as libraries on the system, we can reinstall ffmpeg to incorporate these libraries. First go back to the ffmpeg source directory and clean off the previous compile.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: black;"><span style="color: #7a0874; font-weight: bold;color: blue;">cd</span> <span style="color: #c20cb9; font-weight: bold;color: blue;">ffmpeg</span>
<span style="color: #c20cb9; font-weight: bold;color: blue;">make</span> clean</pre></div></div>

<p>Now configure to enable all of the installed libraries and recompile:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: black;">.<span style="color: #000000; font-weight: bold;color: black;">/</span>configure <span style="color: #660033;">--enable-gpl</span> <span style="color: #660033;">--enable-nonfree</span> <span style="color: #660033;">--enable-pthreads</span> <span style="color: #660033;">--enable-libx264</span> <span style="color: #660033;">--enable-libfaac</span> <span style="color: #660033;">--enable-libfaad</span> <span style="color: #660033;">--enable-libmp3lame</span>
<span style="color: #c20cb9; font-weight: bold;color: blue;">make</span></pre></div></div>

<p>(if it tells you that &#8211;enable-libfaad is not an option, just remove it. It&#8217;s probably either been rolled into faac or ffmpeg has it built in)</p>
<p>If it all worked, run make install as root.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: black;"><span style="color: #c20cb9; font-weight: bold;color: blue;">su</span> <span style="color: #660033;">-c</span> <span style="color: #ff0000;">'make install'</span></pre></div></div>

<h3>Testing</h3>
<p>As long as /usr/local/bin/ is on your $PATH environment variable, you should be able to just type <code>ffmpeg</code> to check that it is all installed. It should look something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: black;">$ <span style="color: #c20cb9; font-weight: bold;color: blue;">ffmpeg</span>
FFmpeg version SVN-r23548, Copyright <span style="color: #7a0874; font-weight: bold;color: black;">&#40;</span>c<span style="color: #7a0874; font-weight: bold;color: black;">&#41;</span> <span style="color: #000000;color: maroon;">2000</span>-<span style="color: #000000;color: maroon;">2010</span> the FFmpeg developers
  built on Jun  <span style="color: #000000;color: maroon;">9</span> <span style="color: #000000;color: maroon;">2010</span> <span style="color: #000000;color: maroon;">13</span>:<span style="color: #000000;color: maroon;">35</span>:<span style="color: #000000;color: maroon;">17</span> with <span style="color: #c20cb9; font-weight: bold;color: blue;">gcc</span> 4.4.4
  configuration: <span style="color: #660033;">--enable-gpl</span> <span style="color: #660033;">--enable-nonfree</span> <span style="color: #660033;">--enable-pthreads</span> <span style="color: #660033;">--enable-libx264</span> <span style="color: #660033;">--enable-libfaac</span> <span style="color: #660033;">--enable-libfaad</span> <span style="color: #660033;">--enable-libmp3lame</span>
  libavutil     <span style="color: #000000;color: maroon;">50.18</span>. <span style="color: #000000;color: maroon;">0</span> <span style="color: #000000; font-weight: bold;color: black;">/</span> <span style="color: #000000;color: maroon;">50.18</span>. <span style="color: #000000;color: maroon;">0</span>
  libavcodec    <span style="color: #000000;color: maroon;">52.75</span>. <span style="color: #000000;color: maroon;">1</span> <span style="color: #000000; font-weight: bold;color: black;">/</span> <span style="color: #000000;color: maroon;">52.75</span>. <span style="color: #000000;color: maroon;">1</span>
  libavformat   <span style="color: #000000;color: maroon;">52.68</span>. <span style="color: #000000;color: maroon;">0</span> <span style="color: #000000; font-weight: bold;color: black;">/</span> <span style="color: #000000;color: maroon;">52.68</span>. <span style="color: #000000;color: maroon;">0</span>
  libavdevice   <span style="color: #000000;color: maroon;">52</span>. <span style="color: #000000;color: maroon;">2</span>. <span style="color: #000000;color: maroon;">0</span> <span style="color: #000000; font-weight: bold;color: black;">/</span> <span style="color: #000000;color: maroon;">52</span>. <span style="color: #000000;color: maroon;">2</span>. <span style="color: #000000;color: maroon;">0</span>
  libavfilter    <span style="color: #000000;color: maroon;">1.20</span>. <span style="color: #000000;color: maroon;">0</span> <span style="color: #000000; font-weight: bold;color: black;">/</span>  <span style="color: #000000;color: maroon;">1.20</span>. <span style="color: #000000;color: maroon;">0</span>
  libswscale     <span style="color: #000000;color: maroon;">0.11</span>. <span style="color: #000000;color: maroon;">0</span> <span style="color: #000000; font-weight: bold;color: black;">/</span>  <span style="color: #000000;color: maroon;">0.11</span>. <span style="color: #000000;color: maroon;">0</span>
Hyper fast Audio and Video encoder
usage: <span style="color: #c20cb9; font-weight: bold;color: blue;">ffmpeg</span> <span style="color: #7a0874; font-weight: bold;color: black;">&#91;</span>options<span style="color: #7a0874; font-weight: bold;color: black;">&#93;</span> <span style="color: #7a0874; font-weight: bold;color: black;">&#91;</span><span style="color: #7a0874; font-weight: bold;color: black;">&#91;</span>infile options<span style="color: #7a0874; font-weight: bold;color: black;">&#93;</span> <span style="color: #660033;">-i</span> infile<span style="color: #7a0874; font-weight: bold;color: black;">&#93;</span>... <span style="color: #7a0874; font-weight: bold;color: black;">&#123;</span><span style="color: #7a0874; font-weight: bold;color: black;">&#91;</span>outfile options<span style="color: #7a0874; font-weight: bold;color: black;">&#93;</span> outfile<span style="color: #7a0874; font-weight: bold;color: black;">&#125;</span>...
&nbsp;
Use <span style="color: #660033;">-h</span> to get full <span style="color: #7a0874; font-weight: bold;color: blue;">help</span> or, even better, run <span style="color: #ff0000;">'man ffmpeg'</span></pre></div></div>

<h3>Using ffmpeg</h3>
<p>I have written a small Python <a href="http://www.helyar.net/enc">video encoding script</a> to make encoding as easy as</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: black;">enc <span style="color: #660033;">-t</span> <span style="color: #7a0874; font-weight: bold;color: blue;">cd</span> file.vob</pre></div></div>

<p>If anyone has any suggestions to improve this, please feel free to post them in the comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.helyar.net/2010/how-to-compile-ffmpeg-from-source/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Convert any audio/video files to mp3 for free</title>
		<link>http://www.helyar.net/2009/convert-any-audiovideo-files-to-mp3-for-free/</link>
		<comments>http://www.helyar.net/2009/convert-any-audiovideo-files-to-mp3-for-free/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 01:28:58 +0000</pubDate>
		<dc:creator>George Helyar</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[batch]]></category>
		<category><![CDATA[ffmpeg]]></category>

		<guid isPermaLink="false">http://www.helyar.net/?p=419</guid>
		<description><![CDATA[It seems that there is some confusion about audio conversion tools and some people even pay for them. The truth is that most encoders, even ones you pay for, use ffmpeg internally to do all of the actual work and ffmpeg is free and open source. You can even get it pre-compiled for Windows, though [...]]]></description>
			<content:encoded><![CDATA[<p>It seems that there is some confusion about audio conversion tools and some people even pay for them.</p>
<p>The truth is that most encoders, even ones you pay for, use <a href="http://www.ffmpeg.org">ffmpeg</a> internally to do all of the actual work and ffmpeg is free and open source.</p>
<p>You can even get it <a href="http://www.videohelp.com/tools/ffmpeg">pre-compiled for Windows</a>, though the version isn&#8217;t great.</p>
<p>The only problem with using ffmpeg directly is that it has a command line interface and most novices find it hard to use.</p>
<p>Here&#8217;s a batch file for use on Windows which will convert anything you drop onto the file into a 320kbps mp3:</p>

<div class="wp_syntax"><div class="code"><pre class="winbatch" style="font-family:monospace;color: black;">ffmpeg <span style="color: #66cc66;color: black;">-</span>i <span style="color: #66cc66;color: black;">%</span>1 <span style="color: #66cc66;color: black;">-</span>ab 320k <span style="color: #66cc66;color: black;">-</span>y <span style="color: #66cc66;color: black;">%</span>1.mp3
<span style="color: #66cc66;color: black;">@</span><span style="color: #800080;color: blue;">if</span> errorlevel <span style="color: #cc66cc;color: maroon;">1</span> <span style="color: #66cc66;color: black;">@</span><span style="color: #0000FF;color: blue;">pause</span></pre></div></div>

<p>To create this file, open notepad. Copy and paste the above 2 lines in. Save it as &#8220;convert.bat&#8221; or something similar (the .bat is important) and select &#8220;All files&#8221; from the drop down list.</p>
<p>Put the bat file in the same directory as ffmpeg.exe and simply drag anything you want converted on top of the bat file.</p>
<p>You can use almost anything. wav, m4a, m4v, mov, mpg, avi, etc. If you use a file with both audio and video, such as a movie, it will just extract the audio and save that as an mp3 file.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.helyar.net/2009/convert-any-audiovideo-files-to-mp3-for-free/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ffmpeg target file sizes (again)</title>
		<link>http://www.helyar.net/2009/ffmpeg-target-file-sizes-again/</link>
		<comments>http://www.helyar.net/2009/ffmpeg-target-file-sizes-again/#comments</comments>
		<pubDate>Fri, 17 Jul 2009 17:41:05 +0000</pubDate>
		<dc:creator>George Helyar</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.helyar.net/?p=330</guid>
		<description><![CDATA[This script is now available as an ongoing project that can be downloaded. Please see the Video Encoding Project. As a bit of a revision to a previous entry, I have converted the combination bash/python scripts I gave earlier into a single large python script. This can now be used without editing any files to [...]]]></description>
			<content:encoded><![CDATA[<p>This script is now available as an ongoing project that can be downloaded. Please see the <a href="http://www.helyar.net/enc">Video Encoding Project</a>.<br />
<hr />
<p>As a bit of a revision to a <a href="http://www.helyar.net/2009/how-to-set-target-file-sizes-in-ffmpeg/">previous entry</a>, I have converted the combination bash/python scripts I gave earlier into a single large python script.</p>
<p>This can now be used without editing any files to set sizes. An example of use is:<br />
<code>$ ./enc.py -s 700 -a 192 -o '-deinterlace' da_*.VOB</code><br />
All of these flags are optional except the file list, where at least 1 file must be specified.</p>
<p><a href='http://www.helyar.net/wp-content/uploads/2009/07/enc.tar.gz'>enc.tar.gz</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;color: black;"><span style="color: #808080; font-style: italic;color: green;">#!/usr/bin/python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;color: blue;">from</span> <span style="color: #dc143c;color: blue;">getopt</span> <span style="color: #ff7700;font-weight:bold;color: blue;">import</span> <span style="color: #dc143c;color: blue;">getopt</span>, GetoptError
<span style="color: #ff7700;font-weight:bold;color: blue;">from</span> <span style="color: #dc143c;color: blue;">sys</span> <span style="color: #ff7700;font-weight:bold;color: blue;">import</span> argv, exit
<span style="color: #ff7700;font-weight:bold;color: blue;">from</span> <span style="color: #dc143c;color: blue;">subprocess</span> <span style="color: #ff7700;font-weight:bold;color: blue;">import</span> Popen, PIPE
<span style="color: #ff7700;font-weight:bold;color: blue;">from</span> <span style="color: #dc143c;color: blue;">re</span> <span style="color: #ff7700;font-weight:bold;color: blue;">import</span> search
&nbsp;
<span style="color: #ff7700;font-weight:bold;color: blue;">def</span> secs<span style="color: black;color: black;">&#40;</span>h, m, s<span style="color: black;color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;color: blue;">return</span> <span style="color: black;color: black;">&#40;</span><span style="color: black;color: black;">&#40;</span><span style="color: black;color: black;">&#40;</span>h<span style="color: #66cc66;color: black;">*</span><span style="color: #ff4500;color: maroon;">60</span><span style="color: black;color: black;">&#41;</span>+m<span style="color: black;color: black;">&#41;</span><span style="color: #66cc66;color: black;">*</span><span style="color: #ff4500;color: maroon;">60</span><span style="color: black;color: black;">&#41;</span>+s
&nbsp;
<span style="color: #ff7700;font-weight:bold;color: blue;">def</span> calc_video_bitrate<span style="color: black;color: black;">&#40;</span>target_bytes, ab, <span style="color: #dc143c;color: blue;">time</span><span style="color: black;color: black;">&#41;</span>:
  audio_bytes = <span style="color: black;color: black;">&#40;</span>ab <span style="color: #66cc66;color: black;">*</span> <span style="color: #ff4500;color: maroon;">1000</span> / <span style="color: #ff4500;color: maroon;">8</span><span style="color: black;color: black;">&#41;</span> <span style="color: #66cc66;color: black;">*</span> <span style="color: #dc143c;color: blue;">time</span>
  <span style="color: #ff7700;font-weight:bold;color: blue;">return</span> <span style="color: black;color: black;">&#40;</span>target_bytes - audio_bytes<span style="color: black;color: black;">&#41;</span> / <span style="color: #dc143c;color: blue;">time</span> <span style="color: #66cc66;color: black;">*</span> <span style="color: #ff4500;color: maroon;">8</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;color: blue;">def</span> get_duration<span style="color: black;color: black;">&#40;</span><span style="color: #008000;color: blue;">file</span><span style="color: black;color: black;">&#41;</span>:
  ffmpeg = Popen<span style="color: black;color: black;">&#40;</span><span style="color: black;color: black;">&#40;</span><span style="color: #483d8b;color: maroon;">&quot;ffmpeg&quot;</span>, <span style="color: #483d8b;color: maroon;">&quot;-i&quot;</span>, <span style="color: #008000;color: blue;">file</span><span style="color: black;color: black;">&#41;</span>, stderr=PIPE<span style="color: black;color: black;">&#41;</span>
  match = search<span style="color: black;color: black;">&#40;</span><span style="color: #483d8b;color: maroon;">&quot;(<span style="color: #000099; font-weight: bold;">\\</span>d+):(<span style="color: #000099; font-weight: bold;">\\</span>d+):(<span style="color: #000099; font-weight: bold;">\\</span>d+)<span style="color: #000099; font-weight: bold;">\\</span>.<span style="color: #000099; font-weight: bold;">\\</span>d+&quot;</span>, ffmpeg.<span style="color: black;color: black;">communicate</span><span style="color: black;color: black;">&#40;</span><span style="color: black;color: black;">&#41;</span><span style="color: black;color: black;">&#91;</span><span style="color: #ff4500;color: maroon;">1</span><span style="color: black;color: black;">&#93;</span><span style="color: black;color: black;">&#41;</span>
  ffmpeg.<span style="color: black;color: black;">stderr</span>.<span style="color: black;color: black;">close</span><span style="color: black;color: black;">&#40;</span><span style="color: black;color: black;">&#41;</span>
&nbsp;
  <span style="color: #ff7700;font-weight:bold;color: blue;">if</span> match == <span style="color: #008000;color: blue;">None</span>: <span style="color: #ff7700;font-weight:bold;color: blue;">return</span> <span style="color: #ff4500;color: maroon;">0</span>
  dur = match.<span style="color: black;color: black;">groups</span><span style="color: black;color: black;">&#40;</span><span style="color: black;color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;color: blue;">return</span> secs<span style="color: black;color: black;">&#40;</span><span style="color: #008000;color: blue;">int</span><span style="color: black;color: black;">&#40;</span>dur<span style="color: black;color: black;">&#91;</span><span style="color: #ff4500;color: maroon;">0</span><span style="color: black;color: black;">&#93;</span><span style="color: black;color: black;">&#41;</span>, <span style="color: #008000;color: blue;">int</span><span style="color: black;color: black;">&#40;</span>dur<span style="color: black;color: black;">&#91;</span><span style="color: #ff4500;color: maroon;">1</span><span style="color: black;color: black;">&#93;</span><span style="color: black;color: black;">&#41;</span>, <span style="color: #008000;color: blue;">int</span><span style="color: black;color: black;">&#40;</span>dur<span style="color: black;color: black;">&#91;</span><span style="color: #ff4500;color: maroon;">2</span><span style="color: black;color: black;">&#93;</span><span style="color: black;color: black;">&#41;</span><span style="color: black;color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;color: blue;">def</span> encode<span style="color: black;color: black;">&#40;</span>source, dest, opts, vbr, abr=<span style="color: #ff4500;color: maroon;">128</span><span style="color: black;color: black;">&#41;</span>:
  command1 = <span style="color: #483d8b;color: maroon;">&quot;ffmpeg -i %s -pass 1 -an -vcodec libx264 -vpre fastfirstpass -b %d -bt %d -threads 0 %s -y pass1.mp4&quot;</span> <span style="color: #66cc66;color: black;">%</span> <span style="color: black;color: black;">&#40;</span>source, vbr, vbr, opts<span style="color: black;color: black;">&#41;</span>
  command2 = <span style="color: #483d8b;color: maroon;">&quot;ffmpeg -i %s -pass 2 -acodec libfaac -ac 2 -ab %dk -vcodec libx264 -vpre hq -b %d -bt %d -threads 0 %s -y %s&quot;</span> <span style="color: #66cc66;color: black;">%</span> <span style="color: black;color: black;">&#40;</span>source, abr, vbr, vbr, opts, dest<span style="color: black;color: black;">&#41;</span>
&nbsp;
  pass1 = Popen<span style="color: black;color: black;">&#40;</span>command1.<span style="color: black;color: black;">split</span><span style="color: black;color: black;">&#40;</span><span style="color: black;color: black;">&#41;</span><span style="color: black;color: black;">&#41;</span>
  pass1.<span style="color: black;color: black;">wait</span><span style="color: black;color: black;">&#40;</span><span style="color: black;color: black;">&#41;</span>
&nbsp;
  pass2 = Popen<span style="color: black;color: black;">&#40;</span>command2.<span style="color: black;color: black;">split</span><span style="color: black;color: black;">&#40;</span><span style="color: black;color: black;">&#41;</span><span style="color: black;color: black;">&#41;</span>
  pass2.<span style="color: black;color: black;">wait</span><span style="color: black;color: black;">&#40;</span><span style="color: black;color: black;">&#41;</span>
&nbsp;
&nbsp;
target_size = <span style="color: #ff4500;color: maroon;">350</span> <span style="color: #808080; font-style: italic;color: green;">#MiB</span>
ab = <span style="color: #ff4500;color: maroon;">128</span> <span style="color: #808080; font-style: italic;color: green;">#kbps</span>
extra_options = <span style="color: #483d8b;color: maroon;">&quot;&quot;</span>
&nbsp;
<span style="color: #808080; font-style: italic;color: green;"># Parse args</span>
<span style="color: #ff7700;font-weight:bold;color: blue;">try</span>:
  opts, args = <span style="color: #dc143c;color: blue;">getopt</span><span style="color: black;color: black;">&#40;</span>argv<span style="color: black;color: black;">&#91;</span><span style="color: #ff4500;color: maroon;">1</span>:<span style="color: black;color: black;">&#93;</span>, <span style="color: #483d8b;color: maroon;">&quot;s:a:o:&quot;</span>, <span style="color: black;color: black;">&#91;</span><span style="color: #483d8b;color: maroon;">&quot;size=&quot;</span>, <span style="color: #483d8b;color: maroon;">&quot;ab=&quot;</span>, <span style="color: #483d8b;color: maroon;">&quot;opts=&quot;</span><span style="color: black;color: black;">&#93;</span><span style="color: black;color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;color: blue;">except</span> GetoptError, err:
  <span style="color: #ff7700;font-weight:bold;color: blue;">print</span> <span style="color: #008000;color: blue;">str</span><span style="color: black;color: black;">&#40;</span>err<span style="color: black;color: black;">&#41;</span>
  exit<span style="color: black;color: black;">&#40;</span><span style="color: #ff4500;color: maroon;">2</span><span style="color: black;color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;color: blue;">for</span> o, a <span style="color: #ff7700;font-weight:bold;color: blue;">in</span> opts:
  <span style="color: #ff7700;font-weight:bold;color: blue;">if</span> o <span style="color: #ff7700;font-weight:bold;color: blue;">in</span> <span style="color: black;color: black;">&#40;</span><span style="color: #483d8b;color: maroon;">&quot;-s&quot;</span>, <span style="color: #483d8b;color: maroon;">&quot;--size&quot;</span><span style="color: black;color: black;">&#41;</span>:
    target_size = <span style="color: #008000;color: blue;">int</span><span style="color: black;color: black;">&#40;</span>a<span style="color: black;color: black;">&#41;</span> <span style="color: #66cc66;color: black;">*</span> <span style="color: #ff4500;color: maroon;">1024</span> <span style="color: #66cc66;color: black;">*</span> <span style="color: #ff4500;color: maroon;">1024</span>
  <span style="color: #ff7700;font-weight:bold;color: blue;">elif</span> o <span style="color: #ff7700;font-weight:bold;color: blue;">in</span> <span style="color: black;color: black;">&#40;</span><span style="color: #483d8b;color: maroon;">&quot;-a&quot;</span>, <span style="color: #483d8b;color: maroon;">&quot;--ab&quot;</span><span style="color: black;color: black;">&#41;</span>:
    ab = <span style="color: #008000;color: blue;">int</span><span style="color: black;color: black;">&#40;</span>a<span style="color: black;color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;color: blue;">elif</span> o <span style="color: #ff7700;font-weight:bold;color: blue;">in</span> <span style="color: black;color: black;">&#40;</span><span style="color: #483d8b;color: maroon;">&quot;-o&quot;</span>, <span style="color: #483d8b;color: maroon;">&quot;--opts&quot;</span><span style="color: black;color: black;">&#41;</span>:
    extra_options = a
&nbsp;
<span style="color: #ff7700;font-weight:bold;color: blue;">if</span> <span style="color: #008000;color: blue;">len</span><span style="color: black;color: black;">&#40;</span>args<span style="color: black;color: black;">&#41;</span> <span style="color: #66cc66;color: black;">&lt;</span> <span style="color: #ff4500;color: maroon;">1</span>:
  <span style="color: #ff7700;font-weight:bold;color: blue;">print</span> <span style="color: #483d8b;color: maroon;">&quot;Usage: &quot;</span> + argv<span style="color: black;color: black;">&#91;</span><span style="color: #ff4500;color: maroon;">0</span><span style="color: black;color: black;">&#93;</span> + \
    <span style="color: #483d8b;color: maroon;">&quot; [-s &lt;size (MiB)&gt;] [-a &lt;audio bit rate (kbps)&gt;] [-o &lt;additional options&gt;] &lt;file list&gt;&quot;</span>
  exit<span style="color: black;color: black;">&#40;</span><span style="color: #ff4500;color: maroon;">2</span><span style="color: black;color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;color: green;"># Loop through files</span>
<span style="color: #ff7700;font-weight:bold;color: blue;">for</span> <span style="color: #008000;color: blue;">file</span> <span style="color: #ff7700;font-weight:bold;color: blue;">in</span> args:
  duration = get_duration<span style="color: black;color: black;">&#40;</span><span style="color: #008000;color: blue;">file</span><span style="color: black;color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;color: blue;">if</span> duration <span style="color: #66cc66;color: black;">&lt;</span>= <span style="color: #ff4500;color: maroon;">0</span>:
    <span style="color: #ff7700;font-weight:bold;color: blue;">print</span> <span style="color: #483d8b;color: maroon;">&quot;Unable to get length of&quot;</span>, <span style="color: #008000;color: blue;">file</span>
    <span style="color: #ff7700;font-weight:bold;color: blue;">continue</span>
&nbsp;
  bitrate = calc_video_bitrate<span style="color: black;color: black;">&#40;</span>target_size, ab, duration<span style="color: black;color: black;">&#41;</span>
&nbsp;
  encode<span style="color: black;color: black;">&#40;</span><span style="color: #008000;color: blue;">file</span>, <span style="color: #008000;color: blue;">file</span> + <span style="color: #483d8b;color: maroon;">&quot;.mp4&quot;</span>, extra_options, bitrate, ab<span style="color: black;color: black;">&#41;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://www.helyar.net/2009/ffmpeg-target-file-sizes-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to set target file sizes in ffmpeg</title>
		<link>http://www.helyar.net/2009/how-to-set-target-file-sizes-in-ffmpeg/</link>
		<comments>http://www.helyar.net/2009/how-to-set-target-file-sizes-in-ffmpeg/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 21:29:39 +0000</pubDate>
		<dc:creator>George Helyar</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[aac]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[x264]]></category>

		<guid isPermaLink="false">http://www.helyar.net/?p=240</guid>
		<description><![CDATA[This script is now available as an ongoing project that can be downloaded. Please see the Video Encoding Project. This post describes the methods and mathematics behind the script. After much searching, I found almost nothing regarding how to target a specific file size with ffmpeg, such as 700MiB to fit on a CD. Almost [...]]]></description>
			<content:encoded><![CDATA[<p>This script is now available as an ongoing project that can be downloaded. Please see the <a href="http://www.helyar.net/enc">Video Encoding Project</a>. This post describes the methods and mathematics behind the script.<br />
<hr />
<p>After much searching, I found almost nothing regarding how to target a specific file size with ffmpeg, such as 700MiB to fit on a CD. Almost everything I found suggested to use a negative bitrate for mencoder, such as -700000. However, this did not work for me at all (even by copying and pasting verbatim). Because of this, I set about doing it manually with some mathematics.</p>
<p>What I am going to do here assumes a single audio stream, a single video stream and nothing else in the output file at all (i.e. no subtitles, no alternate languages, no director&#8217;s commentaries, etc).</p>
<p>When encoding media, audio uses a constant bit rate. This means that you can calculate how much space it will take if you know which bit rate you are using and how long the stream is in seconds. This also means that to know how big the video stream should be, we can calculate how big the audio stream will be and subtract it from the target file size. For example, if the target file size is 350MiB and the audio will take up 30MiB, we know the video should aim to be 320MiB (ignoring overheads in the multiplexing, container headers, etc). We can use the same calculations in reverse to work out an average or constant bit rate from a file size and a length in seconds.</p>
<p>In this example, I will be using <a href="http://www.amazon.co.uk/Dads-Army-Complete-Collection-DVD/dp/B000VA3J7K">Dad&#8217;s Army</a> Series 6 Episode 1 &#8211; The Deadly Attachment. I have already ripped this from the DVD with <a href="http://www.slysoft.com/en/anydvd.html">SlySoft AnyDVD</a> and PgcDemux on Windows. Automating PgcDemux rips is worth a whole entry in itself. Note that I have bought this legally and I do not intend to sell or share it. I just want a copy that I can store on my network and play from any computer. Storing 14 DVD images on hard drives takes quite a lot of space, which is where encoding comes in handy. In fact, some of my box sets contain over 60 DVDs (roughly 270GiB).</p>
<p>&#8212;&#8212;&#8212;-<br />
To install ffmpeg on Debian, it is best to get it from the Debian Multimedia repository. Add</p>
<pre>deb http://www.debian-multimedia.org lenny main
deb-src http://www.debian-multimedia.org lenny main</pre>
<p>to your /etc/apt/sources.list and then run</p>
<pre># apt-get update
# apt-get install debian-multimedia-keyring
# apt-get update
# apt-get install ffmpeg</pre>
<p>&#8212;&#8212;&#8212;-</p>
<p>The first thing we need to do to put this into practice is to get the length of the stream. If you supply the file to ffmpeg without telling it to do anything, it will give you an error. However, this error already contains all of the information we need:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: black;">$ <span style="color: #c20cb9; font-weight: bold;color: blue;">ffmpeg</span> <span style="color: #660033;">-i</span> da_6_01.VOB
FFmpeg version SVN-r13582, Copyright <span style="color: #7a0874; font-weight: bold;color: black;">&#40;</span>c<span style="color: #7a0874; font-weight: bold;color: black;">&#41;</span> <span style="color: #000000;color: maroon;">2000</span>-<span style="color: #000000;color: maroon;">2008</span> Fabrice Bellard, et al.
  configuration: <span style="color: #660033;">--prefix</span>=<span style="color: #000000; font-weight: bold;color: black;">/</span>usr ...
  built on May  <span style="color: #000000;color: maroon;">3</span> <span style="color: #000000;color: maroon;">2009</span> <span style="color: #000000;color: maroon;">12</span>:07:<span style="color: #000000;color: maroon;">18</span>, <span style="color: #c20cb9; font-weight: bold;color: blue;">gcc</span>: 4.3.2
Input <span style="color: #666666; font-style: italic;">#0, mpeg, from 'da_6_01.VOB':</span>
  Duration: 00:<span style="color: #000000;color: maroon;">29</span>:<span style="color: #000000;color: maroon;">23.90</span>, start: <span style="color: #000000;color: maroon;">0.287267</span>, bitrate: <span style="color: #000000;color: maroon;">5987</span> kb<span style="color: #000000; font-weight: bold;color: black;">/</span>s
    Stream <span style="color: #666666; font-style: italic;">#0.0[0x1e0]: Video: mpeg2video, yuv420p, 720x576 [PAR 16:15 DAR 4:3], 9800 kb/s, 25.00 tb(r)</span>
    Stream <span style="color: #666666; font-style: italic;">#0.1[0x80]: Audio: ac3, 48000 Hz, stereo, 192 kb/s</span>
Must supply at least one output <span style="color: #c20cb9; font-weight: bold;color: blue;">file</span></pre></div></div>

<p>We can see that the duration is 00:29:23.90.</p>
<p>As this is an error, we need to redirect stderr to stdout. This can be done with 2>&#038;1. We then need the line that contains the &#8220;Duration&#8221;, which we can get with grep. We can cut this line up to take the time out.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: black;">$ <span style="color: #c20cb9; font-weight: bold;color: blue;">ffmpeg</span> <span style="color: #660033;">-i</span> da_6_01.VOB <span style="color: #000000;color: maroon;">2</span><span style="color: #000000; font-weight: bold;color: black;">&gt;&amp;</span><span style="color: #000000;color: maroon;">1</span> <span style="color: #000000; font-weight: bold;color: black;">|</span> <span style="color: #c20cb9; font-weight: bold;color: blue;">grep</span> Duration <span style="color: #000000; font-weight: bold;color: black;">|</span> <span style="color: #c20cb9; font-weight: bold;color: blue;">cut</span> <span style="color: #660033;">-d</span> <span style="color: #ff0000;">' '</span> <span style="color: #660033;">-f</span> <span style="color: #000000;color: maroon;">4</span> <span style="color: #000000; font-weight: bold;color: black;">|</span> <span style="color: #c20cb9; font-weight: bold;color: blue;">cut</span> <span style="color: #660033;">-d</span> <span style="color: #ff0000;">'.'</span> <span style="color: #660033;">-f</span> <span style="color: #000000;color: maroon;">1</span>
00:<span style="color: #000000;color: maroon;">29</span>:<span style="color: #000000;color: maroon;">23</span></pre></div></div>

<p>This can be converted into seconds with the formula <code>s' = (h * 60 + m) * 60 + s</code>.</p>
<p>I used a python script to do this and to perform the necessary calculations mentioned earlier. Note that most of this python script is just for the convenience of getopts and that, if needed, it can be cut down significantly at the cost of flexibility. If you always want the same output size and audio bitrate, this script can be simplified to just a couple of lines.</p>
<p>calc_bitrate.py:</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;color: black;"><span style="color: #808080; font-style: italic;color: green;">#!/usr/bin/python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;color: blue;">from</span> <span style="color: #dc143c;color: blue;">getopt</span> <span style="color: #ff7700;font-weight:bold;color: blue;">import</span> <span style="color: #dc143c;color: blue;">getopt</span>, GetoptError
<span style="color: #ff7700;font-weight:bold;color: blue;">from</span> <span style="color: #dc143c;color: blue;">sys</span> <span style="color: #ff7700;font-weight:bold;color: blue;">import</span> argv, exit
&nbsp;
<span style="color: #ff7700;font-weight:bold;color: blue;">def</span> secs<span style="color: black;color: black;">&#40;</span>h, m, s<span style="color: black;color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;color: blue;">return</span> <span style="color: black;color: black;">&#40;</span>h <span style="color: #66cc66;color: black;">*</span> <span style="color: #ff4500;color: maroon;">60</span> + m<span style="color: black;color: black;">&#41;</span> <span style="color: #66cc66;color: black;">*</span> <span style="color: #ff4500;color: maroon;">60</span> + s
&nbsp;
<span style="color: #ff7700;font-weight:bold;color: blue;">def</span> calc_video_bitrate<span style="color: black;color: black;">&#40;</span>target_size, abr, <span style="color: #dc143c;color: blue;">time</span><span style="color: black;color: black;">&#41;</span>:
  target_bytes = target_size <span style="color: #66cc66;color: black;">*</span> <span style="color: #ff4500;color: maroon;">1024</span> <span style="color: #66cc66;color: black;">*</span> <span style="color: #ff4500;color: maroon;">1024</span>
  audio_bytes = <span style="color: black;color: black;">&#40;</span><span style="color: black;color: black;">&#40;</span>abr <span style="color: #66cc66;color: black;">*</span> <span style="color: #ff4500;color: maroon;">1000</span><span style="color: black;color: black;">&#41;</span> / <span style="color: #ff4500;color: maroon;">8</span><span style="color: black;color: black;">&#41;</span> <span style="color: #66cc66;color: black;">*</span> <span style="color: #dc143c;color: blue;">time</span>
  <span style="color: #ff7700;font-weight:bold;color: blue;">return</span> <span style="color: black;color: black;">&#40;</span>target_bytes - audio_bytes<span style="color: black;color: black;">&#41;</span> / <span style="color: #dc143c;color: blue;">time</span> <span style="color: #66cc66;color: black;">*</span> <span style="color: #ff4500;color: maroon;">8</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;color: blue;">try</span>:
  opts, args = <span style="color: #dc143c;color: blue;">getopt</span><span style="color: black;color: black;">&#40;</span>argv<span style="color: black;color: black;">&#91;</span><span style="color: #ff4500;color: maroon;">1</span>:<span style="color: black;color: black;">&#93;</span>, <span style="color: #483d8b;color: maroon;">&quot;s:a:t:&quot;</span>, <span style="color: black;color: black;">&#91;</span><span style="color: #483d8b;color: maroon;">&quot;size=&quot;</span>, <span style="color: #483d8b;color: maroon;">&quot;abr=&quot;</span>, <span style="color: #483d8b;color: maroon;">&quot;time=&quot;</span><span style="color: black;color: black;">&#93;</span><span style="color: black;color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;color: blue;">except</span> GetoptError, err:
  <span style="color: #ff7700;font-weight:bold;color: blue;">print</span> <span style="color: #008000;color: blue;">str</span><span style="color: black;color: black;">&#40;</span>err<span style="color: black;color: black;">&#41;</span>
  exit<span style="color: black;color: black;">&#40;</span><span style="color: #ff4500;color: maroon;">2</span><span style="color: black;color: black;">&#41;</span>
&nbsp;
target_size = <span style="color: #ff4500;color: maroon;">350</span> <span style="color: #808080; font-style: italic;color: green;">#MiB</span>
abr = <span style="color: #ff4500;color: maroon;">128</span> <span style="color: #808080; font-style: italic;color: green;">#kbps</span>
<span style="color: #dc143c;color: blue;">time</span> = <span style="color: #ff4500;color: maroon;">0</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;color: blue;">for</span> o, a <span style="color: #ff7700;font-weight:bold;color: blue;">in</span> opts:
  <span style="color: #ff7700;font-weight:bold;color: blue;">if</span> o <span style="color: #ff7700;font-weight:bold;color: blue;">in</span> <span style="color: black;color: black;">&#40;</span><span style="color: #483d8b;color: maroon;">&quot;-s&quot;</span>, <span style="color: #483d8b;color: maroon;">&quot;--size&quot;</span><span style="color: black;color: black;">&#41;</span>:
    target_size = <span style="color: #008000;color: blue;">int</span><span style="color: black;color: black;">&#40;</span>a<span style="color: black;color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;color: blue;">elif</span> o <span style="color: #ff7700;font-weight:bold;color: blue;">in</span> <span style="color: black;color: black;">&#40;</span><span style="color: #483d8b;color: maroon;">&quot;-a&quot;</span>, <span style="color: #483d8b;color: maroon;">&quot;--abr&quot;</span><span style="color: black;color: black;">&#41;</span>:
    abr = <span style="color: #008000;color: blue;">int</span><span style="color: black;color: black;">&#40;</span>a<span style="color: black;color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;color: blue;">if</span> <span style="color: #008000;color: blue;">len</span><span style="color: black;color: black;">&#40;</span>args<span style="color: black;color: black;">&#41;</span> <span style="color: #66cc66;color: black;">&lt;</span> <span style="color: #ff4500;color: maroon;">1</span>:
  <span style="color: #ff7700;font-weight:bold;color: blue;">print</span> <span style="color: #483d8b;color: maroon;">&quot;Usage: &quot;</span> + argv<span style="color: black;color: black;">&#91;</span><span style="color: #ff4500;color: maroon;">0</span><span style="color: black;color: black;">&#93;</span> + <span style="color: #483d8b;color: maroon;">&quot; [-s &lt;size (M)&gt;] [-a &lt;audio bit rate (k)&gt;] [[hh:]mm:]ss&quot;</span>
  exit<span style="color: black;color: black;">&#40;</span><span style="color: #ff4500;color: maroon;">2</span><span style="color: black;color: black;">&#41;</span>
&nbsp;
time_part = args<span style="color: black;color: black;">&#91;</span><span style="color: #ff4500;color: maroon;">0</span><span style="color: black;color: black;">&#93;</span>.<span style="color: black;color: black;">split</span><span style="color: black;color: black;">&#40;</span><span style="color: #483d8b;color: maroon;">&quot;:&quot;</span><span style="color: black;color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;color: blue;">if</span> <span style="color: #008000;color: blue;">len</span><span style="color: black;color: black;">&#40;</span>time_part<span style="color: black;color: black;">&#41;</span> <span style="color: #66cc66;color: black;">&lt;</span> <span style="color: #ff4500;color: maroon;">2</span>: time_part = <span style="color: black;color: black;">&#91;</span><span style="color: #ff4500;color: maroon;">0</span><span style="color: black;color: black;">&#93;</span> + time_part
<span style="color: #ff7700;font-weight:bold;color: blue;">if</span> <span style="color: #008000;color: blue;">len</span><span style="color: black;color: black;">&#40;</span>time_part<span style="color: black;color: black;">&#41;</span> <span style="color: #66cc66;color: black;">&lt;</span> <span style="color: #ff4500;color: maroon;">3</span>: time_part = <span style="color: black;color: black;">&#91;</span><span style="color: #ff4500;color: maroon;">0</span><span style="color: black;color: black;">&#93;</span> + time_part
<span style="color: #dc143c;color: blue;">time</span> = secs<span style="color: black;color: black;">&#40;</span><span style="color: #008000;color: blue;">int</span><span style="color: black;color: black;">&#40;</span>time_part<span style="color: black;color: black;">&#91;</span><span style="color: #ff4500;color: maroon;">0</span><span style="color: black;color: black;">&#93;</span><span style="color: black;color: black;">&#41;</span>, <span style="color: #008000;color: blue;">int</span><span style="color: black;color: black;">&#40;</span>time_part<span style="color: black;color: black;">&#91;</span><span style="color: #ff4500;color: maroon;">1</span><span style="color: black;color: black;">&#93;</span><span style="color: black;color: black;">&#41;</span>, <span style="color: #008000;color: blue;">int</span><span style="color: black;color: black;">&#40;</span>time_part<span style="color: black;color: black;">&#91;</span><span style="color: #ff4500;color: maroon;">2</span><span style="color: black;color: black;">&#93;</span><span style="color: black;color: black;">&#41;</span><span style="color: black;color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;color: blue;">print</span> <span style="color: #483d8b;color: maroon;">&quot;%d&quot;</span> <span style="color: #66cc66;color: black;">%</span> calc_video_bitrate<span style="color: black;color: black;">&#40;</span>target_size, abr, <span style="color: #dc143c;color: blue;">time</span><span style="color: black;color: black;">&#41;</span></pre></div></div>

<p>A typical usage for this would be <code>./calc_python.py -s 350 -a 128 29:23</code>.</p>
<p>We can then use a combination of these inside a shell script easily. I&#8217;m using bash syntax just to nest the commands into a single line but for compatibility with other shells, backticks (`) can be used and this is what I normally prefer. This script loops through all of the .VOB files in the directory and gives their target video bitrate for a 350MiB output and 128kbps audio.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: black;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #000000; font-weight: bold;color: blue;">for</span> vob <span style="color: #000000; font-weight: bold;color: blue;">in</span> <span style="color: #000000; font-weight: bold;color: black;">*</span>.VOB
<span style="color: #000000; font-weight: bold;color: blue;">do</span>
  <span style="color: #007800;">BR</span>=$<span style="color: #7a0874; font-weight: bold;color: black;">&#40;</span>.<span style="color: #000000; font-weight: bold;color: black;">/</span>calc_bitrate.py <span style="color: #660033;">-s</span> <span style="color: #000000;color: maroon;">350</span> <span style="color: #660033;">-a</span> <span style="color: #000000;color: maroon;">128</span> $<span style="color: #7a0874; font-weight: bold;color: black;">&#40;</span><span style="color: #c20cb9; font-weight: bold;color: blue;">ffmpeg</span> <span style="color: #660033;">-i</span> <span style="color: #007800;color: black;">$vob</span> <span style="color: #000000;color: maroon;">2</span><span style="color: #000000; font-weight: bold;color: black;">&gt;&amp;</span><span style="color: #000000;color: maroon;">1</span> <span style="color: #000000; font-weight: bold;color: black;">|</span> <span style="color: #c20cb9; font-weight: bold;color: blue;">grep</span> Duration <span style="color: #000000; font-weight: bold;color: black;">|</span> <span style="color: #c20cb9; font-weight: bold;color: blue;">cut</span> <span style="color: #660033;">-d</span> <span style="color: #ff0000;">' '</span> <span style="color: #660033;">-f</span> <span style="color: #000000;color: maroon;">4</span> <span style="color: #000000; font-weight: bold;color: black;">|</span> <span style="color: #c20cb9; font-weight: bold;color: blue;">cut</span> <span style="color: #660033;">-d</span> <span style="color: #ff0000;">'.'</span> <span style="color: #660033;">-f</span> <span style="color: #000000;color: maroon;">1</span><span style="color: #7a0874; font-weight: bold;color: black;">&#41;</span><span style="color: #7a0874; font-weight: bold;color: black;">&#41;</span>
  <span style="color: #7a0874; font-weight: bold;color: blue;">echo</span> <span style="color: #007800;color: black;">$vob</span> <span style="color: #007800;color: black;">$BR</span>
<span style="color: #000000; font-weight: bold;color: blue;">done</span></pre></div></div>

<p>I use this in 2-pass VBR mode with the libx264 video encoder and libfaac audio encoder in an mp4 container just by replacing the &#8220;echo&#8221; line of the above script with the following 2 lines:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;color: black;"><span style="color: #c20cb9; font-weight: bold;color: blue;">ffmpeg</span> <span style="color: #660033;">-i</span> <span style="color: #007800;color: black;">$vob</span> <span style="color: #660033;">-an</span> <span style="color: #660033;">-pass</span> <span style="color: #000000;color: maroon;">1</span> <span style="color: #660033;">-vcodec</span> libx264 <span style="color: #660033;">-vpre</span> fastfirstpass <span style="color: #660033;">-b</span> <span style="color: #007800;color: black;">$BR</span> <span style="color: #660033;">-bt</span> <span style="color: #007800;color: black;">$BR</span> <span style="color: #660033;">-deinterlace</span> <span style="color: #660033;">-threads</span> <span style="color: #000000;color: maroon;">0</span> <span style="color: #660033;">-y</span> pass1.mp4
<span style="color: #c20cb9; font-weight: bold;color: blue;">ffmpeg</span> <span style="color: #660033;">-i</span> <span style="color: #007800;color: black;">$vob</span> <span style="color: #660033;">-acodec</span> libfaac <span style="color: #660033;">-ab</span> 128k <span style="color: #660033;">-ac</span> <span style="color: #000000;color: maroon;">2</span> <span style="color: #660033;">-pass</span> <span style="color: #000000;color: maroon;">2</span> <span style="color: #660033;">-vcodec</span> libx264 <span style="color: #660033;">-vpre</span> hq <span style="color: #660033;">-b</span> <span style="color: #007800;color: black;">$BR</span> <span style="color: #660033;">-bt</span> <span style="color: #007800;color: black;">$BR</span> <span style="color: #660033;">-deinterlace</span> <span style="color: #660033;">-threads</span> <span style="color: #000000;color: maroon;">0</span> <span style="color: #660033;">-y</span> <span style="color: #000000; font-weight: bold;color: black;">`</span><span style="color: #7a0874; font-weight: bold;color: blue;">echo</span> <span style="color: #007800;color: black;">$vob</span> <span style="color: #000000; font-weight: bold;color: black;">|</span> <span style="color: #c20cb9; font-weight: bold;color: blue;">sed</span> <span style="color: #ff0000;">'s/VOB/mp4/'</span><span style="color: #000000; font-weight: bold;color: black;">`</span></pre></div></div>

<p>I have 2 versions of this script, one with &#8220;-deinterlace&#8221; and one without. PAL video (576i &#8211; used in Europe), such as Dad&#8217;s Army needs deinterlacing. NTSC video (480 &#8211; used in North America) usually does not.</p>
<p>For ripping DVDs to H.264 and maintaining the quality, I wouldn&#8217;t use a bitrate lower than 1000k or an audio bitrate lower than 128k stereo. This means that for getting media onto a CD, you probably want no smaller than 350MiB for 30 to 40 minutes or 700MiB for 1 hour or more, depending on your resolution. Also note that I only intend to play these in computers and fitting them onto CDs is just a convenience &#8211; standalone DVD players will not be able to play H.264 or AAC (Blu-ray and HDDVD players may be able to &#8211; mp4 containers and reading CDs would be more of an issue).</p>
<h3>Update:</h3>
<p>I have successfully tested this in a LG BD370 Blu-ray player.</p>
<p>I have not tried actually burning these onto CDs yet so if 2 won&#8217;t fit on a 700MiB CD, even with overburn (because of overheads that were ignored, as stated earlier) then the simplest solution is to just target a smaller file size with something like &#8220;-s 348&#8243;.</p>
<h2>The result</h2>
<p>Dad&#8217;s Army episodes are not all of the same length. Some are several minutes longer than others. The following shows how no matter the size of the input file, they all produce the same size output file:
<pre>$ ll da_5_*.VOB
-r--r--r-- 1 mythtv mythtv 1364660224 2009-06-04 00:01 da_5_01.VOB
-r--r--r-- 1 mythtv mythtv 1360699392 2009-06-04 00:01 da_5_02.VOB
-r--r--r-- 1 mythtv mythtv  956084224 2009-06-04 00:02 da_5_03.VOB
-r--r--r-- 1 mythtv mythtv 1355888640 2009-06-04 00:02 da_5_04.VOB
-r--r--r-- 1 mythtv mythtv 1114351616 2009-06-03 23:59 da_5_05.VOB
-r--r--r-- 1 mythtv mythtv 1034289152 2009-06-04 00:00 da_5_06.VOB
-r--r--r-- 1 mythtv mythtv 1045202944 2009-06-04 00:00 da_5_07.VOB
-r--r--r-- 1 mythtv mythtv 1345318912 2009-06-04 00:00 da_5_08.VOB
-r--r--r-- 1 mythtv mythtv 1391529984 2009-06-04 00:02 da_5_09.VOB
-r--r--r-- 1 mythtv mythtv 1342748672 2009-06-04 00:03 da_5_10.VOB
-r--r--r-- 1 mythtv mythtv 1158017024 2009-06-04 00:03 da_5_11.VOB
-r--r--r-- 1 mythtv mythtv 1157097472 2009-06-04 00:03 da_5_12.VOB
-r--r--r-- 1 mythtv mythtv 1180098560 2009-06-04 00:04 da_5_13.VOB
$ ll -h da_5_*.mp4
-rw-r--r-- 1 mythtv mythtv 352M 2009-06-17 06:18 da_5_01.mp4
-rw-r--r-- 1 mythtv mythtv 352M 2009-06-17 06:55 da_5_02.mp4
-rw-r--r-- 1 mythtv mythtv 352M 2009-06-17 07:30 da_5_03.mp4
-rw-r--r-- 1 mythtv mythtv 352M 2009-06-17 08:08 da_5_04.mp4
-rw-r--r-- 1 mythtv mythtv 352M 2009-06-17 08:44 da_5_05.mp4
-rw-r--r-- 1 mythtv mythtv 352M 2009-06-17 09:21 da_5_06.mp4
-rw-r--r-- 1 mythtv mythtv 352M 2009-06-17 09:58 da_5_07.mp4
-rw-r--r-- 1 mythtv mythtv 352M 2009-06-17 10:36 da_5_08.mp4
-rw-r--r-- 1 mythtv mythtv 352M 2009-06-17 11:15 da_5_09.mp4
-rw-r--r-- 1 mythtv mythtv 352M 2009-06-17 11:54 da_5_10.mp4
-rw-r--r-- 1 mythtv mythtv 352M 2009-06-17 12:29 da_5_11.mp4
-rw-r--r-- 1 mythtv mythtv 352M 2009-06-17 13:05 da_5_12.mp4
-rw-r--r-- 1 mythtv mythtv 352M 2009-06-17 13:41 da_5_13.mp4</pre>
<h2>Update:</h2>
<p>A pure python replacement script is available <a href="http://www.helyar.net/2009/ffmpeg-target-file-sizes-again/">here</a> that simplifies use.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.helyar.net/2009/how-to-set-target-file-sizes-in-ffmpeg/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

