|
|
|
\input texinfo @c -*- texinfo -*-
|
|
|
|
@documentencoding UTF-8
|
|
|
|
|
|
|
|
@settitle ffserver Documentation
|
|
|
|
@titlepage
|
|
|
|
@center @titlefont{ffserver Documentation}
|
|
|
|
@end titlepage
|
|
|
|
|
|
|
|
@top
|
|
|
|
|
|
|
|
@contents
|
|
|
|
|
|
|
|
@chapter Synopsis
|
|
|
|
|
|
|
|
ffserver [@var{options}]
|
|
|
|
|
|
|
|
@chapter Description
|
|
|
|
@c man begin DESCRIPTION
|
|
|
|
|
|
|
|
@command{ffserver} is a streaming server for both audio and video.
|
|
|
|
It supports several live feeds, streaming from files and time shifting
|
|
|
|
on live feeds. You can seek to positions in the past on each live
|
|
|
|
feed, provided you specify a big enough feed storage.
|
|
|
|
|
|
|
|
@command{ffserver} is configured through a configuration file, which
|
|
|
|
is read at startup. If not explicitly specified, it will read from
|
|
|
|
@file{/etc/ffserver.conf}.
|
|
|
|
|
|
|
|
@command{ffserver} receives prerecorded files or FFM streams from some
|
|
|
|
@command{ffmpeg} instance as input, then streams them over
|
|
|
|
RTP/RTSP/HTTP.
|
|
|
|
|
|
|
|
An @command{ffserver} instance will listen on some port as specified
|
|
|
|
in the configuration file. You can launch one or more instances of
|
|
|
|
@command{ffmpeg} and send one or more FFM streams to the port where
|
|
|
|
ffserver is expecting to receive them. Alternately, you can make
|
|
|
|
@command{ffserver} launch such @command{ffmpeg} instances at startup.
|
|
|
|
|
|
|
|
Input streams are called feeds, and each one is specified by a
|
|
|
|
@code{<Feed>} section in the configuration file.
|
|
|
|
|
|
|
|
For each feed you can have different output streams in various
|
|
|
|
formats, each one specified by a @code{<Stream>} section in the
|
|
|
|
configuration file.
|
|
|
|
|
|
|
|
@chapter Detailed description
|
|
|
|
|
|
|
|
@command{ffserver} works by forwarding streams encoded by
|
|
|
|
@command{ffmpeg}, or pre-recorded streams which are read from disk.
|
|
|
|
|
|
|
|
Precisely, @command{ffserver} acts as an HTTP server, accepting POST
|
|
|
|
requests from @command{ffmpeg} to acquire the stream to publish, and
|
|
|
|
serving RTSP clients or HTTP clients GET requests with the stream
|
|
|
|
media content.
|
|
|
|
|
|
|
|
A feed is an @ref{FFM} stream created by @command{ffmpeg}, and sent to
|
|
|
|
a port where @command{ffserver} is listening.
|
|
|
|
|
|
|
|
Each feed is identified by a unique name, corresponding to the name
|
|
|
|
of the resource published on @command{ffserver}, and is configured by
|
|
|
|
a dedicated @code{Feed} section in the configuration file.
|
|
|
|
|
|
|
|
The feed publish URL is given by:
|
|
|
|
@example
|
|
|
|
http://@var{ffserver_ip_address}:@var{http_port}/@var{feed_name}
|
|
|
|
@end example
|
|
|
|
|
|
|
|
where @var{ffserver_ip_address} is the IP address of the machine where
|
|
|
|
@command{ffserver} is installed, @var{http_port} is the port number of
|
|
|
|
the HTTP server (configured through the @option{HTTPPort} option), and
|
|
|
|
@var{feed_name} is the name of the corresponding feed defined in the
|
|
|
|
configuration file.
|
|
|
|
|
|
|
|
Each feed is associated to a file which is stored on disk. This stored
|
|
|
|
file is used to send pre-recorded data to a player as fast as
|
|
|
|
possible when new content is added in real-time to the stream.
|
|
|
|
|
|
|
|
A "live-stream" or "stream" is a resource published by
|
|
|
|
@command{ffserver}, and made accessible through the HTTP protocol to
|
|
|
|
clients.
|
|
|
|
|
|
|
|
A stream can be connected to a feed, or to a file. In the first case,
|
|
|
|
the published stream is forwarded from the corresponding feed
|
|
|
|
generated by a running instance of @command{ffmpeg}, in the second
|
|
|
|
case the stream is read from a pre-recorded file.
|
|
|
|
|
|
|
|
Each stream is identified by a unique name, corresponding to the name
|
|
|
|
of the resource served by @command{ffserver}, and is configured by
|
|
|
|
a dedicated @code{Stream} section in the configuration file.
|
|
|
|
|
|
|
|
The stream access HTTP URL is given by:
|
|
|
|
@example
|
|
|
|
http://@var{ffserver_ip_address}:@var{http_port}/@var{stream_name}[@var{options}]
|
|
|
|
@end example
|
|
|
|
|
|
|
|
The stream access RTSP URL is given by:
|
|
|
|
@example
|
|
|
|
http://@var{ffserver_ip_address}:@var{rtsp_port}/@var{stream_name}[@var{options}]
|
|
|
|
@end example
|
|
|
|
|
|
|
|
@var{stream_name} is the name of the corresponding stream defined in
|
|
|
|
the configuration file. @var{options} is a list of options specified
|
|
|
|
after the URL which affects how the stream is served by
|
|
|
|
@command{ffserver}. @var{http_port} and @var{rtsp_port} are the HTTP
|
|
|
|
and RTSP ports configured with the options @var{HTTPPort} and
|
|
|
|
@var{RTSPPort} respectively.
|
|
|
|
|
|
|
|
In case the stream is associated to a feed, the encoding parameters
|
|
|
|
must be configured in the stream configuration. They are sent to
|
|
|
|
@command{ffmpeg} when setting up the encoding. This allows
|
|
|
|
@command{ffserver} to define the encoding parameters used by
|
|
|
|
the @command{ffmpeg} encoders.
|
|
|
|
|
|
|
|
The @command{ffmpeg} @option{override_ffserver} commandline option
|
|
|
|
allows one to override the encoding parameters set by the server.
|
|
|
|
|
|
|
|
Multiple streams can be connected to the same feed.
|
|
|
|
|
|
|
|
For example, you can have a situation described by the following
|
|
|
|
graph:
|
|
|
|
|
|
|
|
@verbatim
|
|
|
|
_________ __________
|
|
|
|
| | | |
|
|
|
|
ffmpeg 1 -----| feed 1 |-----| stream 1 |
|
|
|
|
\ |_________|\ |__________|
|
|
|
|
\ \
|
|
|
|
\ \ __________
|
|
|
|
\ \ | |
|
|
|
|
\ \| stream 2 |
|
|
|
|
\ |__________|
|
|
|
|
\
|
|
|
|
\ _________ __________
|
|
|
|
\ | | | |
|
|
|
|
\| feed 2 |-----| stream 3 |
|
|
|
|
|_________| |__________|
|
|
|
|
|
|
|
|
_________ __________
|
|
|
|
| | | |
|
|
|
|
ffmpeg 2 -----| feed 3 |-----| stream 4 |
|
|
|
|
|_________| |__________|
|
|
|
|
|
|
|
|
_________ __________
|
|
|
|
| | | |
|
|
|
|
| file 1 |-----| stream 5 |
|
|
|
|
|_________| |__________|
|
|
|
|
|
|
|
|
@end verbatim
|
|
|
|
|
|
|
|
@anchor{FFM}
|
|
|
|
@section FFM, FFM2 formats
|
|
|
|
|
|
|
|
FFM and FFM2 are formats used by ffserver. They allow storing a wide variety of
|
|
|
|
video and audio streams and encoding options, and can store a moving time segment
|
|
|
|
of an infinite movie or a whole movie.
|
|
|
|
|
|
|
|
FFM is version specific, and there is limited compatibility of FFM files
|
|
|
|
generated by one version of ffmpeg/ffserver and another version of
|
|
|
|
ffmpeg/ffserver. It may work but it is not guaranteed to work.
|
|
|
|
|
|
|
|
FFM2 is extensible while maintaining compatibility and should work between
|
|
|
|
differing versions of tools. FFM2 is the default.
|
|
|
|
|
|
|
|
@section Status stream
|
|
|
|
|
|
|
|
@command{ffserver} supports an HTTP interface which exposes the
|
|
|
|
current status of the server.
|
|
|
|
|
|
|
|
Simply point your browser to the address of the special status stream
|
|
|
|
specified in the configuration file.
|
|
|
|
|
|
|
|
For example if you have:
|
|
|
|
@example
|
|
|
|
<Stream status.html>
|
|
|
|
Format status
|
|
|
|
|
|
|
|
# Only allow local people to get the status
|
|
|
|
ACL allow localhost
|
|
|
|
ACL allow 192.168.0.0 192.168.255.255
|
|
|
|
</Stream>
|
|
|
|
@end example
|
|
|
|
|
|
|
|
then the server will post a page with the status information when
|
|
|
|
the special stream @file{status.html} is requested.
|
|
|
|
|
|
|
|
@section How do I make it work?
|
|
|
|
|
|
|
|
As a simple test, just run the following two command lines where INPUTFILE
|
|
|
|
is some file which you can decode with ffmpeg:
|
|
|
|
|
|
|
|
@example
|
|
|
|
ffserver -f doc/ffserver.conf &
|
|
|
|
ffmpeg -i INPUTFILE http://localhost:8090/feed1.ffm
|
|
|
|
@end example
|
|
|
|
|
|
|
|
At this point you should be able to go to your Windows machine and fire up
|
|
|
|
Windows Media Player (WMP). Go to Open URL and enter
|
|
|
|
|
|
|
|
@example
|
|
|
|
http://<linuxbox>:8090/test.asf
|
|
|
|
@end example
|
|
|
|
|
|
|
|
You should (after a short delay) see video and hear audio.
|
|
|
|
|
|
|
|
WARNING: trying to stream test1.mpg doesn't work with WMP as it tries to
|
|
|
|
transfer the entire file before starting to play.
|
|
|
|
The same is true of AVI files.
|
|
|
|
|
|
|
|
You should edit the @file{ffserver.conf} file to suit your needs (in
|
|
|
|
terms of frame rates etc). Then install @command{ffserver} and
|
|
|
|
@command{ffmpeg}, write a script to start them up, and off you go.
|
|
|
|
|
|
|
|
@section What else can it do?
|
|
|
|
|
|
|
|
You can replay video from .ffm files that was recorded earlier.
|
|
|
|
However, there are a number of caveats, including the fact that the
|
|
|
|
ffserver parameters must match the original parameters used to record the
|
|
|
|
file. If they do not, then ffserver deletes the file before recording into it.
|
|
|
|
(Now that I write this, it seems broken).
|
|
|
|
|
|
|
|
You can fiddle with many of the codec choices and encoding parameters, and
|
|
|
|
there are a bunch more parameters that you cannot control. Post a message
|
|
|
|
to the mailing list if there are some 'must have' parameters. Look in
|
|
|
|
ffserver.conf for a list of the currently available controls.
|
|
|
|
|
|
|
|
It will automatically generate the ASX or RAM files that are often used
|
|
|
|
in browsers. These files are actually redirections to the underlying ASF
|
|
|
|
or RM file. The reason for this is that the browser often fetches the
|
|
|
|
entire file before starting up the external viewer. The redirection files
|
|
|
|
are very small and can be transferred quickly. [The stream itself is
|
|
|
|
often 'infinite' and thus the browser tries to download it and never
|
|
|
|
finishes.]
|
|
|
|
|
|
|
|
@section Tips
|
|
|
|
|
|
|
|
* When you connect to a live stream, most players (WMP, RA, etc) want to
|
|
|
|
buffer a certain number of seconds of material so that they can display the
|
|
|
|
signal continuously. However, ffserver (by default) starts sending data
|
|
|
|
in realtime. This means that there is a pause of a few seconds while the
|
|
|
|
buffering is being done by the player. The good news is that this can be
|
|
|
|
cured by adding a '?buffer=5' to the end of the URL. This means that the
|
|
|
|
stream should start 5 seconds in the past -- and so the first 5 seconds
|
|
|
|
of the stream are sent as fast as the network will allow. It will then
|
|
|
|
slow down to real time. This noticeably improves the startup experience.
|
|
|
|
|
|
|
|
You can also add a 'Preroll 15' statement into the ffserver.conf that will
|
|
|
|
add the 15 second prebuffering on all requests that do not otherwise
|
|
|
|
specify a time. In addition, ffserver will skip frames until a key_frame
|
|
|
|
is found. This further reduces the startup delay by not transferring data
|
|
|
|
that will be discarded.
|
|
|
|
|
|
|
|
@section Why does the ?buffer / Preroll stop working after a time?
|
|
|
|
|
|
|
|
It turns out that (on my machine at least) the number of frames successfully
|
|
|
|
grabbed is marginally less than the number that ought to be grabbed. This
|
|
|
|
means that the timestamp in the encoded data stream gets behind realtime.
|
|
|
|
This means that if you say 'Preroll 10', then when the stream gets 10
|
|
|
|
or more seconds behind, there is no Preroll left.
|
|
|
|
|
|
|
|
Fixing this requires a change in the internals of how timestamps are
|
|
|
|
handled.
|
|
|
|
|
|
|
|
@section Does the @code{?date=} stuff work.
|
|
|
|
|
|
|
|
Yes (subject to the limitation outlined above). Also note that whenever you
|
|
|
|
start ffserver, it deletes the ffm file (if any parameters have changed),
|
|
|
|
thus wiping out what you had recorded before.
|
|
|
|
|
|
|
|
The format of the @code{?date=xxxxxx} is fairly flexible. You should use one
|
|
|
|
of the following formats (the 'T' is literal):
|
|
|
|
|
|
|
|
@example
|
|
|
|
* YYYY-MM-DDTHH:MM:SS (localtime)
|
|
|
|
* YYYY-MM-DDTHH:MM:SSZ (UTC)
|
|
|
|
@end example
|
|
|
|
|
|
|
|
You can omit the YYYY-MM-DD, and then it refers to the current day. However
|
|
|
|
note that @samp{?date=16:00:00} refers to 16:00 on the current day -- this
|
|
|
|
may be in the future and so is unlikely to be useful.
|
|
|
|
|
|
|
|
You use this by adding the ?date= to the end of the URL for the stream.
|
|
|
|
For example: @samp{http://localhost:8080/test.asf?date=2002-07-26T23:05:00}.
|
|
|
|
@c man end
|
|
|
|
|
|
|
|
@chapter Options
|
|
|
|
@c man begin OPTIONS
|
|
|
|
|
|
|
|
@include fftools-common-opts.texi
|
|
|
|
|
|
|
|
@section Main options
|
|
|
|
|
|
|
|
@table @option
|
|
|
|
@item -f @var{configfile}
|
|
|
|
Read configuration file @file{configfile}. If not specified it will
|
|
|
|
read by default from @file{/etc/ffserver.conf}.
|
|
|
|
|
|
|
|
@item -n
|
|
|
|
Enable no-launch mode. This option disables all the @code{Launch}
|
|
|
|
directives within the various @code{<Feed>} sections. Since
|
|
|
|
@command{ffserver} will not launch any @command{ffmpeg} instances, you
|
|
|
|
will have to launch them manually.
|
|
|
|
|
|
|
|
@item -d
|
|
|
|
Enable debug mode. This option increases log verbosity, and directs
|
|
|
|
log messages to stdout. When specified, the @option{CustomLog} option
|
|
|
|
is ignored.
|
|
|
|
@end table
|
|
|
|
|
|
|
|
@chapter Configuration file syntax
|
|
|
|
|
|
|
|
@command{ffserver} reads a configuration file containing global
|
|
|
|
options and settings for each stream and feed.
|
|
|
|
|
|
|
|
The configuration file consists of global options and dedicated
|
|
|
|
sections, which must be introduced by "<@var{SECTION_NAME}
|
|
|
|
@var{ARGS}>" on a separate line and must be terminated by a line in
|
|
|
|
the form "</@var{SECTION_NAME}>". @var{ARGS} is optional.
|
|
|
|
|
|
|
|
Currently the following sections are recognized: @samp{Feed},
|
|
|
|
@samp{Stream}, @samp{Redirect}.
|
|
|
|
|
|
|
|
A line starting with @code{#} is ignored and treated as a comment.
|
|
|
|
|
|
|
|
Name of options and sections are case-insensitive.
|
|
|
|
|
|
|
|
@section ACL syntax
|
|
|
|
An ACL (Access Control List) specifies the address which are allowed
|
|
|
|
to access a given stream, or to write a given feed.
|
|
|
|
|
|
|
|
It accepts the folling forms
|
|
|
|
@itemize
|
|
|
|
@item
|
|
|
|
Allow/deny access to @var{address}.
|
|
|
|
@example
|
|
|
|
ACL ALLOW <address>
|
|
|
|
ACL DENY <address>
|
|
|
|
@end example
|
|
|
|
|
|
|
|
@item
|
|
|
|
Allow/deny access to ranges of addresses from @var{first_address} to
|
|
|
|
@var{last_address}.
|
|
|
|
@example
|
|
|
|
ACL ALLOW <first_address> <last_address>
|
|
|
|
ACL DENY <first_address> <last_address>
|
|
|
|
@end example
|
|
|
|
@end itemize
|
|
|
|
|
|
|
|
You can repeat the ACL allow/deny as often as you like. It is on a per
|
|
|
|
stream basis. The first match defines the action. If there are no matches,
|
|
|
|
then the default is the inverse of the last ACL statement.
|
|
|
|
|
|
|
|
Thus 'ACL allow localhost' only allows access from localhost.
|
|
|
|
'ACL deny 1.0.0.0 1.255.255.255' would deny the whole of network 1 and
|
|
|
|
allow everybody else.
|
|
|
|
|
|
|
|
@section Global options
|
|
|
|
@table @option
|
|
|
|
@item HTTPPort @var{port_number}
|
|
|
|
@item Port @var{port_number}
|
|
|
|
@item RTSPPort @var{port_number}
|
|
|
|
|
|
|
|
@var{HTTPPort} sets the HTTP server listening TCP port number,
|
|
|
|
@var{RTSPPort} sets the RTSP server listening TCP port number.
|
|
|
|
|
|
|
|
@var{Port} is the equivalent of @var{HTTPPort} and is deprecated.
|
|
|
|
|
|
|
|
You must select a different port from your standard HTTP web server if
|
|
|
|
it is running on the same computer.
|
|
|
|
|
|
|
|
If not specified, no corresponding server will be created.
|
|
|
|
|
|
|
|
@item HTTPBindAddress @var{ip_address}
|
|
|
|
@item BindAddress @var{ip_address}
|
|
|
|
@item RTSPBindAddress @var{ip_address}
|
|
|
|
Set address on which the HTTP/RTSP server is bound. Only useful if you
|
|
|
|
have several network interfaces.
|
|
|
|
|
|
|
|
@var{BindAddress} is the equivalent of @var{HTTPBindAddress} and is
|
|
|
|
deprecated.
|
|
|
|
|
|
|
|
@item MaxHTTPConnections @var{n}
|
|
|
|
Set number of simultaneous HTTP connections that can be handled. It
|
|
|
|
has to be defined @emph{before} the @option{MaxClients} parameter,
|
|
|
|
since it defines the @option{MaxClients} maximum limit.
|
|
|
|
|
|
|
|
Default value is 2000.
|
|
|
|
|
|
|
|
@item MaxClients @var{n}
|
|
|
|
Set number of simultaneous requests that can be handled. Since
|
|
|
|
@command{ffserver} is very fast, it is more likely that you will want
|
|
|
|
to leave this high and use @option{MaxBandwidth}.
|
|
|
|
|
|
|
|
Default value is 5.
|
|
|
|
|
|
|
|
@item MaxBandwidth @var{kbps}
|
|
|
|
Set the maximum amount of kbit/sec that you are prepared to consume
|
|
|
|
when streaming to clients.
|
|
|
|
|
|
|
|
Default value is 1000.
|
|
|
|
|
|
|
|
@item CustomLog @var{filename}
|
|
|
|
Set access log file (uses standard Apache log file format). '-' is the
|
|
|
|
standard output.
|
|
|
|
|
|
|
|
If not specified @command{ffserver} will produce no log.
|
|
|
|
|
|
|
|
In case the commandline option @option{-d} is specified this option is
|
|
|
|
ignored, and the log is written to standard output.
|
|
|
|
|
|
|
|
@item NoDaemon
|
|
|
|
Set no-daemon mode. This option is currently ignored since now
|
|
|
|
@command{ffserver} will always work in no-daemon mode, and is
|
|
|
|
deprecated.
|
|
|
|
|
|
|
|
@item UseDefaults
|
|
|
|
@item NoDefaults
|
|
|
|
Control whether default codec options are used for the all streams or not.
|
|
|
|
Each stream may overwrite this setting for its own. Default is @var{UseDefaults}.
|
|
|
|
The lastest occurrence overrides previous if multiple definitions.
|
|
|
|
@end table
|
|
|
|
|
|
|
|
@section Feed section
|
|
|
|
|
|
|
|
A Feed section defines a feed provided to @command{ffserver}.
|
|
|
|
|
|
|
|
Each live feed contains one video and/or audio sequence coming from an
|
|
|
|
@command{ffmpeg} encoder or another @command{ffserver}. This sequence
|
|
|
|
may be encoded simultaneously with several codecs at several
|
|
|
|
resolutions.
|
|
|
|
|
|
|
|
A feed instance specification is introduced by a line in the form:
|
|
|
|
@example
|
|
|
|
<Feed FEED_FILENAME>
|
|
|
|
@end example
|
|
|
|
|
|
|
|
where @var{FEED_FILENAME} specifies the unique name of the FFM stream.
|
|
|
|
|
|
|
|
The following options are recognized within a Feed section.
|
|
|
|
|
|
|
|
@table @option
|
|
|
|
@item File @var{filename}
|
|
|
|
@item ReadOnlyFile @var{filename}
|
|
|
|
Set the path where the feed file is stored on disk.
|
|
|
|
|
|
|
|
If not specified, the @file{/tmp/FEED.ffm} is assumed, where
|
|
|
|
@var{FEED} is the feed name.
|
|
|
|
|
|
|
|
If @option{ReadOnlyFile} is used the file is marked as read-only and
|
|
|
|
it will not be deleted or updated.
|
|
|
|
|
|
|
|
@item Truncate
|
|
|
|
Truncate the feed file, rather than appending to it. By default
|
|
|
|
@command{ffserver} will append data to the file, until the maximum
|
|
|
|
file size value is reached (see @option{FileMaxSize} option).
|
|
|
|
|
|
|
|
@item FileMaxSize @var{size}
|
|
|
|
Set maximum size of the feed file in bytes. 0 means unlimited. The
|
|
|
|
postfixes @code{K} (2^10), @code{M} (2^20), and @code{G} (2^30) are
|
|
|
|
recognized.
|
|
|
|
|
|
|
|
Default value is 5M.
|
|
|
|
|
|
|
|
@item Launch @var{args}
|
|
|
|
Launch an @command{ffmpeg} command when creating @command{ffserver}.
|
|
|
|
|
|
|
|
@var{args} must be a sequence of arguments to be provided to an
|
|
|
|
@command{ffmpeg} instance. The first provided argument is ignored, and
|
|
|
|
it is replaced by a path with the same dirname of the @command{ffserver}
|
|
|
|
instance, followed by the remaining argument and terminated with a
|
|
|
|
path corresponding to the feed.
|
|
|
|
|
|
|
|
When the launched process exits, @command{ffserver} will launch
|
|
|
|
another program instance.
|
|
|
|
|
|
|
|
In case you need a more complex @command{ffmpeg} configuration,
|
|
|
|
e.g. if you need to generate multiple FFM feeds with a single
|
|
|
|
@command{ffmpeg} instance, you should launch @command{ffmpeg} by hand.
|
|
|
|
|
|
|
|
This option is ignored in case the commandline option @option{-n} is
|
|
|
|
specified.
|
|
|
|
|
|
|
|
@item ACL @var{spec}
|
|
|
|
Specify the list of IP address which are allowed or denied to write
|
|
|
|
the feed. Multiple ACL options can be specified.
|
|
|
|
@end table
|
|
|
|
|
|
|
|
@section Stream section
|
|
|
|
|
|
|
|
A Stream section defines a stream provided by @command{ffserver}, and
|
|
|
|
identified by a single name.
|
|
|
|
|
|
|
|
The stream is sent when answering a request containing the stream
|
|
|
|
name.
|
|
|
|
|
|
|
|
A stream section must be introduced by the line:
|
|
|
|
@example
|
|
|
|
<Stream STREAM_NAME>
|
|
|
|
@end example
|
|
|
|
|
|
|
|
where @var{STREAM_NAME} specifies the unique name of the stream.
|
|
|
|
|
|
|
|
The following options are recognized within a Stream section.
|
|
|
|
|
|
|
|
Encoding options are marked with the @emph{encoding} tag, and they are
|
|
|
|
used to set the encoding parameters, and are mapped to libavcodec
|
|
|
|
encoding options. Not all encoding options are supported, in
|
|
|
|
particular it is not possible to set encoder private options. In order
|
|
|
|
to override the encoding options specified by @command{ffserver}, you
|
|
|
|
can use the @command{ffmpeg} @option{override_ffserver} commandline
|
|
|
|
option.
|
|
|
|
|
|
|
|
Only one of the @option{Feed} and @option{File} options should be set.
|
|
|
|
|
|
|
|
@table @option
|
|
|
|
@item Feed @var{feed_name}
|
|
|
|
Set the input feed. @var{feed_name} must correspond to an existing
|
|
|
|
feed defined in a @code{Feed} section.
|
|
|
|
|
|
|
|
When this option is set, encoding options are used to setup the
|
|
|
|
encoding operated by the remote @command{ffmpeg} process.
|
|
|
|
|
|
|
|
@item File @var{filename}
|
|
|
|
Set the filename of the pre-recorded input file to stream.
|
|
|
|
|
|
|
|
When this option is set, encoding options are ignored and the input
|
|
|
|
file content is re-streamed as is.
|
|
|
|
|
|
|
|
@item Format @var{format_name}
|
|
|
|
Set the format of the output stream.
|
|
|
|
|
|
|
|
Must be the name of a format recognized by FFmpeg. If set to
|
|
|
|
@samp{status}, it is treated as a status stream.
|
|
|
|
|
|
|
|
@item InputFormat @var{format_name}
|
|
|
|
Set input format. If not specified, it is automatically guessed.
|
|
|
|
|
|
|
|
@item Preroll @var{n}
|
|
|
|
Set this to the number of seconds backwards in time to start. Note that
|
|
|
|
most players will buffer 5-10 seconds of video, and also you need to allow
|
|
|
|
for a keyframe to appear in the data stream.
|
|
|
|
|
|
|
|
Default value is 0.
|
|
|
|
|
|
|
|
@item StartSendOnKey
|
|
|
|
Do not send stream until it gets the first key frame. By default
|
|
|
|
@command{ffserver} will send data immediately.
|
|
|
|
|
|
|
|
@item MaxTime @var{n}
|
|
|
|
Set the number of seconds to run. This value set the maximum duration
|
|
|
|
of the stream a client will be able to receive.
|
|
|
|
|
|
|
|
A value of 0 means that no limit is set on the stream duration.
|
|
|
|
|
|
|
|
@item ACL @var{spec}
|
|
|
|
Set ACL for the stream.
|
|
|
|
|
|
|
|
@item DynamicACL @var{spec}
|
|
|
|
|
|
|
|
@item RTSPOption @var{option}
|
|
|
|
|
|
|
|
@item MulticastAddress @var{address}
|
|
|
|
|
|
|
|
@item MulticastPort @var{port}
|
|
|
|
|
|
|
|
@item MulticastTTL @var{integer}
|
|
|
|
|
|
|
|
@item NoLoop
|
|
|
|
|
|
|
|
@item FaviconURL @var{url}
|
|
|
|
Set favicon (favourite icon) for the server status page. It is ignored
|
|
|
|
for regular streams.
|
|
|
|
|
|
|
|
@item Author @var{value}
|
|
|
|
@item Comment @var{value}
|
|
|
|
@item Copyright @var{value}
|
|
|
|
@item Title @var{value}
|
|
|
|
Set metadata corresponding to the option. All these options are
|
|
|
|
deprecated in favor of @option{Metadata}.
|
|
|
|
|
|
|
|
@item Metadata @var{key} @var{value}
|
|
|
|
Set metadata value on the output stream.
|
|
|
|
|
|
|
|
@item UseDefaults
|
|
|
|
@item NoDefaults
|
|
|
|
Control whether default codec options are used for the stream or not.
|
|
|
|
Default is @var{UseDefaults} unless disabled globally.
|
|
|
|
|
|
|
|
@item NoAudio
|
|
|
|
@item NoVideo
|
|
|
|
Suppress audio/video.
|
|
|
|
|
|
|
|
@item AudioCodec @var{codec_name} (@emph{encoding,audio})
|
|
|
|
Set audio codec.
|
|
|
|
|
|
|
|
@item AudioBitRate @var{rate} (@emph{encoding,audio})
|
|
|
|
Set bitrate for the audio stream in kbits per second.
|
|
|
|
|
|
|
|
@item AudioChannels @var{n} (@emph{encoding,audio})
|
|
|
|
Set number of audio channels.
|
|
|
|
|
|
|
|
@item AudioSampleRate @var{n} (@emph{encoding,audio})
|
|
|
|
Set sampling frequency for audio. When using low bitrates, you should
|
|
|
|
lower this frequency to 22050 or 11025. The supported frequencies
|
|
|
|
depend on the selected audio codec.
|
|
|
|
|
|
|
|
@item AVOptionAudio [@var{codec}:]@var{option} @var{value} (@emph{encoding,audio})
|
|
|
|
Set generic or private option for audio stream.
|
|
|
|
Private option must be prefixed with codec name or codec must be defined before.
|
|
|
|
|
|
|
|
@item AVPresetAudio @var{preset} (@emph{encoding,audio})
|
|
|
|
Set preset for audio stream.
|
|
|
|
|
|
|
|
@item VideoCodec @var{codec_name} (@emph{encoding,video})
|
|
|
|
Set video codec.
|
|
|
|
|
|
|
|
@item VideoBitRate @var{n} (@emph{encoding,video})
|
|
|
|
Set bitrate for the video stream in kbits per second.
|
|
|
|
|
|
|
|
@item VideoBitRateRange @var{range} (@emph{encoding,video})
|
|
|
|
Set video bitrate range.
|
|
|
|
|
|
|
|
A range must be specified in the form @var{minrate}-@var{maxrate}, and
|
|
|
|
specifies the @option{minrate} and @option{maxrate} encoding options
|
|
|
|
expressed in kbits per second.
|
|
|
|
|
|
|
|
@item VideoBitRateRangeTolerance @var{n} (@emph{encoding,video})
|
|
|
|
Set video bitrate tolerance in kbits per second.
|
|
|
|
|
|
|
|
@item PixelFormat @var{pixel_format} (@emph{encoding,video})
|
|
|
|
Set video pixel format.
|
|
|
|
|
|
|
|
@item Debug @var{integer} (@emph{encoding,video})
|
|
|
|
Set video @option{debug} encoding option.
|
|
|
|
|
|
|
|
@item Strict @var{integer} (@emph{encoding,video})
|
|
|
|
Set video @option{strict} encoding option.
|
|
|
|
|
|
|
|
@item VideoBufferSize @var{n} (@emph{encoding,video})
|
|
|
|
Set ratecontrol buffer size, expressed in KB.
|
|
|
|
|
|
|
|
@item VideoFrameRate @var{n} (@emph{encoding,video})
|
|
|
|
Set number of video frames per second.
|
|
|
|
|
|
|
|
@item VideoSize (@emph{encoding,video})
|
|
|
|
Set size of the video frame, must be an abbreviation or in the form
|
|
|
|
@var{W}x@var{H}. See @ref{video size syntax,,the Video size section
|
|
|
|
in the ffmpeg-utils(1) manual,ffmpeg-utils}.
|
|
|
|
|
|
|
|
Default value is @code{160x128}.
|
|
|
|
|
|
|
|
@item VideoIntraOnly (@emph{encoding,video})
|
|
|
|
Transmit only intra frames (useful for low bitrates, but kills frame rate).
|
|
|
|
|
|
|
|
@item VideoGopSize @var{n} (@emph{encoding,video})
|
|
|
|
If non-intra only, an intra frame is transmitted every VideoGopSize
|
|
|
|
frames. Video synchronization can only begin at an intra frame.
|
|
|
|
|
|
|
|
@item VideoTag @var{tag} (@emph{encoding,video})
|
|
|
|
Set video tag.
|
|
|
|
|
|
|
|
@item VideoHighQuality (@emph{encoding,video})
|
|
|
|
@item Video4MotionVector (@emph{encoding,video})
|
|
|
|
|
|
|
|
@item BitExact (@emph{encoding,video})
|
|
|
|
Set bitexact encoding flag.
|
|
|
|
|
|
|
|
@item IdctSimple (@emph{encoding,video})
|
|
|
|
Set simple IDCT algorithm.
|
|
|
|
|
|
|
|
@item Qscale @var{n} (@emph{encoding,video})
|
|
|
|
Enable constant quality encoding, and set video qscale (quantization
|
|
|
|
scale) value, expressed in @var{n} QP units.
|
|
|
|
|
|
|
|
@item VideoQMin @var{n} (@emph{encoding,video})
|
|
|
|
@item VideoQMax @var{n} (@emph{encoding,video})
|
|
|
|
Set video qmin/qmax.
|
|
|
|
|
|
|
|
@item VideoQDiff @var{integer} (@emph{encoding,video})
|
|
|
|
Set video @option{qdiff} encoding option.
|
|
|
|
|
|
|
|
@item LumiMask @var{float} (@emph{encoding,video})
|
|
|
|
@item DarkMask @var{float} (@emph{encoding,video})
|
|
|
|
Set @option{lumi_mask}/@option{dark_mask} encoding options.
|
|
|
|
|
|
|
|
@item AVOptionVideo [@var{codec}:]@var{option} @var{value} (@emph{encoding,video})
|
|
|
|
Set generic or private option for video stream.
|
|
|
|
Private option must be prefixed with codec name or codec must be defined before.
|
|
|
|
|
|
|
|
@item AVPresetVideo @var{preset} (@emph{encoding,video})
|
|
|
|
Set preset for video stream.
|
|
|
|
|
|
|
|
@var{preset} must be the path of a preset file.
|
|
|
|
@end table
|
|
|
|
|
|
|
|
@subsection Server status stream
|
|
|
|
|
|
|
|
A server status stream is a special stream which is used to show
|
|
|
|
statistics about the @command{ffserver} operations.
|
|
|
|
|
|
|
|
It must be specified setting the option @option{Format} to
|
|
|
|
@samp{status}.
|
|
|
|
|
|
|
|
@section Redirect section
|
|
|
|
|
|
|
|
A redirect section specifies where to redirect the requested URL to
|
|
|
|
another page.
|
|
|
|
|
|
|
|
A redirect section must be introduced by the line:
|
|
|
|
@example
|
|
|
|
<Redirect NAME>
|
|
|
|
@end example
|
|
|
|
|
|
|
|
where @var{NAME} is the name of the page which should be redirected.
|
|
|
|
|
|
|
|
It only accepts the option @option{URL}, which specify the redirection
|
|
|
|
URL.
|
|
|
|
|
|
|
|
@chapter Stream examples
|
|
|
|
|
|
|
|
@itemize
|
|
|
|
@item
|
|
|
|
Multipart JPEG
|
|
|
|
@example
|
|
|
|
<Stream test.mjpg>
|
|
|
|
Feed feed1.ffm
|
|
|
|
Format mpjpeg
|
|
|
|
VideoFrameRate 2
|
|
|
|
VideoIntraOnly
|
|
|
|
NoAudio
|
|
|
|
Strict -1
|
|
|
|
</Stream>
|
|
|
|
@end example
|
|
|
|
|
|
|
|
@item
|
|
|
|
Single JPEG
|
|
|
|
@example
|
|
|
|
<Stream test.jpg>
|
|
|
|
Feed feed1.ffm
|
|
|
|
Format jpeg
|
|
|
|
VideoFrameRate 2
|
|
|
|
VideoIntraOnly
|
|
|
|
VideoSize 352x240
|
|
|
|
NoAudio
|
|
|
|
Strict -1
|
|
|
|
</Stream>
|
|
|
|
@end example
|
|
|
|
|
|
|
|
@item
|
|
|
|
Flash
|
|
|
|
@example
|
|
|
|
<Stream test.swf>
|
|
|
|
Feed feed1.ffm
|
|
|
|
Format swf
|
|
|
|
VideoFrameRate 2
|
|
|
|
VideoIntraOnly
|
|
|
|
NoAudio
|
|
|
|
</Stream>
|
|
|
|
@end example
|
|
|
|
|
|
|
|
@item
|
|
|
|
ASF compatible
|
|
|
|
@example
|
|
|
|
<Stream test.asf>
|
|
|
|
Feed feed1.ffm
|
|
|
|
Format asf
|
|
|
|
VideoFrameRate 15
|
|
|
|
VideoSize 352x240
|
|
|
|
VideoBitRate 256
|
|
|
|
VideoBufferSize 40
|
|
|
|
VideoGopSize 30
|
|
|
|
AudioBitRate 64
|
|
|
|
StartSendOnKey
|
|
|
|
</Stream>
|
|
|
|
@end example
|
|
|
|
|
|
|
|
@item
|
|
|
|
MP3 audio
|
|
|
|
@example
|
|
|
|
<Stream test.mp3>
|
|
|
|
Feed feed1.ffm
|
|
|
|
Format mp2
|
|
|
|
AudioCodec mp3
|
|
|
|
AudioBitRate 64
|
|
|
|
AudioChannels 1
|
|
|
|
AudioSampleRate 44100
|
|
|
|
NoVideo
|
|
|
|
</Stream>
|
|
|
|
@end example
|
|
|
|
|
|
|
|
@item
|
|
|
|
Ogg Vorbis audio
|
|
|
|
@example
|
|
|
|
<Stream test.ogg>
|
|
|
|
Feed feed1.ffm
|
|
|
|
Metadata title "Stream title"
|
|
|
|
AudioBitRate 64
|
|
|
|
AudioChannels 2
|
|
|
|
AudioSampleRate 44100
|
|
|
|
NoVideo
|
|
|
|
</Stream>
|
|
|
|
@end example
|
|
|
|
|
|
|
|
@item
|
|
|
|
Real with audio only at 32 kbits
|
|
|
|
@example
|
|
|
|
<Stream test.ra>
|
|
|
|
Feed feed1.ffm
|
|
|
|
Format rm
|
|
|
|
AudioBitRate 32
|
|
|
|
NoVideo
|
|
|
|
</Stream>
|
|
|
|
@end example
|
|
|
|
|
|
|
|
@item
|
|
|
|
Real with audio and video at 64 kbits
|
|
|
|
@example
|
|
|
|
<Stream test.rm>
|
|
|
|
Feed feed1.ffm
|
|
|
|
Format rm
|
|
|
|
AudioBitRate 32
|
|
|
|
VideoBitRate 128
|
|
|
|
VideoFrameRate 25
|
|
|
|
VideoGopSize 25
|
|
|
|
</Stream>
|
|
|
|
@end example
|
|
|
|
|
|
|
|
@item
|
|
|
|
For stream coming from a file: you only need to set the input filename
|
|
|
|
and optionally a new format.
|
|
|
|
|
|
|
|
@example
|
|
|
|
<Stream file.rm>
|
|
|
|
File "/usr/local/httpd/htdocs/tlive.rm"
|
|
|
|
NoAudio
|
|
|
|
</Stream>
|
|
|
|
@end example
|
|
|
|
|
|
|
|
@example
|
|
|
|
<Stream file.asf>
|
|
|
|
File "/usr/local/httpd/htdocs/test.asf"
|
|
|
|
NoAudio
|
|
|
|
Metadata author "Me"
|
|
|
|
Metadata copyright "Super MegaCorp"
|
|
|
|
Metadata title "Test stream from disk"
|
|
|
|
Metadata comment "Test comment"
|
|
|
|
</Stream>
|
|
|
|
@end example
|
|
|
|
@end itemize
|
|
|
|
|
|
|
|
@c man end
|
|
|
|
|
|
|
|
@include config.texi
|
|
|
|
@ifset config-all
|
|
|
|
@ifset config-avutil
|
|
|
|
@include utils.texi
|
|
|
|
@end ifset
|
|
|
|
@ifset config-avcodec
|
|
|
|
@include codecs.texi
|
|
|
|
@include bitstream_filters.texi
|
|
|
|
@end ifset
|
|
|
|
@ifset config-avformat
|
|
|
|
@include formats.texi
|
|
|
|
@include protocols.texi
|
|
|
|
@end ifset
|
|
|
|
@ifset config-avdevice
|
|
|
|
@include devices.texi
|
|
|
|
@end ifset
|
|
|
|
@ifset config-swresample
|
|
|
|
@include resampler.texi
|
|
|
|
@end ifset
|
|
|
|
@ifset config-swscale
|
|
|
|
@include scaler.texi
|
|
|
|
@end ifset
|
|
|
|
@ifset config-avfilter
|
|
|
|
@include filters.texi
|
|
|
|
@end ifset
|
|
|
|
@end ifset
|
|
|
|
|
|
|
|
@chapter See Also
|
|
|
|
|
|
|
|
@ifhtml
|
|
|
|
@ifset config-all
|
|
|
|
@url{ffserver.html,ffserver},
|
|
|
|
@end ifset
|
|
|
|
@ifset config-not-all
|
|
|
|
@url{ffserver-all.html,ffserver-all},
|
|
|
|
@end ifset
|
|
|
|
the @file{doc/ffserver.conf} example,
|
|
|
|
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe},
|
|
|
|
@url{ffmpeg-utils.html,ffmpeg-utils},
|
|
|
|
@url{ffmpeg-scaler.html,ffmpeg-scaler},
|
|
|
|
@url{ffmpeg-resampler.html,ffmpeg-resampler},
|
|
|
|
@url{ffmpeg-codecs.html,ffmpeg-codecs},
|
|
|
|
@url{ffmpeg-bitstream-filters.html,ffmpeg-bitstream-filters},
|
|
|
|
@url{ffmpeg-formats.html,ffmpeg-formats},
|
|
|
|
@url{ffmpeg-devices.html,ffmpeg-devices},
|
|
|
|
@url{ffmpeg-protocols.html,ffmpeg-protocols},
|
|
|
|
@url{ffmpeg-filters.html,ffmpeg-filters}
|
|
|
|
@end ifhtml
|
|
|
|
|
|
|
|
@ifnothtml
|
|
|
|
@ifset config-all
|
|
|
|
ffserver(1),
|
|
|
|
@end ifset
|
|
|
|
@ifset config-not-all
|
|
|
|
ffserver-all(1),
|
|
|
|
@end ifset
|
|
|
|
the @file{doc/ffserver.conf} example, ffmpeg(1), ffplay(1), ffprobe(1),
|
|
|
|
ffmpeg-utils(1), ffmpeg-scaler(1), ffmpeg-resampler(1),
|
|
|
|
ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), ffmpeg-formats(1),
|
|
|
|
ffmpeg-devices(1), ffmpeg-protocols(1), ffmpeg-filters(1)
|
|
|
|
@end ifnothtml
|
|
|
|
|
|
|
|
@include authors.texi
|
|
|
|
|
|
|
|
@ignore
|
|
|
|
|
|
|
|
@setfilename ffserver
|
|
|
|
@settitle ffserver video server
|
|
|
|
|
|
|
|
@end ignore
|
|
|
|
|
|
|
|
@bye
|