minor formatting
[flac.git] / doc / html / faq.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2 <!-- Copyright (c)  2000,2001,2002,2003  Josh Coalson -->
3 <!-- Permission is granted to copy, distribute and/or modify this document -->
4 <!-- under the terms of the GNU Free Documentation License, Version 1.1 -->
5 <!-- or any later version published by the Free Software Foundation; -->
6 <!-- with no invariant sections. -->
7 <!-- A copy of the license can be found at http://www.gnu.org/copyleft/fdl.html -->
8 <HTML>
9 <HEAD>
10         <TITLE>FLAC - faq</TITLE>
11 </HEAD>
12
13 <BODY MARGINWIDTH="0" MARGINHEIGHT="0" LEFTMARGIN="0" RIGHTMARGIN="0" TOPMARGIN="0" BGCOLOR="#99CC99" TEXT="#000000" LINK="#336699" VLINK="#336699" ALINK="#336699">
14
15 <TABLE BORDER=0 WIDTH="100%" CELLPADDING=1 CELLSPACING=0>
16         <TR>
17                 <TD ALIGN="CENTER" BGCOLOR="#000000"><A HREF="http://flac.sourceforge.net/"><IMG SRC="images/logo.jpg" ALIGN=CENTER ALT="FLAC Logo" BORDER=0 HSPACE=0></a></TD>
18         </TR>
19 </TABLE>
20
21 <TABLE WIDTH="100%" CELLPADDING="0" CELLSPACING="0" BORDER="0"><TR BGCOLOR="#99CC99"><TD><IMG SRC="images/1x1.gif" WIDTH="1" HEIGHT="25" ALT=""></TD></TR></TABLE>
22
23 <TABLE WIDTH="100%" CELLPADDING="0" CELLSPACING="0" BORDER="0"><TR BGCOLOR="#000000"><TD><IMG SRC="images/1x1.gif" WIDTH="1" HEIGHT="2" ALT=""></TD></TR></TABLE>
24
25 <TABLE WIDTH="100%" CELLPADDING=0 CELLSPACING=0 BORDER=0>
26         <TR>
27                 <TD ALIGN="CENTER" BGCOLOR="#D3D4C5">
28                         <TABLE CELLPADDING=0 CELLSPACING=0 BORDER=0>
29                                 <TR>
30                                         <TD HEIGHT=22 BGCOLOR="#D3D4C5" ALIGN=CENTER NOWRAP>&nbsp;&nbsp;<A CLASS="topnav" HREF="index.html">home</A>&nbsp;&nbsp;</TD><TD BGCOLOR="#D3D4C5" ALIGN=CENTER>|</TD>
31                                         <TD           BGCOLOR="#D3D4C5" ALIGN=CENTER NOWRAP>&nbsp;&nbsp;faq&nbsp;&nbsp;</TD><TD BGCOLOR="#D3D4C5" ALIGN=CENTER>|</TD>
32                                         <TD           BGCOLOR="#D3D4C5" ALIGN=CENTER NOWRAP>&nbsp;&nbsp;<A CLASS="topnav" HREF="news.html">news</A>&nbsp;&nbsp;</TD><TD BGCOLOR="#D3D4C5" ALIGN=CENTER>|</TD>
33                                         <TD           BGCOLOR="#D3D4C5" ALIGN=CENTER NOWRAP>&nbsp;&nbsp;<A CLASS="topnav" HREF="download.html">download</A>&nbsp;&nbsp;</TD><TD BGCOLOR="#D3D4C5" ALIGN=CENTER>|</TD>
34                                         <TD           BGCOLOR="#D3D4C5" ALIGN=CENTER NOWRAP>&nbsp;&nbsp;<A CLASS="topnav" HREF="features.html">features</A>&nbsp;&nbsp;</TD><TD BGCOLOR="#D3D4C5" ALIGN=CENTER>|</TD>
35                                         <TD           BGCOLOR="#D3D4C5" ALIGN=CENTER NOWRAP>&nbsp;&nbsp;<A CLASS="topnav" HREF="goals.html">goals</A>&nbsp;&nbsp;</TD><TD BGCOLOR="#D3D4C5" ALIGN=CENTER>|</TD>
36                                         <TD           BGCOLOR="#D3D4C5" ALIGN=CENTER NOWRAP>&nbsp;&nbsp;<A CLASS="topnav" HREF="format.html">format</A>&nbsp;&nbsp;</TD><TD BGCOLOR="#D3D4C5" ALIGN=CENTER>|</TD>
37                                         <TD           BGCOLOR="#D3D4C5" ALIGN=CENTER NOWRAP>&nbsp;&nbsp;<A CLASS="topnav" HREF="id.html">id</A>&nbsp;&nbsp;</TD><TD BGCOLOR="#D3D4C5" ALIGN=CENTER>|</TD>
38                                         <TD           BGCOLOR="#D3D4C5" ALIGN=CENTER NOWRAP>&nbsp;&nbsp;<A CLASS="topnav" HREF="comparison.html">comparison</A>&nbsp;&nbsp;</TD><TD BGCOLOR="#D3D4C5" ALIGN=CENTER>|</TD>
39                                         <TD           BGCOLOR="#D3D4C5" ALIGN=CENTER NOWRAP>&nbsp;&nbsp;<A CLASS="topnav" HREF="documentation.html">documentation</A>&nbsp;&nbsp;</TD><TD BGCOLOR="#D3D4C5" ALIGN=CENTER>|</TD>
40                                         <TD           BGCOLOR="#D3D4C5" ALIGN=CENTER NOWRAP>&nbsp;&nbsp;<A CLASS="topnav" HREF="developers.html">developers</A>&nbsp;&nbsp;</TD>
41                                 </TR>
42                         </TABLE>
43                 </TD>
44         </TR>
45 </TABLE>
46
47 <TABLE WIDTH="100%" CELLPADDING="0" CELLSPACING="0" BORDER="0"><TR BGCOLOR="#000000"><TD><IMG SRC="images/1x1.gif" WIDTH="1" HEIGHT="2" ALT=""></TD></TR></TABLE>
48
49 <TABLE WIDTH="100%" CELLPADDING=0 CELLSPACING=0 BORDER=0>
50         <TR>
51                 <TD ALIGN="CENTER" BGCOLOR="#EEEED4">
52                         <TABLE CELLPADDING=0 CELLSPACING=0 BORDER=0>
53                                 <TR>
54                                         <TD HEIGHT=22 BGCOLOR="#EEEED4" ALIGN=CENTER NOWRAP>&nbsp;&nbsp;english&nbsp;&nbsp;</TD><TD BGCOLOR="#EEEED4" ALIGN=CENTER>|</TD>
55                                         <TD           BGCOLOR="#EEEED4" ALIGN=CENTER NOWRAP>&nbsp;&nbsp;<A CLASS="topnav" HREF="ru/faq.html">russian</A>&nbsp;&nbsp;</TD>
56                                 </TR>
57                         </TABLE>
58                 </TD>
59         </TR>
60 </TABLE>
61
62 <TABLE WIDTH="100%" CELLPADDING="0" CELLSPACING="0" BORDER="0"><TR BGCOLOR="#000000"><TD><IMG SRC="images/1x1.gif" WIDTH="1" HEIGHT="2" ALT=""></TD></TR></TABLE>
63
64 <CENTER>
65
66 <TABLE WIDTH="100%" CELLPADDING="0" CELLSPACING="0" BORDER="0"><TR BGCOLOR="#99CC99"><TD><IMG SRC="images/1x1.gif" WIDTH="1" HEIGHT="15" ALT=""></TD></TR></TABLE>
67
68
69 <TABLE WIDTH="100%" CELLPADDING="5" CELLSPACING="5" BORDER="0">
70 <TR><TD>
71         <TABLE WIDTH="100%" CELLPADDING="0" CELLSPACING="0" BORDER="0"><TR BGCOLOR="#000000"><TD><IMG SRC="images/1x1.gif" WIDTH="1" HEIGHT="1" ALT=""></TD></TR></TABLE>
72         <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#D3D4C5">
73                 <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial">
74                 <B><FONT SIZE="+2">faq</FONT></B>
75                 </FONT></TD></TR>
76         </TABLE>
77         <TABLE WIDTH="100%" CELLPADDING="0" CELLSPACING="0" BORDER="0"><TR BGCOLOR="#000000"><TD><IMG SRC="images/1x1.gif" WIDTH="1" HEIGHT="1" ALT=""></TD></TR></TABLE>
78         <TABLE CELLSPACING="0" CELLPADDING="3" WIDTH="100%" BORDER="0" BGCOLOR="#EEEED4">
79         <TR><TD><FONT FACE="Lucida,Verdana,Helvetica,Arial">
80
81         <P>
82                 <B>General</B>
83         <BR>
84         <UL>
85                 <LI>
86                         <A HREF="#joke"><B>Your codec seems to have the momentum of a runaway freight train.  Why is it so popular?</B></A>
87                 </LI>
88                 <LI>
89                         <A HREF="#general__tagging"><B>What kinds of tags does FLAC support?</B></A>
90                 </LI>
91                 <LI>
92                         <A HREF="#general__native_vs_ogg"><B>What is the difference between (native) FLAC and Ogg FLAC?</B></A>
93                 </LI>
94                 <LI>
95                         <A HREF="#general__native_or_ogg"><B>Which should I use, (native) FLAC or Ogg FLAC?</B></A>
96                 </LI>
97                 <LI>
98                         <A HREF="#general__no_cuesheet_tags"><B>Why aren't PERFORMER/TITLE/etc tags stored in the FLAC CUESHEET block?</B></A>
99                 </LI>
100                 <LI>
101                         <A HREF="#general__asymmetry"><B>Why do the encoder settings have a big effect on the encoding time but not the decoding time?</B></A>
102                 </LI>
103                 <LI>
104                         <A HREF="#general__alternatives"><B>Why use FLAC instead of other codecs that compress more?</B></A>
105                 </LI>
106                 <LI>
107                         <A HREF="#general__encode_faster"><B>Why can't you make FLAC encode faster?</B></A>
108                 </LI>
109                 <LI>
110                         <A HREF="#general__lossless_trust"><B>How can I be sure FLAC is lossless?</B></A>
111                 </LI>
112                 <LI>
113                         <A HREF="#general__testing"><B>How much testing has been done on FLAC?</B></A>
114                 </LI>
115                 <LI>
116                         <A HREF="#general__wave_flac_wave"><B>I compressed a WAVE file to FLAC, then decompressed to WAVE, and the two weren't identical.  Why?</B></A>
117                 </LI>
118                 <LI>
119                         <A HREF="#general__skipped_subchunk"><B>I compressed a WAVE file to FLAC and it said "warning: skipping unknown sub-chunk LIST".  Why?</B></A>
120                 </LI>
121                 <LI>
122                         <A HREF="#general__two_bytes_short"><B>I decoded a FLAC file and the WAVE is 2 bytes shorter than the original.  Why?</B></A>
123                 </LI>
124                 <LI>
125                         <A HREF="#general__lowest_bitrate"><B>What is the lowest bitrate achieveable with FLAC?</B></A>
126                 </LI>
127         </UL>
128         </P>
129
130         <P>
131                 <B>Tools</B>
132         <BR>
133         <UL>
134                 <LI>
135                         <A HREF="#tools__option_blocking"><B>How do I encode a file that starts with a dash?</B></A>
136                 </LI>
137                 <LI>
138                         <A HREF="#tools__long_meta_edits"><B>Why does it take so long to edit some FLAC files with metaflac?</B></A>
139                 </LI>
140                 <LI>
141                         <A HREF="#tools__not_streamable"><B>Why did I get "ERROR initializing encoder, state = 14:FLAC__STREAM_ENCODER_NOT_STREAMABLE"?</B></A>
142                 </LI>
143         </UL>
144         </P>
145
146         <P>
147                 <B>API</B>
148         <BR>
149         <UL>
150                 <LI>
151                         <A HREF="#api__frame_length"><B>How can I determine the encoded frame length?</B></A>
152                 </LI>
153         </UL>
154         </P>
155
156         <P>
157                 <B>Project</B>
158         <BR>
159         <UL>
160         </UL>
161         </P>
162
163         <H2>
164                 <B>General</B>
165         </H2>
166         <P>
167                 <A NAME="joke"><B>Your codec seems to have the momentum of a runaway freight train.  Why is it so popular?</B></A>
168         </P>
169         <P>
170                 Just kidding.  Only real questions here.
171         </P>
172         <P>
173                 <A NAME="general__tagging"><B>What kinds of tags does FLAC support?</B></A>
174         </P>
175         <P>
176                 FLAC has it's own native tagging system which is identical to that of Vorbis.  They are called alternately "FLAC tags" and "Vorbis comments".  It is the only tagging system required and guaranteed to be supported by FLAC implementations.
177         </P>
178         <P>
179                 Out of convenience, some plugins and implementations allow and also read other kinds of tags.  For example, the official FLAC Winamp and XMMS plugins can also read ID3 v1 and v2 tags in addition to FLAC tags.  The reference decoder knows how to skip ID3 tags so that they don't interfere with decoding.  But you should not expect any tags beside FLAC tags to be supported in all applications; some implementations may not even be able to decode a FLAC file with ID3 tags.
180         </P>
181         <P>
182                 <A NAME="general__native_vs_ogg"><B>What is the difference between (native) FLAC and Ogg FLAC?</B></A>
183         </P>
184         <P>
185                 You can think of an audio codec as having two layers.  The inside layer is the raw compressed data, and the outside layer is the "container" or "transport layer" that breaks the compressed data into pieces so it can be seeked through, edited, etc.
186         </P>
187         <P>
188                 "Native" FLAC is the compressed FLAC data stored in a very minimalist container, designed to be very efficient at storing single audio streams.
189         </P>
190         <P>
191                 Ogg FLAC is the compressed FLAC data stored in an <A HREF="http://xiph.org/ogg/vorbis/doc/oggstream.html">Ogg container</A>.  Ogg is a much more powerful transport layer that enables mixing several kinds of different streams (audio, data, metadata, etc).  The overhead is slightly higher than with native FLAC.
192         </P>
193         <P>
194                 In either case, the compressed FLAC data is the same and one can be converted to the other without re-encoding.
195         </P>
196         <P>
197                 <A NAME="general__native_or_ogg"><B>Which should I use, (native) FLAC or Ogg FLAC?</B></A>
198         </P>
199         <P>
200                 The short answer right now is probably "native FLAC".  If all you are doing is compressing audio to be played back later, native FLAC will do everything you need, is more widely supported, and will yield smaller files.  If you plan to edit the compressed audio, or want to multiplex the audio with video later in an Ogg container, Ogg FLAC is a better choice.
201         </P>
202         <P>
203                 Note that seeking in Ogg FLAC is not yet supported but will be in the next release.
204         </P>
205         <P>
206                 <A NAME="general__no_cuesheet_tags"><B>Why aren't PERFORMER/TITLE/etc tags stored in the FLAC CUESHEET block?</B></A>
207         </P>
208         <P>
209                 This has turned out to be a pretty polarizing issue and requires a long explanation.
210         </P>
211         <P>
212                 The original purpose of a cue sheet in CD authoring software was to lay out the disc, essentially specifying how the audio will be organized on the disc; some of the information ends up as the CD table of contents: the track numbers and locations, and the index points.  Later CD-TEXT was added.  But CD-TEXT is a very complex spec, and actually goes in the CD subcode data.  It is internationalized, not through Unicode, but with several different character sets, some of them multi-byte.  It even allows for graphics.  In cue sheets, the TITLE/PERFORMER/etc tags are just a limited shorthand for authoring, but when you rip, you almost never parse the CD-TEXT, you get it from another database, and it doesn't really belong in the FLAC CUESHEET block.
213         </P>
214         <P>
215                 For FLAC the intention is that applications can calculate the CDDB or CDindex ID from the CUESHEET block and look it up in an online or local database just like CD players do.  But if you really want it in the file itself, the track metadata really should be stored separate from the CUESHEET, and already can be because of FLAC's metadata system.  There just isn't one specified yet because as soon as it is, people will say that it's not flexible enough.  From experience (and you can see this come up time and time again in many lists), anyone who is going to the trouble of keeping a lossless collection in the first place will already be picky about metadata, and it is hard to come up with a standard that will please even the majority.  That is the big problem with metadata and is why Xiph has deferred on it, waiting for someone to come up with a good metadata spec that can me multiplexed together with data.
216         </P>
217         <P>
218                 Some players (for example Foobar2000) allow you to store the CDDB data as FLAC tags and can parse that.
219         </P>
220         <P>
221                 <A NAME="general__asymmetry"><B>Why do the encoder settings have a big effect on the encoding time but not the decoding time?</B></A>
222         </P>
223         <P>
224                 It's hard to explain without going into the codec design, but to oversimplify, the encoder is looking for functions that approximate the signal.  Higher settings make the encoder search more to find better approximations.  The functions are themselves encoded in the FLAC file.  Decoding only requires computing the one function, and the complexity of the function is vary stable.  This is by design, to make decoding easier, and is one of the things that makes FLAC easy to implement in hardware.
225         </P>
226         <P>
227                 <A NAME="general__alternatives"><B>Why use FLAC instead of other codecs that compress more?</B></A>
228         </P>
229         <P>
230                 For most users, a small difference in filesize is usually far outweighed by FLAC's advantages: open patent free codec, portable open source (BSD) reference implementation, documented API, multi-platform support, hardware support, multi-channel support, etc.  Improving FLAC to get a little more compression is not worth making it more complex and more compute-intensive to decode, and hence, less likely to be supported in hardware.
231         </P>
232         <P>
233                 <A NAME="general__encode_faster"><B>Why can't you make FLAC encode faster?</B></A>
234         </P>
235         <P>
236                 FLAC already encodes pretty fast.  It is faster than real-time even on weak systems and is not much slower than even the fastest codecs.  And it is usually faster than the CD ripping process with which it is usually paired, meaning even if it went faster, it would not speed up the ripping-encoding process anyway.
237         </P>
238         <P>
239                 Part of the reason is that FLAC is asymmetric <A HREF="#general__asymmetry">(see also)</A>.  That means that it is optimized for decoding speed at the expense of encoding speed, because it makes it easier to decode on low-powered hardware, and because you only encode once but you decode many times.  
240         </P>
241         <P>
242                 <A NAME="general__lossless_trust"><B>How can I be sure FLAC is lossless?</B></A>
243                 <BR>
244                 <A NAME="general__testing"><B>How much testing has been done on FLAC?</B></A>
245         </P>
246         <P>
247                 First, FLAC is probably the only lossless compressor that has a published and comprehensive test suite.  With the others you rely on the author's personal testing or the longevity of the program.  But with FLAC you can check out the whole test suite and run it on any version you like, or alter it to test your own data.  The test suite checks every function in the API, as well as running many thousands of streams through an encode-decode-verify process, to test every nook and cranny of the system.  Even on a fast machine the full test suite takes hours.  The full test suite must pass on several platforms before a release is made.
248         </P>
249         <P>
250                 Second, you can always use the <TT>-V</TT> option with <TT>flac</TT> (also supported by most GUI frontends) to verify while encoding.  With this option, a decoder is run in parallel to the encoder and its output is compared against the original input.  If a difference is found <TT>flac</TT> will stop with an error.
251         </P>
252         <P>
253                 Finally, FLAC is used by many people and has been judged stable enough by many software and hardware makers to be incorporated into their products.
254         </P>
255         <P>
256                 <A NAME="general__wave_flac_wave"><B>I compressed a WAVE file to FLAC, then decompressed to WAVE, and the two weren't identical.  Why?</B></A>
257                 <BR>
258                 <A NAME="general__skipped_subchunk"><B>I compressed a WAVE file to FLAC and it said "warning: skipping unknown sub-chunk LIST".  Why?</B></A>
259         </P>
260         <P>
261                 WAVE is a complicated standard; many kinds of data besides audio data can be put in it.  Most likely what has happened is that the application that created the original WAVE file also added some extra information for it's own use, which FLAC does not store or recreate.  But the audio data in the two WAVE files will be identical.  There are other tools to compare just the audio content of two WAVE files; <A HREF="http://www.exactaudiocopy.de/">ExactAudioCopy</A> has such a feature.  <A HREF="#general__two_bytes_short">(see also)</A>
262         </P>
263         <P>
264                 For the more technically inclined, FLAC only stores what is in the 'fmt ' and 'data' sub-chunks.
265         </P>
266         <P>
267                 <A NAME="general__two_bytes_short"><B>I decoded a FLAC file and the WAVE is 2 bytes shorter than the original.  Why?</B></A>
268         </P>
269         <P>
270                 The difference is probably an 18-byte 'fmt ' subchunk in the original WAVE vs. a 16-byte one in the decoded WAVE.  With WAVE there is more than one way to right identical formatting information, but FLAC always writes the most common form.  <A HREF="#general__wave_flac_wave">(see also)</A>
271         </P>
272         <P>
273                 <A NAME="general__lowest_bitrate"><B>What is the lowest bitrate achieveable with FLAC?</B></A>
274         </P>
275         <P>
276                 With FLAC you do not specify a bitrate like with some lossy codecs.  It's more like specifying a quality with Vorbis or MPC, except with FLAC the quality is always "lossless" and the resulting bitrate is roughly proportional to the amount of information in the original signal.  You cannot control the bitrate and the result can be from around 100% of the input rate (if you are encoding noise), down to almost 0 (encoding silence).
277         </P>
278
279         <H2>
280                 <B>Tools</B>
281         </H2>
282         <P>
283                 <A NAME="tools__option_blocking"><B>How do I encode a file that starts with a dash?</B></A>
284         </P>
285         <P>
286                 When using <TT>flac</TT> to encode on the command-line, a file that starts with a dash will be treated as an option, but there is a simple workaround.  Use <TT>--</TT> to signal the end of options and the beginning of filenames, like so:
287         </P>
288         <P>
289                 <TT>flac -V -- -01-name.wav</TT>
290         </P>
291         <P>
292                 <A NAME="tools__long_meta_edits"><B>Why does it take so long to edit some FLAC files with metaflac?</B></A>
293         </P>
294         <P>
295                 Since metadata is stored at the beginning of a FLAC file, changing the length of it can sometimes cause the whole file to be rewritten.  You can avoid this by adding padding with <TT>flac</TT> when you encode, or with <TT>metaflac</TT> after encoding.  By default, <TT>flac</TT> adds 4k of padding; you can change this amount if you need more or less.
296         </P>
297         <P>
298                 <A NAME="tools__not_streamable"><B>Why did I get "ERROR initializing encoder, state = 14:FLAC__STREAM_ENCODER_NOT_STREAMABLE"?</B></A>
299         </P>
300         <P>
301                 You specified encoding options that are outside the <A HREF="format.html#subset">Streamable subset</A>.  If that is what you really wanted, you must also use <TT>flac --lax</TT>.
302         </P>
303
304         <H2>
305                 <B>API</B>
306         </H2>
307         <P>
308                 <A NAME="api__frame_length"><B>How can I determine the encoded frame length?</B></A>
309         </P>
310         <P>
311                 With native FLAC, it is not possible to determine the frame length without decoding.  Probably if I had it all to do again I would have constrained the possible block sizes, which would have made it more practical to put the frame length in the frame header.
312         </P>
313         <P>
314                 With Ogg FLAC, it can be calculated from the Ogg page header.
315         </P>
316
317         <H2>
318                 <B>Project</B>
319         </H2>
320
321         </FONT>
322         </TD></TR>
323         </TABLE>
324         <TABLE WIDTH="100%" CELLPADDING="0" CELLSPACING="0" BORDER="0"><TR BGCOLOR="#000000"><TD><IMG SRC="images/1x1.gif" WIDTH="1" HEIGHT="1" ALT=""></TD></TR></TABLE>
325 </TD></TR>
326 </TABLE>
327
328
329 </CENTER>
330
331 <P>&nbsp;Copyright (c) 2000,2001,2002,2003 Josh Coalson</P>
332
333 </BODY>
334 </HTML>