Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4349 | Serge | 1 | \input texinfo @c -*- texinfo -*- |
2 | |||
3 | @settitle ffserver Documentation |
||
4 | @titlepage |
||
5 | @center @titlefont{ffserver Documentation} |
||
6 | @end titlepage |
||
7 | |||
8 | @top |
||
9 | |||
10 | @contents |
||
11 | |||
12 | @chapter Synopsis |
||
13 | |||
14 | ffserver [@var{options}] |
||
15 | |||
16 | @chapter Description |
||
17 | @c man begin DESCRIPTION |
||
18 | |||
19 | @command{ffserver} is a streaming server for both audio and video. It |
||
20 | supports several live feeds, streaming from files and time shifting on |
||
21 | live feeds (you can seek to positions in the past on each live feed, |
||
22 | provided you specify a big enough feed storage in |
||
23 | @file{ffserver.conf}). |
||
24 | |||
25 | @command{ffserver} receives prerecorded files or FFM streams from some |
||
26 | @command{ffmpeg} instance as input, then streams them over |
||
27 | RTP/RTSP/HTTP. |
||
28 | |||
29 | An @command{ffserver} instance will listen on some port as specified |
||
30 | in the configuration file. You can launch one or more instances of |
||
31 | @command{ffmpeg} and send one or more FFM streams to the port where |
||
32 | ffserver is expecting to receive them. Alternately, you can make |
||
33 | @command{ffserver} launch such @command{ffmpeg} instances at startup. |
||
34 | |||
35 | Input streams are called feeds, and each one is specified by a |
||
36 | @code{ |
||
37 | |||
38 | For each feed you can have different output streams in various |
||
39 | formats, each one specified by a @code{ |
||
40 | configuration file. |
||
41 | |||
42 | @section Status stream |
||
43 | |||
44 | ffserver supports an HTTP interface which exposes the current status |
||
45 | of the server. |
||
46 | |||
47 | Simply point your browser to the address of the special status stream |
||
48 | specified in the configuration file. |
||
49 | |||
50 | For example if you have: |
||
51 | @example |
||
52 | |||
53 | Format status |
||
54 | |||
55 | # Only allow local people to get the status |
||
56 | ACL allow localhost |
||
57 | ACL allow 192.168.0.0 192.168.255.255 |
||
58 | |||
59 | @end example |
||
60 | |||
61 | then the server will post a page with the status information when |
||
62 | the special stream @file{status.html} is requested. |
||
63 | |||
64 | @section What can this do? |
||
65 | |||
66 | When properly configured and running, you can capture video and audio in real |
||
67 | time from a suitable capture card, and stream it out over the Internet to |
||
68 | either Windows Media Player or RealAudio player (with some restrictions). |
||
69 | |||
70 | It can also stream from files, though that is currently broken. Very often, a |
||
71 | web server can be used to serve up the files just as well. |
||
72 | |||
73 | It can stream prerecorded video from .ffm files, though it is somewhat tricky |
||
74 | to make it work correctly. |
||
75 | |||
76 | @section How do I make it work? |
||
77 | |||
78 | First, build the kit. It *really* helps to have installed LAME first. Then when |
||
79 | you run the ffserver ./configure, make sure that you have the |
||
80 | @code{--enable-libmp3lame} flag turned on. |
||
81 | |||
82 | LAME is important as it allows for streaming audio to Windows Media Player. |
||
83 | Don't ask why the other audio types do not work. |
||
84 | |||
85 | As a simple test, just run the following two command lines where INPUTFILE |
||
86 | is some file which you can decode with ffmpeg: |
||
87 | |||
88 | @example |
||
89 | ffserver -f doc/ffserver.conf & |
||
90 | ffmpeg -i INPUTFILE http://localhost:8090/feed1.ffm |
||
91 | @end example |
||
92 | |||
93 | At this point you should be able to go to your Windows machine and fire up |
||
94 | Windows Media Player (WMP). Go to Open URL and enter |
||
95 | |||
96 | @example |
||
97 | http:// |
||
98 | @end example |
||
99 | |||
100 | You should (after a short delay) see video and hear audio. |
||
101 | |||
102 | WARNING: trying to stream test1.mpg doesn't work with WMP as it tries to |
||
103 | transfer the entire file before starting to play. |
||
104 | The same is true of AVI files. |
||
105 | |||
106 | @section What happens next? |
||
107 | |||
108 | You should edit the ffserver.conf file to suit your needs (in terms of |
||
109 | frame rates etc). Then install ffserver and ffmpeg, write a script to start |
||
110 | them up, and off you go. |
||
111 | |||
112 | @section Troubleshooting |
||
113 | |||
114 | @subsection I don't hear any audio, but video is fine. |
||
115 | |||
116 | Maybe you didn't install LAME, or got your ./configure statement wrong. Check |
||
117 | the ffmpeg output to see if a line referring to MP3 is present. If not, then |
||
118 | your configuration was incorrect. If it is, then maybe your wiring is not |
||
119 | set up correctly. Maybe the sound card is not getting data from the right |
||
120 | input source. Maybe you have a really awful audio interface (like I do) |
||
121 | that only captures in stereo and also requires that one channel be flipped. |
||
122 | If you are one of these people, then export 'AUDIO_FLIP_LEFT=1' before |
||
123 | starting ffmpeg. |
||
124 | |||
125 | @subsection The audio and video lose sync after a while. |
||
126 | |||
127 | Yes, they do. |
||
128 | |||
129 | @subsection After a long while, the video update rate goes way down in WMP. |
||
130 | |||
131 | Yes, it does. Who knows why? |
||
132 | |||
133 | @subsection WMP 6.4 behaves differently to WMP 7. |
||
134 | |||
135 | Yes, it does. Any thoughts on this would be gratefully received. These |
||
136 | differences extend to embedding WMP into a web page. [There are two |
||
137 | object IDs that you can use: The old one, which does not play well, and |
||
138 | the new one, which does (both tested on the same system). However, |
||
139 | I suspect that the new one is not available unless you have installed WMP 7]. |
||
140 | |||
141 | @section What else can it do? |
||
142 | |||
143 | You can replay video from .ffm files that was recorded earlier. |
||
144 | However, there are a number of caveats, including the fact that the |
||
145 | ffserver parameters must match the original parameters used to record the |
||
146 | file. If they do not, then ffserver deletes the file before recording into it. |
||
147 | (Now that I write this, it seems broken). |
||
148 | |||
149 | You can fiddle with many of the codec choices and encoding parameters, and |
||
150 | there are a bunch more parameters that you cannot control. Post a message |
||
151 | to the mailing list if there are some 'must have' parameters. Look in |
||
152 | ffserver.conf for a list of the currently available controls. |
||
153 | |||
154 | It will automatically generate the ASX or RAM files that are often used |
||
155 | in browsers. These files are actually redirections to the underlying ASF |
||
156 | or RM file. The reason for this is that the browser often fetches the |
||
157 | entire file before starting up the external viewer. The redirection files |
||
158 | are very small and can be transferred quickly. [The stream itself is |
||
159 | often 'infinite' and thus the browser tries to download it and never |
||
160 | finishes.] |
||
161 | |||
162 | @section Tips |
||
163 | |||
164 | * When you connect to a live stream, most players (WMP, RA, etc) want to |
||
165 | buffer a certain number of seconds of material so that they can display the |
||
166 | signal continuously. However, ffserver (by default) starts sending data |
||
167 | in realtime. This means that there is a pause of a few seconds while the |
||
168 | buffering is being done by the player. The good news is that this can be |
||
169 | cured by adding a '?buffer=5' to the end of the URL. This means that the |
||
170 | stream should start 5 seconds in the past -- and so the first 5 seconds |
||
171 | of the stream are sent as fast as the network will allow. It will then |
||
172 | slow down to real time. This noticeably improves the startup experience. |
||
173 | |||
174 | You can also add a 'Preroll 15' statement into the ffserver.conf that will |
||
175 | add the 15 second prebuffering on all requests that do not otherwise |
||
176 | specify a time. In addition, ffserver will skip frames until a key_frame |
||
177 | is found. This further reduces the startup delay by not transferring data |
||
178 | that will be discarded. |
||
179 | |||
180 | * You may want to adjust the MaxBandwidth in the ffserver.conf to limit |
||
181 | the amount of bandwidth consumed by live streams. |
||
182 | |||
183 | @section Why does the ?buffer / Preroll stop working after a time? |
||
184 | |||
185 | It turns out that (on my machine at least) the number of frames successfully |
||
186 | grabbed is marginally less than the number that ought to be grabbed. This |
||
187 | means that the timestamp in the encoded data stream gets behind realtime. |
||
188 | This means that if you say 'Preroll 10', then when the stream gets 10 |
||
189 | or more seconds behind, there is no Preroll left. |
||
190 | |||
191 | Fixing this requires a change in the internals of how timestamps are |
||
192 | handled. |
||
193 | |||
194 | @section Does the @code{?date=} stuff work. |
||
195 | |||
196 | Yes (subject to the limitation outlined above). Also note that whenever you |
||
197 | start ffserver, it deletes the ffm file (if any parameters have changed), |
||
198 | thus wiping out what you had recorded before. |
||
199 | |||
200 | The format of the @code{?date=xxxxxx} is fairly flexible. You should use one |
||
201 | of the following formats (the 'T' is literal): |
||
202 | |||
203 | @example |
||
204 | * YYYY-MM-DDTHH:MM:SS (localtime) |
||
205 | * YYYY-MM-DDTHH:MM:SSZ (UTC) |
||
206 | @end example |
||
207 | |||
208 | You can omit the YYYY-MM-DD, and then it refers to the current day. However |
||
209 | note that @samp{?date=16:00:00} refers to 16:00 on the current day -- this |
||
210 | may be in the future and so is unlikely to be useful. |
||
211 | |||
212 | You use this by adding the ?date= to the end of the URL for the stream. |
||
213 | For example: @samp{http://localhost:8080/test.asf?date=2002-07-26T23:05:00}. |
||
214 | @c man end |
||
215 | |||
216 | @section What is FFM, FFM2 |
||
217 | |||
218 | FFM and FFM2 are formats used by ffserver. They allow storing a wide variety of |
||
219 | video and audio streams and encoding options, and can store a moving time segment |
||
220 | of an infinite movie or a whole movie. |
||
221 | |||
222 | FFM is version specific, and there is limited compatibility of FFM files |
||
223 | generated by one version of ffmpeg/ffserver and another version of |
||
224 | ffmpeg/ffserver. It may work but it is not guaranteed to work. |
||
225 | |||
226 | FFM2 is extensible while maintaining compatibility and should work between |
||
227 | differing versions of tools. FFM2 is the default. |
||
228 | |||
229 | @chapter Options |
||
230 | @c man begin OPTIONS |
||
231 | |||
232 | @include fftools-common-opts.texi |
||
233 | |||
234 | @section Main options |
||
235 | |||
236 | @table @option |
||
237 | @item -f @var{configfile} |
||
238 | Use @file{configfile} instead of @file{/etc/ffserver.conf}. |
||
239 | @item -n |
||
240 | Enable no-launch mode. This option disables all the Launch directives |
||
241 | within the various |
||
242 | any ffmpeg instances, you will have to launch them manually. |
||
243 | @item -d |
||
244 | Enable debug mode. This option increases log verbosity, directs log |
||
245 | messages to stdout. |
||
246 | @end table |
||
247 | @c man end |
||
248 | |||
249 | @include config.texi |
||
250 | @ifset config-all |
||
251 | @ifset config-avutil |
||
252 | @include utils.texi |
||
253 | @end ifset |
||
254 | @ifset config-avcodec |
||
255 | @include codecs.texi |
||
256 | @include bitstream_filters.texi |
||
257 | @end ifset |
||
258 | @ifset config-avformat |
||
259 | @include formats.texi |
||
260 | @include protocols.texi |
||
261 | @end ifset |
||
262 | @ifset config-avdevice |
||
263 | @include devices.texi |
||
264 | @end ifset |
||
265 | @ifset config-swresample |
||
266 | @include resampler.texi |
||
267 | @end ifset |
||
268 | @ifset config-swscale |
||
269 | @include scaler.texi |
||
270 | @end ifset |
||
271 | @ifset config-avfilter |
||
272 | @include filters.texi |
||
273 | @end ifset |
||
274 | @end ifset |
||
275 | |||
276 | @chapter See Also |
||
277 | |||
278 | @ifhtml |
||
279 | @ifset config-all |
||
280 | @url{ffserver.html,ffserver}, |
||
281 | @end ifset |
||
282 | @ifset config-not-all |
||
283 | @url{ffserver-all.html,ffserver-all}, |
||
284 | @end ifset |
||
285 | the @file{doc/ffserver.conf} example, |
||
286 | @url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, |
||
287 | @url{ffmpeg-utils.html,ffmpeg-utils}, |
||
288 | @url{ffmpeg-scaler.html,ffmpeg-scaler}, |
||
289 | @url{ffmpeg-resampler.html,ffmpeg-resampler}, |
||
290 | @url{ffmpeg-codecs.html,ffmpeg-codecs}, |
||
291 | @url{ffmpeg-bitstream-filters.html,ffmpeg-bitstream-filters}, |
||
292 | @url{ffmpeg-formats.html,ffmpeg-formats}, |
||
293 | @url{ffmpeg-devices.html,ffmpeg-devices}, |
||
294 | @url{ffmpeg-protocols.html,ffmpeg-protocols}, |
||
295 | @url{ffmpeg-filters.html,ffmpeg-filters} |
||
296 | @end ifhtml |
||
297 | |||
298 | @ifnothtml |
||
299 | @ifset config-all |
||
300 | ffserver(1), |
||
301 | @end ifset |
||
302 | @ifset config-not-all |
||
303 | ffserver-all(1), |
||
304 | @end ifset |
||
305 | the @file{doc/ffserver.conf} example, ffmpeg(1), ffplay(1), ffprobe(1), |
||
306 | ffmpeg-utils(1), ffmpeg-scaler(1), ffmpeg-resampler(1), |
||
307 | ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), ffmpeg-formats(1), |
||
308 | ffmpeg-devices(1), ffmpeg-protocols(1), ffmpeg-filters(1) |
||
309 | @end ifnothtml |
||
310 | |||
311 | @include authors.texi |
||
312 | |||
313 | @ignore |
||
314 | |||
315 | @setfilename ffserver |
||
316 | @settitle ffserver video server |
||
317 | |||
318 | @end ignore |
||
319 | |||
320 | @bye |