mirror of https://github.com/FFmpeg/FFmpeg.git
parent
2ca65fc7b7
commit
6b35a83214
39 changed files with 44 additions and 7340 deletions
@ -1,372 +0,0 @@ |
||||
# Port on which the server is listening. You must select a different |
||||
# port from your standard HTTP web server if it is running on the same |
||||
# computer. |
||||
HTTPPort 8090 |
||||
|
||||
# Address on which the server is bound. Only useful if you have |
||||
# several network interfaces. |
||||
HTTPBindAddress 0.0.0.0 |
||||
|
||||
# Number of simultaneous HTTP connections that can be handled. It has |
||||
# to be defined *before* the MaxClients parameter, since it defines the |
||||
# MaxClients maximum limit. |
||||
MaxHTTPConnections 2000 |
||||
|
||||
# Number of simultaneous requests that can be handled. Since FFServer |
||||
# is very fast, it is more likely that you will want to leave this high |
||||
# and use MaxBandwidth, below. |
||||
MaxClients 1000 |
||||
|
||||
# This the maximum amount of kbit/sec that you are prepared to |
||||
# consume when streaming to clients. |
||||
MaxBandwidth 1000 |
||||
|
||||
# Access log file (uses standard Apache log file format) |
||||
# '-' is the standard output. |
||||
CustomLog - |
||||
|
||||
################################################################## |
||||
# Definition of the live feeds. Each live feed contains one video |
||||
# and/or audio sequence coming from an ffmpeg encoder or another |
||||
# ffserver. This sequence may be encoded simultaneously with several |
||||
# codecs at several resolutions. |
||||
|
||||
<Feed feed1.ffm> |
||||
|
||||
# You must use 'ffmpeg' to send a live feed to ffserver. In this |
||||
# example, you can type: |
||||
# |
||||
# ffmpeg http://localhost:8090/feed1.ffm |
||||
|
||||
# ffserver can also do time shifting. It means that it can stream any |
||||
# previously recorded live stream. The request should contain: |
||||
# "http://xxxx?date=[YYYY-MM-DDT][[HH:]MM:]SS[.m...]".You must specify |
||||
# a path where the feed is stored on disk. You also specify the |
||||
# maximum size of the feed, where zero means unlimited. Default: |
||||
# File=/tmp/feed_name.ffm FileMaxSize=5M |
||||
File /tmp/feed1.ffm |
||||
FileMaxSize 200K |
||||
|
||||
# You could specify |
||||
# ReadOnlyFile /saved/specialvideo.ffm |
||||
# This marks the file as readonly and it will not be deleted or updated. |
||||
|
||||
# Specify launch in order to start ffmpeg automatically. |
||||
# First ffmpeg must be defined with an appropriate path if needed, |
||||
# after that options can follow, but avoid adding the http:// field |
||||
#Launch ffmpeg |
||||
|
||||
# Only allow connections from localhost to the feed. |
||||
ACL allow 127.0.0.1 |
||||
|
||||
</Feed> |
||||
|
||||
|
||||
################################################################## |
||||
# Now you can define each stream which will be generated from the |
||||
# original audio and video stream. Each format has a filename (here |
||||
# 'test1.mpg'). FFServer will send this stream when answering a |
||||
# request containing this filename. |
||||
|
||||
<Stream test1.mpg> |
||||
|
||||
# coming from live feed 'feed1' |
||||
Feed feed1.ffm |
||||
|
||||
# Format of the stream : you can choose among: |
||||
# mpeg : MPEG-1 multiplexed video and audio |
||||
# mpegvideo : only MPEG-1 video |
||||
# mp2 : MPEG-2 audio (use AudioCodec to select layer 2 and 3 codec) |
||||
# ogg : Ogg format (Vorbis audio codec) |
||||
# rm : RealNetworks-compatible stream. Multiplexed audio and video. |
||||
# ra : RealNetworks-compatible stream. Audio only. |
||||
# mpjpeg : Multipart JPEG (works with Netscape without any plugin) |
||||
# jpeg : Generate a single JPEG image. |
||||
# mjpeg : Generate a M-JPEG stream. |
||||
# asf : ASF compatible streaming (Windows Media Player format). |
||||
# swf : Macromedia Flash compatible stream |
||||
# avi : AVI format (MPEG-4 video, MPEG audio sound) |
||||
Format mpeg |
||||
|
||||
# Bitrate for the audio stream. Codecs usually support only a few |
||||
# different bitrates. |
||||
AudioBitRate 32 |
||||
|
||||
# Number of audio channels: 1 = mono, 2 = stereo |
||||
AudioChannels 1 |
||||
|
||||
# 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. |
||||
AudioSampleRate 44100 |
||||
|
||||
# Bitrate for the video stream |
||||
VideoBitRate 64 |
||||
|
||||
# Ratecontrol buffer size |
||||
VideoBufferSize 40 |
||||
|
||||
# Number of frames per second |
||||
VideoFrameRate 3 |
||||
|
||||
# Size of the video frame: WxH (default: 160x128) |
||||
# The following abbreviations are defined: sqcif, qcif, cif, 4cif, qqvga, |
||||
# qvga, vga, svga, xga, uxga, qxga, sxga, qsxga, hsxga, wvga, wxga, wsxga, |
||||
# wuxga, woxga, wqsxga, wquxga, whsxga, whuxga, cga, ega, hd480, hd720, |
||||
# hd1080 |
||||
VideoSize 160x128 |
||||
|
||||
# Transmit only intra frames (useful for low bitrates, but kills frame rate). |
||||
#VideoIntraOnly |
||||
|
||||
# If non-intra only, an intra frame is transmitted every VideoGopSize |
||||
# frames. Video synchronization can only begin at an intra frame. |
||||
VideoGopSize 12 |
||||
|
||||
# More MPEG-4 parameters |
||||
# VideoHighQuality |
||||
# Video4MotionVector |
||||
|
||||
# Choose your codecs: |
||||
#AudioCodec mp2 |
||||
#VideoCodec mpeg1video |
||||
|
||||
# Suppress audio |
||||
#NoAudio |
||||
|
||||
# Suppress video |
||||
#NoVideo |
||||
|
||||
#VideoQMin 3 |
||||
#VideoQMax 31 |
||||
|
||||
# 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. |
||||
#Preroll 15 |
||||
|
||||
# ACL: |
||||
|
||||
# You can allow ranges of addresses (or single addresses) |
||||
#ACL ALLOW <first address> <last address> |
||||
|
||||
# You can deny ranges of addresses (or single addresses) |
||||
#ACL DENY <first address> <last address> |
||||
|
||||
# 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. |
||||
|
||||
</Stream> |
||||
|
||||
|
||||
################################################################## |
||||
# Example streams |
||||
|
||||
|
||||
# Multipart JPEG |
||||
|
||||
#<Stream test.mjpg> |
||||
#Feed feed1.ffm |
||||
#Format mpjpeg |
||||
#VideoFrameRate 2 |
||||
#VideoIntraOnly |
||||
#NoAudio |
||||
#Strict -1 |
||||
#</Stream> |
||||
|
||||
|
||||
# Single JPEG |
||||
|
||||
#<Stream test.jpg> |
||||
#Feed feed1.ffm |
||||
#Format jpeg |
||||
#VideoFrameRate 2 |
||||
#VideoIntraOnly |
||||
##VideoSize 352x240 |
||||
#NoAudio |
||||
#Strict -1 |
||||
#</Stream> |
||||
|
||||
|
||||
# Flash |
||||
|
||||
#<Stream test.swf> |
||||
#Feed feed1.ffm |
||||
#Format swf |
||||
#VideoFrameRate 2 |
||||
#VideoIntraOnly |
||||
#NoAudio |
||||
#</Stream> |
||||
|
||||
|
||||
# ASF compatible |
||||
|
||||
<Stream test.asf> |
||||
Feed feed1.ffm |
||||
Format asf |
||||
VideoFrameRate 15 |
||||
VideoSize 352x240 |
||||
VideoBitRate 256 |
||||
VideoBufferSize 40 |
||||
VideoGopSize 30 |
||||
AudioBitRate 64 |
||||
StartSendOnKey |
||||
</Stream> |
||||
|
||||
|
||||
# MP3 audio |
||||
|
||||
#<Stream test.mp3> |
||||
#Feed feed1.ffm |
||||
#Format mp2 |
||||
#AudioCodec mp3 |
||||
#AudioBitRate 64 |
||||
#AudioChannels 1 |
||||
#AudioSampleRate 44100 |
||||
#NoVideo |
||||
#</Stream> |
||||
|
||||
|
||||
# Ogg Vorbis audio |
||||
|
||||
#<Stream test.ogg> |
||||
#Feed feed1.ffm |
||||
#Metadata title "Stream title" |
||||
#AudioBitRate 64 |
||||
#AudioChannels 2 |
||||
#AudioSampleRate 44100 |
||||
#NoVideo |
||||
#</Stream> |
||||
|
||||
|
||||
# Real with audio only at 32 kbits |
||||
|
||||
#<Stream test.ra> |
||||
#Feed feed1.ffm |
||||
#Format rm |
||||
#AudioBitRate 32 |
||||
#NoVideo |
||||
#NoAudio |
||||
#</Stream> |
||||
|
||||
|
||||
# Real with audio and video at 64 kbits |
||||
|
||||
#<Stream test.rm> |
||||
#Feed feed1.ffm |
||||
#Format rm |
||||
#AudioBitRate 32 |
||||
#VideoBitRate 128 |
||||
#VideoFrameRate 25 |
||||
#VideoGopSize 25 |
||||
#NoAudio |
||||
#</Stream> |
||||
|
||||
|
||||
################################################################## |
||||
# A stream coming from a file: you only need to set the input |
||||
# filename and optionally a new format. Supported conversions: |
||||
# AVI -> ASF |
||||
|
||||
#<Stream file.rm> |
||||
#File "/usr/local/httpd/htdocs/tlive.rm" |
||||
#NoAudio |
||||
#</Stream> |
||||
|
||||
#<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> |
||||
|
||||
|
||||
################################################################## |
||||
# RTSP examples |
||||
# |
||||
# You can access this stream with the RTSP URL: |
||||
# rtsp://localhost:5454/test1-rtsp.mpg |
||||
# |
||||
# A non-standard RTSP redirector is also created. Its URL is: |
||||
# http://localhost:8090/test1-rtsp.rtsp |
||||
|
||||
#<Stream test1-rtsp.mpg> |
||||
#Format rtp |
||||
#File "/usr/local/httpd/htdocs/test1.mpg" |
||||
#</Stream> |
||||
|
||||
|
||||
# Transcode an incoming live feed to another live feed, |
||||
# using libx264 and video presets |
||||
|
||||
#<Stream live.h264> |
||||
#Format rtp |
||||
#Feed feed1.ffm |
||||
#VideoCodec libx264 |
||||
#VideoFrameRate 24 |
||||
#VideoBitRate 100 |
||||
#VideoSize 480x272 |
||||
#AVPresetVideo default |
||||
#AVPresetVideo baseline |
||||
#AVOptionVideo flags +global_header |
||||
# |
||||
#AudioCodec aac |
||||
#AudioBitRate 32 |
||||
#AudioChannels 2 |
||||
#AudioSampleRate 22050 |
||||
#AVOptionAudio flags +global_header |
||||
#</Stream> |
||||
|
||||
################################################################## |
||||
# SDP/multicast examples |
||||
# |
||||
# If you want to send your stream in multicast, you must set the |
||||
# multicast address with MulticastAddress. The port and the TTL can |
||||
# also be set. |
||||
# |
||||
# An SDP file is automatically generated by ffserver by adding the |
||||
# 'sdp' extension to the stream name (here |
||||
# http://localhost:8090/test1-sdp.sdp). You should usually give this |
||||
# file to your player to play the stream. |
||||
# |
||||
# The 'NoLoop' option can be used to avoid looping when the stream is |
||||
# terminated. |
||||
|
||||
#<Stream test1-sdp.mpg> |
||||
#Format rtp |
||||
#File "/usr/local/httpd/htdocs/test1.mpg" |
||||
#MulticastAddress 224.124.0.1 |
||||
#MulticastPort 5000 |
||||
#MulticastTTL 16 |
||||
#NoLoop |
||||
#</Stream> |
||||
|
||||
|
||||
################################################################## |
||||
# Special streams |
||||
|
||||
# Server status |
||||
|
||||
<Stream stat.html> |
||||
Format status |
||||
|
||||
# Only allow local people to get the status |
||||
ACL allow localhost |
||||
ACL allow 192.168.0.0 192.168.255.255 |
||||
|
||||
#FaviconURL http://pond1.gladstonefamily.net:8080/favicon.ico |
||||
</Stream> |
||||
|
||||
|
||||
# Redirect index.html to the appropriate site |
||||
|
||||
<Redirect index.html> |
||||
URL http://www.ffmpeg.org/ |
||||
</Redirect> |
@ -1,923 +0,0 @@ |
||||
\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 following 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 last occurrence overrides the previous if multiple definitions exist. |
||||
@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 |
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,155 +0,0 @@ |
||||
/*
|
||||
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard |
||||
* |
||||
* This file is part of FFmpeg. |
||||
* |
||||
* FFmpeg is free software; you can redistribute it and/or |
||||
* modify it under the terms of the GNU Lesser General Public |
||||
* License as published by the Free Software Foundation; either |
||||
* version 2.1 of the License, or (at your option) any later version. |
||||
* |
||||
* FFmpeg is distributed in the hope that it will be useful, |
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
||||
* Lesser General Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU Lesser General Public |
||||
* License along with FFmpeg; if not, write to the Free Software |
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
||||
*/ |
||||
|
||||
#ifndef FFTOOLS_FFSERVER_CONFIG_H |
||||
#define FFTOOLS_FFSERVER_CONFIG_H |
||||
|
||||
#define FFM_PACKET_SIZE 4096 |
||||
|
||||
#include "libavutil/dict.h" |
||||
#include "libavformat/avformat.h" |
||||
#include "libavformat/network.h" |
||||
|
||||
#define FFSERVER_MAX_STREAMS 20 |
||||
|
||||
/* each generated stream is described here */ |
||||
enum FFServerStreamType { |
||||
STREAM_TYPE_LIVE, |
||||
STREAM_TYPE_STATUS, |
||||
STREAM_TYPE_REDIRECT, |
||||
}; |
||||
|
||||
enum FFServerIPAddressAction { |
||||
IP_ALLOW = 1, |
||||
IP_DENY, |
||||
}; |
||||
|
||||
typedef struct FFServerIPAddressACL { |
||||
struct FFServerIPAddressACL *next; |
||||
enum FFServerIPAddressAction action; |
||||
/* These are in host order */ |
||||
struct in_addr first; |
||||
struct in_addr last; |
||||
} FFServerIPAddressACL; |
||||
|
||||
/**
|
||||
* This holds the stream parameters for an AVStream, it cannot be a AVStream |
||||
* because AVStreams cannot be instanciated without a AVFormatContext, especially |
||||
* not outside libavformat. |
||||
* |
||||
* The fields of this struct have the same semantics as the fields of an AVStream. |
||||
*/ |
||||
typedef struct LayeredAVStream { |
||||
int index; |
||||
int id; |
||||
AVCodecParameters *codecpar; |
||||
AVCodecContext *codec; |
||||
AVRational time_base; |
||||
int pts_wrap_bits; |
||||
AVRational sample_aspect_ratio; |
||||
char *recommended_encoder_configuration; |
||||
} LayeredAVStream; |
||||
|
||||
/* description of each stream of the ffserver.conf file */ |
||||
typedef struct FFServerStream { |
||||
enum FFServerStreamType stream_type; |
||||
char filename[1024]; /* stream filename */ |
||||
struct FFServerStream *feed; /* feed we are using (can be null if coming from file) */ |
||||
AVDictionary *in_opts; /* input parameters */ |
||||
AVDictionary *metadata; /* metadata to set on the stream */ |
||||
AVInputFormat *ifmt; /* if non NULL, force input format */ |
||||
AVOutputFormat *fmt; |
||||
FFServerIPAddressACL *acl; |
||||
char dynamic_acl[1024]; |
||||
int nb_streams; |
||||
int prebuffer; /* Number of milliseconds early to start */ |
||||
int64_t max_time; /* Number of milliseconds to run */ |
||||
int send_on_key; |
||||
LayeredAVStream *streams[FFSERVER_MAX_STREAMS]; |
||||
int feed_streams[FFSERVER_MAX_STREAMS]; /* index of streams in the feed */ |
||||
char feed_filename[1024]; /* file name of the feed storage, or
|
||||
input file name for a stream */ |
||||
pid_t pid; /* Of ffmpeg process */ |
||||
time_t pid_start; /* Of ffmpeg process */ |
||||
char **child_argv; |
||||
struct FFServerStream *next; |
||||
unsigned bandwidth; /* bandwidth, in kbits/s */ |
||||
/* RTSP options */ |
||||
char *rtsp_option; |
||||
/* multicast specific */ |
||||
int is_multicast; |
||||
struct in_addr multicast_ip; |
||||
int multicast_port; /* first port used for multicast */ |
||||
int multicast_ttl; |
||||
int loop; /* if true, send the stream in loops (only meaningful if file) */ |
||||
char single_frame; /* only single frame */ |
||||
|
||||
/* feed specific */ |
||||
int feed_opened; /* true if someone is writing to the feed */ |
||||
int is_feed; /* true if it is a feed */ |
||||
int readonly; /* True if writing is prohibited to the file */ |
||||
int truncate; /* True if feeder connection truncate the feed file */ |
||||
int conns_served; |
||||
int64_t bytes_served; |
||||
int64_t feed_max_size; /* maximum storage size, zero means unlimited */ |
||||
int64_t feed_write_index; /* current write position in feed (it wraps around) */ |
||||
int64_t feed_size; /* current size of feed */ |
||||
struct FFServerStream *next_feed; |
||||
} FFServerStream; |
||||
|
||||
typedef struct FFServerConfig { |
||||
char *filename; |
||||
FFServerStream *first_feed; /* contains only feeds */ |
||||
FFServerStream *first_stream; /* contains all streams, including feeds */ |
||||
unsigned int nb_max_http_connections; |
||||
unsigned int nb_max_connections; |
||||
uint64_t max_bandwidth; |
||||
int debug; |
||||
int bitexact; |
||||
char logfilename[1024]; |
||||
struct sockaddr_in http_addr; |
||||
struct sockaddr_in rtsp_addr; |
||||
int errors; |
||||
int warnings; |
||||
int use_defaults; |
||||
// Following variables MUST NOT be used outside configuration parsing code.
|
||||
enum AVCodecID guessed_audio_codec_id; |
||||
enum AVCodecID guessed_video_codec_id; |
||||
AVDictionary *video_opts; /* AVOptions for video encoder */ |
||||
AVDictionary *audio_opts; /* AVOptions for audio encoder */ |
||||
AVCodecContext *dummy_actx; /* Used internally to test audio AVOptions. */ |
||||
AVCodecContext *dummy_vctx; /* Used internally to test video AVOptions. */ |
||||
int no_audio; |
||||
int no_video; |
||||
int line_num; |
||||
int stream_use_defaults; |
||||
} FFServerConfig; |
||||
|
||||
void ffserver_get_arg(char *buf, int buf_size, const char **pp); |
||||
|
||||
void ffserver_parse_acl_row(FFServerStream *stream, FFServerStream* feed, |
||||
FFServerIPAddressACL *ext_acl, |
||||
const char *p, const char *filename, int line_num); |
||||
|
||||
int ffserver_parse_ffconfig(const char *filename, FFServerConfig *config); |
||||
|
||||
void ffserver_free_child_args(void *argsp); |
||||
|
||||
#endif /* FFTOOLS_FFSERVER_CONFIG_H */ |
@ -1,45 +0,0 @@ |
||||
#!/bin/sh |
||||
|
||||
target_samples=$3 |
||||
target_exec=$4 |
||||
target_path=$5 |
||||
|
||||
#perl -e 'chomp($wd = `pwd`); print map { s!tests/data/!!; "<Stream $_>\nFile $wd/tests/data/$_\n</Stream>\n\n" } @ARGV' tests/data/a* >> tests/data/ffserver.conf |
||||
#perl -e 'chomp($wd = `pwd`); print map { s!tests/data/!!; "<Stream $_.asf>\nFile $wd/tests/data/$_\n</Stream>\n\n" } @ARGV' tests/data/a* >> tests/data/ffserver.conf |
||||
|
||||
. $(dirname $0)/md5.sh |
||||
|
||||
FILES=$(sed -n 's/^[^#]*<Stream \(.*\)>.*/\1/p' $2 | grep -v html) |
||||
|
||||
rm -f tests/feed1.ffm |
||||
$target_exec ${target_path}/ffserver${PROGSUF} -f "$2" & |
||||
FFSERVER_PID=$! |
||||
echo "Waiting for feeds to startup..." |
||||
sleep 2 |
||||
( |
||||
cd tests/data || exit $? |
||||
rm -f ff-* ffserver.regression |
||||
WGET_OPTIONS="--user-agent=NSPlayer -q --proxy=off -e verbose=off -e server_response=off -T3 --tries=1" |
||||
for file in $FILES; do |
||||
if [ $(expr $file : "a-*") != 0 ]; then |
||||
wget $WGET_OPTIONS -O - http://localhost:9999/$file > ff-$file |
||||
else |
||||
wget $WGET_OPTIONS -O - http://localhost:9999/$file?date=19700101T000000Z | dd bs=1 count=100000 > ff-$file 2>/dev/null |
||||
fi |
||||
do_md5sum ff-$file >>ffserver.regression |
||||
done |
||||
wget $WGET_OPTIONS -O - 'http://localhost:9999/teststat.html?abc' > ff-stat 2>/dev/null |
||||
do_md5sum ff-stat >>ffserver.regression |
||||
) |
||||
kill $FFSERVER_PID |
||||
wait > /dev/null 2>&1 |
||||
rm -f tests/feed1.ffm |
||||
if diff -u "$1" tests/data/ffserver.regression; then |
||||
echo |
||||
echo Server regression test succeeded. |
||||
exit 0 |
||||
else |
||||
echo |
||||
echo Server regression test: Error. |
||||
exit 1 |
||||
fi |
@ -1,311 +0,0 @@ |
||||
# |
||||
# This is a test configuration file. You can invoke it with |
||||
# ../ffserver -f ffserver.conf |
||||
# when in the tests directory and once the vsynth1 subdirectory |
||||
# has been populated. Then point your browser at http://whatever:9999/teststat.html |
||||
# and you can look at the streams |
||||
# |
||||
|
||||
# |
||||
# Port on which the server is listening. You must select a different |
||||
# port from your standard http web server if it is running on the same |
||||
# computer. |
||||
|
||||
HTTPPort 9999 |
||||
RTSPPort 9990 |
||||
|
||||
# Address on which the server is bound. Only useful if you have |
||||
# several network interfaces. |
||||
|
||||
HTTPBindAddress 0.0.0.0 |
||||
|
||||
# Number of simultaneous requests that can be handled. Since FFServer |
||||
# is very fast, this limit is determined mainly by your Internet |
||||
# connection speed. |
||||
|
||||
MaxClients 1000 |
||||
|
||||
MaxBandwidth 100000 |
||||
|
||||
# Access Log file (uses standard Apache log file format) |
||||
# '-' is the standard output |
||||
|
||||
CustomLog - |
||||
|
||||
################################################################## |
||||
# Definition of the live feeds. Each live feed contains one video |
||||
# and/or audio sequence coming from an ffmpeg encoder or another |
||||
# ffserver. This sequence may be encoded simultaneously with several |
||||
# codecs at several resolutions. |
||||
|
||||
<Feed feed1.ffm> |
||||
|
||||
# You must use 'ffmpeg' to send a live feed to ffserver. In this |
||||
# example, you can type: |
||||
# |
||||
# ffmpeg http://localhost:8090/feed1.ffm |
||||
|
||||
# ffserver can also do time shifting. It means that it can stream any |
||||
# previously recorded live stream. The request should contain: |
||||
# "http://xxxx?date=[YYYY-MM-DDT][[HH:]MM:]SS[.m...]".You must specify |
||||
# a path where the feed is stored on disk. You also specify the |
||||
# maximum size of the feed (100M bytes here). Default: |
||||
# File=/tmp/feed_name.ffm FileMaxSize=5M |
||||
|
||||
File tests/feed1.ffm |
||||
FileMaxSize 100M |
||||
|
||||
# Fire up ffmpeg pointing at this stream |
||||
|
||||
Launch ./ffmpeg -v 0 -y -f image2 -flags +bitexact -fflags +bitexact -i tests/vsynth1/%02d.pgm -flags +bitexact -fflags +bitexact |
||||
|
||||
ACL allow localhost |
||||
</Feed> |
||||
|
||||
################################################################## |
||||
# Now you can define each stream which will be generated from the |
||||
# original audio and video stream. Each format has a filename (here |
||||
# 'test128.mpg'). FFServer will send this stream when answering a |
||||
# request containing this filename. |
||||
|
||||
<Stream test_h.avi> |
||||
Feed feed1.ffm |
||||
Format avi |
||||
# |
||||
BitExact |
||||
DctFastint |
||||
IdctSimple |
||||
VideoFrameRate 10 |
||||
VideoSize 352x288 |
||||
VideoBitRate 100 |
||||
VideoGopSize 30 |
||||
NoAudio |
||||
|
||||
PreRoll 10 |
||||
StartSendOnKey |
||||
MaxTime 100 |
||||
|
||||
</Stream> |
||||
|
||||
<Stream test_l.avi> |
||||
Feed feed1.ffm |
||||
Format avi |
||||
# |
||||
BitExact |
||||
DctFastint |
||||
IdctSimple |
||||
VideoFrameRate 2 |
||||
VideoSize 320x240 |
||||
VideoBitRate 40 |
||||
VideoGopSize 20 |
||||
NoAudio |
||||
|
||||
PreRoll 20 |
||||
StartSendOnKey |
||||
MaxTime 100 |
||||
|
||||
</Stream> |
||||
|
||||
#<Stream test_h.mpg> |
||||
#Feed feed1.ffm |
||||
# |
||||
#VideoFrameRate 10 |
||||
#VideoSize 352x288 |
||||
#VideoBitRate 100 |
||||
#VideoGopSize 30 |
||||
#NoAudio |
||||
|
||||
#PreRoll 10 |
||||
#StartSendOnKey |
||||
#MaxTime 100 |
||||
# |
||||
#</Stream> |
||||
# |
||||
#<Stream test_l.mpg> |
||||
#Feed feed1.ffm |
||||
## |
||||
#VideoFrameRate 2 |
||||
#VideoSize 320x240 |
||||
#VideoBitRate 40 |
||||
#VideoGopSize 20 |
||||
#NoAudio |
||||
# |
||||
#PreRoll 20 |
||||
#StartSendOnKey |
||||
#MaxTime 100 |
||||
# |
||||
#</Stream> |
||||
# |
||||
<Stream test.swf> |
||||
Feed feed1.ffm |
||||
# |
||||
BitExact |
||||
DctFastint |
||||
IdctSimple |
||||
Qscale 10 |
||||
VideoFrameRate 10 |
||||
VideoSize 352x288 |
||||
VideoBitRate 100 |
||||
VideoGopSize 30 |
||||
NoAudio |
||||
|
||||
PreRoll 10 |
||||
StartSendOnKey |
||||
MaxTime 100 |
||||
|
||||
</Stream> |
||||
|
||||
<Stream test_h.asf> |
||||
Feed feed1.ffm |
||||
Format asf |
||||
# |
||||
BitExact |
||||
DctFastint |
||||
IdctSimple |
||||
Qscale 10 |
||||
VideoFrameRate 10 |
||||
VideoSize 320x240 |
||||
VideoBitRate 100 |
||||
VideoGopSize 30 |
||||
NoAudio |
||||
|
||||
PreRoll 10 |
||||
StartSendOnKey |
||||
MaxTime 100 |
||||
|
||||
AVOptionVideo flags +global_header |
||||
|
||||
Metadata title "Test data stream" |
||||
|
||||
</Stream> |
||||
|
||||
<Stream test_l.asf> |
||||
Feed feed1.ffm |
||||
Format asf |
||||
# |
||||
BitExact |
||||
DctFastint |
||||
IdctSimple |
||||
Qscale 10 |
||||
VideoFrameRate 2 |
||||
VideoSize 320x240 |
||||
VideoBitRate 40 |
||||
VideoGopSize 20 |
||||
NoAudio |
||||
|
||||
PreRoll 20 |
||||
StartSendOnKey |
||||
MaxTime 100 |
||||
|
||||
AVOptionVideo flags +global_header |
||||
|
||||
Metadata title "Test data stream" |
||||
|
||||
</Stream> |
||||
|
||||
<Stream test_h.rm> |
||||
|
||||
Feed feed1.ffm |
||||
Format rm |
||||
|
||||
BitExact |
||||
DctFastint |
||||
IdctSimple |
||||
Qscale 10 |
||||
VideoBitRate 100 |
||||
VideoFrameRate 10 |
||||
VideoGopSize 30 |
||||
VideoSize 320x240 |
||||
NoAudio |
||||
|
||||
PreRoll 10 |
||||
StartSendOnKey |
||||
MaxTime 100 |
||||
|
||||
</Stream> |
||||
|
||||
<Stream test_l.rm> |
||||
|
||||
Feed feed1.ffm |
||||
Format rm |
||||
|
||||
BitExact |
||||
DctFastint |
||||
IdctSimple |
||||
Qscale 10 |
||||
VideoBitRate 40 |
||||
VideoFrameRate 2 |
||||
VideoGopSize 20 |
||||
VideoSize 320x240 |
||||
NoAudio |
||||
|
||||
PreRoll 20 |
||||
StartSendOnKey |
||||
MaxTime 100 |
||||
|
||||
</Stream> |
||||
|
||||
|
||||
<Stream test.jpg> |
||||
|
||||
Feed feed1.ffm |
||||
Format jpeg |
||||
Strict -1 |
||||
|
||||
BitExact |
||||
DctFastint |
||||
IdctSimple |
||||
VideoFrameRate 1 |
||||
VideoSize 352x288 |
||||
NoAudio |
||||
|
||||
PreRoll 2 |
||||
|
||||
</Stream> |
||||
|
||||
<Stream test_small.jpg> |
||||
|
||||
Feed feed1.ffm |
||||
Format jpeg |
||||
Strict -1 |
||||
|
||||
BitExact |
||||
DctFastint |
||||
IdctSimple |
||||
VideoFrameRate 1 |
||||
VideoSize 160x128 |
||||
NoAudio |
||||
|
||||
PreRoll 2 |
||||
|
||||
</Stream> |
||||
|
||||
<Stream test.mjpg> |
||||
|
||||
Feed feed1.ffm |
||||
Format mpjpeg |
||||
Strict -1 |
||||
|
||||
BitExact |
||||
DctFastint |
||||
IdctSimple |
||||
VideoFrameRate 1 |
||||
VideoSize 320x240 |
||||
NoAudio |
||||
StartSendOnKey |
||||
|
||||
PreRoll 1 |
||||
MaxTime 100 |
||||
|
||||
</Stream> |
||||
|
||||
|
||||
################################################################## |
||||
# Special stream : server status |
||||
|
||||
<Stream teststat.html> |
||||
|
||||
Format status |
||||
|
||||
</Stream> |
||||
|
@ -1,11 +0,0 @@ |
||||
0c9639f09decbc54c9f091dcf1ca0e8f *ff-test_h.avi |
||||
e28ba75853caf975e06d92955c9f7f73 *ff-test_l.avi |
||||
a767dbdf5d1bded3450279f812f97b37 *ff-test.swf |
||||
ca209a0c67afbd3bc3bcde0840f313fc *ff-test_h.asf |
||||
f97a91609bfc8a1857455f17c5ec101c *ff-test_l.asf |
||||
06f5a6a4c5d1c6735f4d0068e825c91f *ff-test_h.rm |
||||
1f57580f02f0317407b3b82a3d5e093f *ff-test_l.rm |
||||
e04e6ebf9584654df131f5eec881ac38 *ff-test.jpg |
||||
f15d43e9d3630601b61a024023249bb8 *ff-test_small.jpg |
||||
4735c72cde67000f12e9d1dbfbd975a7 *ff-test.mjpg |
||||
fd038af80560e15271ce42651093ee43 *ff-stat |
Loading…
Reference in new issue