<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>finding the first frame in an mp3 file</title>
		<link>http://www.allegro.cc/forums/view/591512</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 22 May 2007 16:22:58 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I wrote a small streaming mp3 server and I&#39;d like to know what the bitrate of the mp3 is, so according to various sites( like <a href="http://www.mp3-tech.org/programmer/frame_header.html">http://www.mp3-tech.org/programmer/frame_header.html</a> ) I should be able to read the first 4 bytes of the frame and figure things out from there. That works fine as long as I can find the first frame but therein lies my problem: how do I find the first frame?</p><p>I googled around for a bit and looked at the sources to mpg123 but the code is a huge mess and hard to work through. As a quick hack I searched for the first byte of value 255( the frame sync byte ) which works for a handful of mp3&#39;s but some mp3&#39;s have a 255 somewhere in the id3 tag part or whatever which results in me calculating bogus bitrate values.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kazzmir)</author>
		<pubDate>Tue, 22 May 2007 08:20:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This might be what you are looking for <a href="http://www.codeproject.com/audio/mp3info-by-shoonya.asp">clicky</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ixilom)</author>
		<pubDate>Tue, 22 May 2007 10:39:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>MPEG audio isn&#39;t very intuitive. Unlike video and system streams, it doesn&#39;t use markers, it&#39;s just raw compressed data. However, the way you check for a header is:
</p><div class="source-code snippet"><div class="inner"><pre><span class="c">/* This should give a good guess if we have an MPEG audio header */</span>
<span class="k1">if</span><span class="k2">(</span>header<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0xff</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span><span class="k2">(</span>header<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k3">&gt;</span><span class="k3">&gt;</span><span class="n">5</span><span class="k2">)</span><span class="k3">&amp;</span><span class="n">0x7</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">0x7</span> <span class="k3">&amp;</span><span class="k3">&amp;</span>
   <span class="k2">(</span><span class="k2">(</span>header<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k3">&gt;</span><span class="k3">&gt;</span><span class="n">1</span><span class="k2">)</span><span class="k3">&amp;</span><span class="n">0x3</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span><span class="k2">(</span>header<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k3">&gt;</span><span class="k3">&gt;</span><span class="n">4</span><span class="k2">)</span><span class="k3">&amp;</span><span class="n">0xf</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0xf</span> <span class="k3">&amp;</span><span class="k3">&amp;</span>
   <span class="k2">(</span><span class="k2">(</span>header<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k3">&gt;</span><span class="k3">&gt;</span><span class="n">2</span><span class="k2">)</span><span class="k3">&amp;</span><span class="n">0x3</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0x3</span><span class="k2">)</span>
    <span class="c">/* got mpeg audio header */</span><span class="k2">;</span>
</pre></div></div><p>
Note that that&#39;s an array of bytes read directly (not endian converted). If the above check fails, then you shift by one byte (<span class="source-code">header<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> header<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span>header<span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span> header<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">;</span>header<span class="k2">[</span><span class="n">2</span><span class="k2">]</span> <span class="k3">=</span> header<span class="k2">[</span><span class="n">3</span><span class="k2">]</span><span class="k2">;</span></span>), put the next byte into <tt>header[3]</tt>, and check again (ad infinitum, until you get tired of looking).</p><p>This can lead to false positives, though, if it&#39;s not actually an MPEG audio stream, or possibly even with compressed audio data that happens to take the form of a header.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Tue, 22 May 2007 16:22:58 +0000</pubDate>
	</item>
</rss>
