Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>tags/n4.0
@@ -29,7 +29,6 @@ | |||||
/ffmpeg | /ffmpeg | ||||
/ffplay | /ffplay | ||||
/ffprobe | /ffprobe | ||||
/ffserver | |||||
/config.asm | /config.asm | ||||
/config.h | /config.h | ||||
/coverage.info | /coverage.info | ||||
@@ -35,6 +35,7 @@ version <next>: | |||||
- hilbert audio filter source | - hilbert audio filter source | ||||
- aiir audio filter | - aiir audio filter | ||||
- aiff: add support for CD-ROM XA ADPCM | - aiff: add support for CD-ROM XA ADPCM | ||||
- Removed the ffserver program | |||||
version 3.4: | version 3.4: | ||||
@@ -29,9 +29,6 @@ ffplay: | |||||
ffprobe: | ffprobe: | ||||
ffprobe.c Stefano Sabatini | ffprobe.c Stefano Sabatini | ||||
ffserver: | |||||
ffserver.c Reynaldo H. Verdejo Pinochet | |||||
Commandline utility code: | Commandline utility code: | ||||
cmdutils.c, cmdutils.h Michael Niedermayer | cmdutils.c, cmdutils.h Michael Niedermayer | ||||
@@ -21,8 +21,6 @@ such as audio, video, subtitles and related metadata. | |||||
* [ffplay](https://ffmpeg.org/ffplay.html) is a minimalistic multimedia player. | * [ffplay](https://ffmpeg.org/ffplay.html) is a minimalistic multimedia player. | ||||
* [ffprobe](https://ffmpeg.org/ffprobe.html) is a simple analysis tool to inspect | * [ffprobe](https://ffmpeg.org/ffprobe.html) is a simple analysis tool to inspect | ||||
multimedia content. | multimedia content. | ||||
* [ffserver](https://ffmpeg.org/ffserver.html) is a multimedia streaming server | |||||
for live broadcasts. | |||||
* Additional small tools such as `aviocat`, `ismindex` and `qt-faststart`. | * Additional small tools such as `aviocat`, `ismindex` and `qt-faststart`. | ||||
## Documentation | ## Documentation | ||||
@@ -116,7 +116,6 @@ Program options: | |||||
--disable-ffmpeg disable ffmpeg build | --disable-ffmpeg disable ffmpeg build | ||||
--disable-ffplay disable ffplay build | --disable-ffplay disable ffplay build | ||||
--disable-ffprobe disable ffprobe build | --disable-ffprobe disable ffprobe build | ||||
--disable-ffserver disable ffserver build | |||||
Documentation options: | Documentation options: | ||||
--disable-doc do not build documentation | --disable-doc do not build documentation | ||||
@@ -1722,7 +1721,6 @@ LICENSE_LIST=" | |||||
PROGRAM_LIST=" | PROGRAM_LIST=" | ||||
ffplay | ffplay | ||||
ffprobe | ffprobe | ||||
ffserver | |||||
ffmpeg | ffmpeg | ||||
" | " | ||||
@@ -3358,8 +3356,6 @@ ffplay_select="rdft crop_filter transpose_filter hflip_filter vflip_filter rotat | |||||
ffplay_suggest="shell32" | ffplay_suggest="shell32" | ||||
ffprobe_deps="avcodec avformat" | ffprobe_deps="avcodec avformat" | ||||
ffprobe_suggest="shell32" | ffprobe_suggest="shell32" | ||||
ffserver_deps="avformat fork sarestart" | |||||
ffserver_select="ffm_muxer rtp_protocol rtsp_demuxer" | |||||
# documentation | # documentation | ||||
podpages_deps="perl" | podpages_deps="perl" | ||||
@@ -26,12 +26,12 @@ bitstream level modifications without performing decoding. | |||||
@chapter See Also | @chapter See Also | ||||
@ifhtml | @ifhtml | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, | |||||
@url{libavcodec.html,libavcodec} | @url{libavcodec.html,libavcodec} | ||||
@end ifhtml | @end ifhtml | ||||
@ifnothtml | @ifnothtml | ||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavcodec(3) | |||||
ffmpeg(1), ffplay(1), ffprobe(1), libavcodec(3) | |||||
@end ifnothtml | @end ifnothtml | ||||
@include authors.texi | @include authors.texi | ||||
@@ -23,12 +23,12 @@ the libavcodec library. | |||||
@chapter See Also | @chapter See Also | ||||
@ifhtml | @ifhtml | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, | |||||
@url{libavcodec.html,libavcodec} | @url{libavcodec.html,libavcodec} | ||||
@end ifhtml | @end ifhtml | ||||
@ifnothtml | @ifnothtml | ||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavcodec(3) | |||||
ffmpeg(1), ffplay(1), ffprobe(1), libavcodec(3) | |||||
@end ifnothtml | @end ifnothtml | ||||
@include authors.texi | @include authors.texi | ||||
@@ -23,12 +23,12 @@ libavdevice library. | |||||
@chapter See Also | @chapter See Also | ||||
@ifhtml | @ifhtml | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, | |||||
@url{libavdevice.html,libavdevice} | @url{libavdevice.html,libavdevice} | ||||
@end ifhtml | @end ifhtml | ||||
@ifnothtml | @ifnothtml | ||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavdevice(3) | |||||
ffmpeg(1), ffplay(1), ffprobe(1), libavdevice(3) | |||||
@end ifnothtml | @end ifnothtml | ||||
@include authors.texi | @include authors.texi | ||||
@@ -23,12 +23,12 @@ libavfilter library. | |||||
@chapter See Also | @chapter See Also | ||||
@ifhtml | @ifhtml | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, | |||||
@url{libavfilter.html,libavfilter} | @url{libavfilter.html,libavfilter} | ||||
@end ifhtml | @end ifhtml | ||||
@ifnothtml | @ifnothtml | ||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavfilter(3) | |||||
ffmpeg(1), ffplay(1), ffprobe(1), libavfilter(3) | |||||
@end ifnothtml | @end ifnothtml | ||||
@include authors.texi | @include authors.texi | ||||
@@ -23,12 +23,12 @@ provided by the libavformat library. | |||||
@chapter See Also | @chapter See Also | ||||
@ifhtml | @ifhtml | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, | |||||
@url{libavformat.html,libavformat} | @url{libavformat.html,libavformat} | ||||
@end ifhtml | @end ifhtml | ||||
@ifnothtml | @ifnothtml | ||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavformat(3) | |||||
ffmpeg(1), ffplay(1), ffprobe(1), libavformat(3) | |||||
@end ifnothtml | @end ifnothtml | ||||
@include authors.texi | @include authors.texi | ||||
@@ -23,12 +23,12 @@ libavformat library. | |||||
@chapter See Also | @chapter See Also | ||||
@ifhtml | @ifhtml | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, | |||||
@url{libavformat.html,libavformat} | @url{libavformat.html,libavformat} | ||||
@end ifhtml | @end ifhtml | ||||
@ifnothtml | @ifnothtml | ||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavformat(3) | |||||
ffmpeg(1), ffplay(1), ffprobe(1), libavformat(3) | |||||
@end ifnothtml | @end ifnothtml | ||||
@include authors.texi | @include authors.texi | ||||
@@ -25,12 +25,12 @@ and convert audio format and packing layout. | |||||
@chapter See Also | @chapter See Also | ||||
@ifhtml | @ifhtml | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, | |||||
@url{libswresample.html,libswresample} | @url{libswresample.html,libswresample} | ||||
@end ifhtml | @end ifhtml | ||||
@ifnothtml | @ifnothtml | ||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libswresample(3) | |||||
ffmpeg(1), ffplay(1), ffprobe(1), libswresample(3) | |||||
@end ifnothtml | @end ifnothtml | ||||
@include authors.texi | @include authors.texi | ||||
@@ -24,12 +24,12 @@ image rescaling and pixel format conversion. | |||||
@chapter See Also | @chapter See Also | ||||
@ifhtml | @ifhtml | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, | |||||
@url{libswscale.html,libswscale} | @url{libswscale.html,libswscale} | ||||
@end ifhtml | @end ifhtml | ||||
@ifnothtml | @ifnothtml | ||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libswscale(3) | |||||
ffmpeg(1), ffplay(1), ffprobe(1), libswscale(3) | |||||
@end ifnothtml | @end ifnothtml | ||||
@include authors.texi | @include authors.texi | ||||
@@ -23,12 +23,12 @@ by the libavutil library. | |||||
@chapter See Also | @chapter See Also | ||||
@ifhtml | @ifhtml | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, | |||||
@url{libavutil.html,libavutil} | @url{libavutil.html,libavutil} | ||||
@end ifhtml | @end ifhtml | ||||
@ifnothtml | @ifnothtml | ||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavutil(3) | |||||
ffmpeg(1), ffplay(1), ffprobe(1), libavutil(3) | |||||
@end ifnothtml | @end ifnothtml | ||||
@include authors.texi | @include authors.texi | ||||
@@ -1167,10 +1167,6 @@ loss). | |||||
By default @command{ffmpeg} attempts to read the input(s) as fast as possible. | By default @command{ffmpeg} attempts to read the input(s) as fast as possible. | ||||
This option will slow down the reading of the input(s) to the native frame rate | This option will slow down the reading of the input(s) to the native frame rate | ||||
of the input(s). It is useful for real-time output (e.g. live streaming). | of the input(s). It is useful for real-time output (e.g. live streaming). | ||||
@item -loop_input | |||||
Loop over the input stream. Currently it works only for image | |||||
streams. This option is used for automatic FFserver testing. | |||||
This option is deprecated, use -loop 1. | |||||
@item -loop_output @var{number_of_times} | @item -loop_output @var{number_of_times} | ||||
Repeatedly loop output for formats that support looping such as animated GIF | Repeatedly loop output for formats that support looping such as animated GIF | ||||
(0 will loop the output infinitely). | (0 will loop the output infinitely). | ||||
@@ -1412,16 +1408,6 @@ file or device. With low latency / high rate live streams, packets may be | |||||
discarded if they are not read in a timely manner; raising this value can | discarded if they are not read in a timely manner; raising this value can | ||||
avoid it. | avoid it. | ||||
@item -override_ffserver (@emph{global}) | |||||
Overrides the input specifications from @command{ffserver}. Using this | |||||
option you can map any input stream to @command{ffserver} and control | |||||
many aspects of the encoding from @command{ffmpeg}. Without this | |||||
option @command{ffmpeg} will transmit to @command{ffserver} what is | |||||
requested by @command{ffserver}. | |||||
The option is intended for cases where features are needed that cannot be | |||||
specified to @command{ffserver} but can be to @command{ffmpeg}. | |||||
@item -sdp_file @var{file} (@emph{global}) | @item -sdp_file @var{file} (@emph{global}) | ||||
Print sdp information for an output stream to @var{file}. | Print sdp information for an output stream to @var{file}. | ||||
This allows dumping sdp information when at least one output isn't an | This allows dumping sdp information when at least one output isn't an | ||||
@@ -1776,7 +1762,7 @@ ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext | |||||
@ifset config-not-all | @ifset config-not-all | ||||
@url{ffmpeg-all.html,ffmpeg-all}, | @url{ffmpeg-all.html,ffmpeg-all}, | ||||
@end ifset | @end ifset | ||||
@url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, | |||||
@url{ffmpeg-utils.html,ffmpeg-utils}, | @url{ffmpeg-utils.html,ffmpeg-utils}, | ||||
@url{ffmpeg-scaler.html,ffmpeg-scaler}, | @url{ffmpeg-scaler.html,ffmpeg-scaler}, | ||||
@url{ffmpeg-resampler.html,ffmpeg-resampler}, | @url{ffmpeg-resampler.html,ffmpeg-resampler}, | ||||
@@ -1795,7 +1781,7 @@ ffmpeg(1), | |||||
@ifset config-not-all | @ifset config-not-all | ||||
ffmpeg-all(1), | ffmpeg-all(1), | ||||
@end ifset | @end ifset | ||||
ffplay(1), ffprobe(1), ffserver(1), | |||||
ffplay(1), ffprobe(1), | |||||
ffmpeg-utils(1), ffmpeg-scaler(1), ffmpeg-resampler(1), | ffmpeg-utils(1), ffmpeg-scaler(1), ffmpeg-resampler(1), | ||||
ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), ffmpeg-formats(1), | ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), ffmpeg-formats(1), | ||||
ffmpeg-devices(1), ffmpeg-protocols(1), ffmpeg-filters(1) | ffmpeg-devices(1), ffmpeg-protocols(1), ffmpeg-filters(1) | ||||
@@ -291,7 +291,7 @@ Toggle full screen. | |||||
@ifset config-not-all | @ifset config-not-all | ||||
@url{ffplay-all.html,ffmpeg-all}, | @url{ffplay-all.html,ffmpeg-all}, | ||||
@end ifset | @end ifset | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffprobe.html,ffprobe}, | |||||
@url{ffmpeg-utils.html,ffmpeg-utils}, | @url{ffmpeg-utils.html,ffmpeg-utils}, | ||||
@url{ffmpeg-scaler.html,ffmpeg-scaler}, | @url{ffmpeg-scaler.html,ffmpeg-scaler}, | ||||
@url{ffmpeg-resampler.html,ffmpeg-resampler}, | @url{ffmpeg-resampler.html,ffmpeg-resampler}, | ||||
@@ -310,7 +310,7 @@ ffplay(1), | |||||
@ifset config-not-all | @ifset config-not-all | ||||
ffplay-all(1), | ffplay-all(1), | ||||
@end ifset | @end ifset | ||||
ffmpeg(1), ffprobe(1), ffserver(1), | |||||
ffmpeg(1), ffprobe(1), | |||||
ffmpeg-utils(1), ffmpeg-scaler(1), ffmpeg-resampler(1), | ffmpeg-utils(1), ffmpeg-scaler(1), ffmpeg-resampler(1), | ||||
ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), ffmpeg-formats(1), | ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), ffmpeg-formats(1), | ||||
ffmpeg-devices(1), ffmpeg-protocols(1), ffmpeg-filters(1) | ffmpeg-devices(1), ffmpeg-protocols(1), ffmpeg-filters(1) | ||||
@@ -653,7 +653,7 @@ DV, GXF and AVI timecodes are available in format metadata | |||||
@ifset config-not-all | @ifset config-not-all | ||||
@url{ffprobe-all.html,ffprobe-all}, | @url{ffprobe-all.html,ffprobe-all}, | ||||
@end ifset | @end ifset | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, | |||||
@url{ffmpeg-utils.html,ffmpeg-utils}, | @url{ffmpeg-utils.html,ffmpeg-utils}, | ||||
@url{ffmpeg-scaler.html,ffmpeg-scaler}, | @url{ffmpeg-scaler.html,ffmpeg-scaler}, | ||||
@url{ffmpeg-resampler.html,ffmpeg-resampler}, | @url{ffmpeg-resampler.html,ffmpeg-resampler}, | ||||
@@ -672,7 +672,7 @@ ffprobe(1), | |||||
@ifset config-not-all | @ifset config-not-all | ||||
ffprobe-all(1), | ffprobe-all(1), | ||||
@end ifset | @end ifset | ||||
ffmpeg(1), ffplay(1), ffserver(1), | |||||
ffmpeg(1), ffplay(1), | |||||
ffmpeg-utils(1), ffmpeg-scaler(1), ffmpeg-resampler(1), | ffmpeg-utils(1), ffmpeg-scaler(1), ffmpeg-resampler(1), | ||||
ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), ffmpeg-formats(1), | ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), ffmpeg-formats(1), | ||||
ffmpeg-devices(1), ffmpeg-protocols(1), ffmpeg-filters(1) | ffmpeg-devices(1), ffmpeg-protocols(1), ffmpeg-filters(1) | ||||
@@ -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 |
@@ -193,9 +193,6 @@ ffplay | |||||
ffprobe | ffprobe | ||||
issues in or related to ffprobe.c | issues in or related to ffprobe.c | ||||
ffserver | |||||
issues in or related to ffserver.c | |||||
postproc | postproc | ||||
issues in libpostproc/* | issues in libpostproc/* | ||||
@@ -26,13 +26,13 @@ implementing robust and fast codecs as well as for experimentation. | |||||
@chapter See Also | @chapter See Also | ||||
@ifhtml | @ifhtml | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, | |||||
@url{ffmpeg-codecs.html,ffmpeg-codecs}, @url{ffmpeg-bitstream-filters.html,bitstream-filters}, | @url{ffmpeg-codecs.html,ffmpeg-codecs}, @url{ffmpeg-bitstream-filters.html,bitstream-filters}, | ||||
@url{libavutil.html,libavutil} | @url{libavutil.html,libavutil} | ||||
@end ifhtml | @end ifhtml | ||||
@ifnothtml | @ifnothtml | ||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), | |||||
ffmpeg(1), ffplay(1), ffprobe(1), | |||||
ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), | ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), | ||||
libavutil(3) | libavutil(3) | ||||
@end ifnothtml | @end ifnothtml | ||||
@@ -23,13 +23,13 @@ VfW, DShow, and ALSA. | |||||
@chapter See Also | @chapter See Also | ||||
@ifhtml | @ifhtml | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, | |||||
@url{ffmpeg-devices.html,ffmpeg-devices}, | @url{ffmpeg-devices.html,ffmpeg-devices}, | ||||
@url{libavutil.html,libavutil}, @url{libavcodec.html,libavcodec}, @url{libavformat.html,libavformat} | @url{libavutil.html,libavutil}, @url{libavcodec.html,libavcodec}, @url{libavformat.html,libavformat} | ||||
@end ifhtml | @end ifhtml | ||||
@ifnothtml | @ifnothtml | ||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), | |||||
ffmpeg(1), ffplay(1), ffprobe(1), | |||||
ffmpeg-devices(1), | ffmpeg-devices(1), | ||||
libavutil(3), libavcodec(3), libavformat(3) | libavutil(3), libavcodec(3), libavformat(3) | ||||
@end ifnothtml | @end ifnothtml | ||||
@@ -21,14 +21,14 @@ framework containing several filters, sources and sinks. | |||||
@chapter See Also | @chapter See Also | ||||
@ifhtml | @ifhtml | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, | |||||
@url{ffmpeg-filters.html,ffmpeg-filters}, | @url{ffmpeg-filters.html,ffmpeg-filters}, | ||||
@url{libavutil.html,libavutil}, @url{libswscale.html,libswscale}, @url{libswresample.html,libswresample}, | @url{libavutil.html,libavutil}, @url{libswscale.html,libswscale}, @url{libswresample.html,libswresample}, | ||||
@url{libavcodec.html,libavcodec}, @url{libavformat.html,libavformat}, @url{libavdevice.html,libavdevice} | @url{libavcodec.html,libavcodec}, @url{libavformat.html,libavformat}, @url{libavdevice.html,libavdevice} | ||||
@end ifhtml | @end ifhtml | ||||
@ifnothtml | @ifnothtml | ||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), | |||||
ffmpeg(1), ffplay(1), ffprobe(1), | |||||
ffmpeg-filters(1), | ffmpeg-filters(1), | ||||
libavutil(3), libswscale(3), libswresample(3), libavcodec(3), libavformat(3), libavdevice(3) | libavutil(3), libswscale(3), libswresample(3), libavcodec(3), libavformat(3), libavdevice(3) | ||||
@end ifnothtml | @end ifnothtml | ||||
@@ -26,13 +26,13 @@ resource. | |||||
@chapter See Also | @chapter See Also | ||||
@ifhtml | @ifhtml | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, | |||||
@url{ffmpeg-formats.html,ffmpeg-formats}, @url{ffmpeg-protocols.html,ffmpeg-protocols}, | @url{ffmpeg-formats.html,ffmpeg-formats}, @url{ffmpeg-protocols.html,ffmpeg-protocols}, | ||||
@url{libavutil.html,libavutil}, @url{libavcodec.html,libavcodec} | @url{libavutil.html,libavutil}, @url{libavcodec.html,libavcodec} | ||||
@end ifhtml | @end ifhtml | ||||
@ifnothtml | @ifnothtml | ||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), | |||||
ffmpeg(1), ffplay(1), ffprobe(1), | |||||
ffmpeg-formats(1), ffmpeg-protocols(1), | ffmpeg-formats(1), ffmpeg-protocols(1), | ||||
libavutil(3), libavcodec(3) | libavutil(3), libavcodec(3) | ||||
@end ifnothtml | @end ifnothtml | ||||
@@ -42,12 +42,12 @@ It should avoid useless features that almost no one needs. | |||||
@chapter See Also | @chapter See Also | ||||
@ifhtml | @ifhtml | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, | |||||
@url{ffmpeg-utils.html,ffmpeg-utils} | @url{ffmpeg-utils.html,ffmpeg-utils} | ||||
@end ifhtml | @end ifhtml | ||||
@ifnothtml | @ifnothtml | ||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), | |||||
ffmpeg(1), ffplay(1), ffprobe(1), | |||||
ffmpeg-utils(1) | ffmpeg-utils(1) | ||||
@end ifnothtml | @end ifnothtml | ||||
@@ -48,13 +48,13 @@ enabled through dedicated options. | |||||
@chapter See Also | @chapter See Also | ||||
@ifhtml | @ifhtml | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, | |||||
@url{ffmpeg-resampler.html,ffmpeg-resampler}, | @url{ffmpeg-resampler.html,ffmpeg-resampler}, | ||||
@url{libavutil.html,libavutil} | @url{libavutil.html,libavutil} | ||||
@end ifhtml | @end ifhtml | ||||
@ifnothtml | @ifnothtml | ||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), | |||||
ffmpeg(1), ffplay(1), ffprobe(1), | |||||
ffmpeg-resampler(1), | ffmpeg-resampler(1), | ||||
libavutil(3) | libavutil(3) | ||||
@end ifnothtml | @end ifnothtml | ||||
@@ -41,13 +41,13 @@ colorspaces differ. | |||||
@chapter See Also | @chapter See Also | ||||
@ifhtml | @ifhtml | ||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, @url{ffserver.html,ffserver}, | |||||
@url{ffmpeg.html,ffmpeg}, @url{ffplay.html,ffplay}, @url{ffprobe.html,ffprobe}, | |||||
@url{ffmpeg-scaler.html,ffmpeg-scaler}, | @url{ffmpeg-scaler.html,ffmpeg-scaler}, | ||||
@url{libavutil.html,libavutil} | @url{libavutil.html,libavutil} | ||||
@end ifhtml | @end ifhtml | ||||
@ifnothtml | @ifnothtml | ||||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), | |||||
ffmpeg(1), ffplay(1), ffprobe(1), | |||||
ffmpeg-scaler(1), | ffmpeg-scaler(1), | ||||
libavutil(3) | libavutil(3) | ||||
@end ifnothtml | @end ifnothtml | ||||
@@ -27,8 +27,7 @@ for examples. | |||||
@item | @item | ||||
@url{https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-user/, ffmpeg-user}: | @url{https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-user/, ffmpeg-user}: | ||||
For questions involving unscripted usage or compilation of the FFmpeg | For questions involving unscripted usage or compilation of the FFmpeg | ||||
command-line tools (@command{ffmpeg}, @command{ffprobe}, @command{ffplay}, | |||||
@command{ffserver}). | |||||
command-line tools (@command{ffmpeg}, @command{ffprobe}, @command{ffplay}). | |||||
@item | @item | ||||
@url{https://lists.ffmpeg.org/mailman/listinfo/libav-user/, libav-user}: | @url{https://lists.ffmpeg.org/mailman/listinfo/libav-user/, libav-user}: | ||||
@@ -366,7 +366,7 @@ If set to 1 enables experimental HTTP server. This can be used to send data when | |||||
used as an output option, or read data from a client with HTTP POST when used as | used as an output option, or read data from a client with HTTP POST when used as | ||||
an input option. | an input option. | ||||
If set to 2 enables experimental multi-client HTTP server. This is not yet implemented | If set to 2 enables experimental multi-client HTTP server. This is not yet implemented | ||||
in ffmpeg.c or ffserver.c and thus must not be used as a command line option. | |||||
in ffmpeg.c and thus must not be used as a command line option. | |||||
@example | @example | ||||
# Server side (sending): | # Server side (sending): | ||||
ffmpeg -i somefile.ogg -c copy -listen 1 -f ogg http://@var{server}:@var{port} | ffmpeg -i somefile.ogg -c copy -listen 1 -f ogg http://@var{server}:@var{port} | ||||
@@ -1,12 +1,11 @@ | |||||
AVPROGS-$(CONFIG_FFMPEG) += ffmpeg | AVPROGS-$(CONFIG_FFMPEG) += ffmpeg | ||||
AVPROGS-$(CONFIG_FFPLAY) += ffplay | AVPROGS-$(CONFIG_FFPLAY) += ffplay | ||||
AVPROGS-$(CONFIG_FFPROBE) += ffprobe | AVPROGS-$(CONFIG_FFPROBE) += ffprobe | ||||
AVPROGS-$(CONFIG_FFSERVER) += ffserver | |||||
AVPROGS := $(AVPROGS-yes:%=%$(PROGSSUF)$(EXESUF)) | AVPROGS := $(AVPROGS-yes:%=%$(PROGSSUF)$(EXESUF)) | ||||
PROGS += $(AVPROGS) | PROGS += $(AVPROGS) | ||||
AVBASENAMES = ffmpeg ffplay ffprobe ffserver | |||||
AVBASENAMES = ffmpeg ffplay ffprobe | |||||
ALLAVPROGS = $(AVBASENAMES:%=%$(PROGSSUF)$(EXESUF)) | ALLAVPROGS = $(AVBASENAMES:%=%$(PROGSSUF)$(EXESUF)) | ||||
ALLAVPROGS_G = $(AVBASENAMES:%=%$(PROGSSUF)_g$(EXESUF)) | ALLAVPROGS_G = $(AVBASENAMES:%=%$(PROGSSUF)_g$(EXESUF)) | ||||
@@ -17,7 +16,6 @@ ifndef CONFIG_VIDEOTOOLBOX | |||||
OBJS-ffmpeg-$(CONFIG_VDA) += fftools/ffmpeg_videotoolbox.o | OBJS-ffmpeg-$(CONFIG_VDA) += fftools/ffmpeg_videotoolbox.o | ||||
endif | endif | ||||
OBJS-ffmpeg-$(CONFIG_VIDEOTOOLBOX) += fftools/ffmpeg_videotoolbox.o | OBJS-ffmpeg-$(CONFIG_VIDEOTOOLBOX) += fftools/ffmpeg_videotoolbox.o | ||||
OBJS-ffserver += fftools/ffserver_config.o | |||||
define DOFFTOOL | define DOFFTOOL | ||||
OBJS-$(1) += fftools/cmdutils.o fftools/$(1).o $(OBJS-$(1)-yes) | OBJS-$(1) += fftools/cmdutils.o fftools/$(1).o $(OBJS-$(1)-yes) | ||||
@@ -117,7 +117,6 @@ static int file_overwrite = 0; | |||||
static int no_file_overwrite = 0; | static int no_file_overwrite = 0; | ||||
static int do_psnr = 0; | static int do_psnr = 0; | ||||
static int input_sync; | static int input_sync; | ||||
static int override_ffserver = 0; | |||||
static int input_stream_potentially_available = 0; | static int input_stream_potentially_available = 0; | ||||
static int ignore_unknown_streams = 0; | static int ignore_unknown_streams = 0; | ||||
static int copy_unknown_streams = 0; | static int copy_unknown_streams = 0; | ||||
@@ -1997,58 +1996,6 @@ static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata) | |||||
return 0; | return 0; | ||||
} | } | ||||
static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename) | |||||
{ | |||||
int i, err; | |||||
AVFormatContext *ic = avformat_alloc_context(); | |||||
if (!ic) | |||||
return AVERROR(ENOMEM); | |||||
ic->interrupt_callback = int_cb; | |||||
err = avformat_open_input(&ic, filename, NULL, NULL); | |||||
if (err < 0) | |||||
return err; | |||||
/* copy stream format */ | |||||
for(i=0;i<ic->nb_streams;i++) { | |||||
AVStream *st; | |||||
OutputStream *ost; | |||||
AVCodec *codec; | |||||
const char *enc_config; | |||||
codec = avcodec_find_encoder(ic->streams[i]->codecpar->codec_id); | |||||
if (!codec) { | |||||
av_log(s, AV_LOG_ERROR, "no encoder found for codec id %i\n", ic->streams[i]->codecpar->codec_id); | |||||
return AVERROR(EINVAL); | |||||
} | |||||
if (codec->type == AVMEDIA_TYPE_AUDIO) | |||||
opt_audio_codec(o, "c:a", codec->name); | |||||
else if (codec->type == AVMEDIA_TYPE_VIDEO) | |||||
opt_video_codec(o, "c:v", codec->name); | |||||
ost = new_output_stream(o, s, codec->type, -1); | |||||
st = ost->st; | |||||
avcodec_get_context_defaults3(st->codec, codec); | |||||
enc_config = av_stream_get_recommended_encoder_configuration(ic->streams[i]); | |||||
if (enc_config) { | |||||
AVDictionary *opts = NULL; | |||||
av_dict_parse_string(&opts, enc_config, "=", ",", 0); | |||||
av_opt_set_dict2(st->codec, &opts, AV_OPT_SEARCH_CHILDREN); | |||||
av_dict_free(&opts); | |||||
} | |||||
if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy) | |||||
choose_sample_fmt(st, codec); | |||||
else if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy) | |||||
choose_pixel_fmt(st, st->codec, codec, st->codecpar->format); | |||||
avcodec_copy_context(ost->enc_ctx, st->codec); | |||||
if (enc_config) | |||||
av_dict_parse_string(&ost->encoder_opts, enc_config, "=", ",", 0); | |||||
} | |||||
avformat_close_input(&ic); | |||||
return err; | |||||
} | |||||
static void init_output_filter(OutputFilter *ofilter, OptionsContext *o, | static void init_output_filter(OutputFilter *ofilter, OptionsContext *o, | ||||
AVFormatContext *oc) | AVFormatContext *oc) | ||||
{ | { | ||||
@@ -2187,47 +2134,7 @@ static int open_output_file(OptionsContext *o, const char *filename) | |||||
} | } | ||||
} | } | ||||
/* ffserver seeking with date=... needs a date reference */ | |||||
if (!strcmp(file_oformat->name, "ffm") && | |||||
!(format_flags & AVFMT_FLAG_BITEXACT) && | |||||
av_strstart(filename, "http:", NULL)) { | |||||
int err = parse_option(o, "metadata", "creation_time=now", options); | |||||
if (err < 0) { | |||||
print_error(filename, err); | |||||
exit_program(1); | |||||
} | |||||
} | |||||
if (!strcmp(file_oformat->name, "ffm") && !override_ffserver && | |||||
av_strstart(filename, "http:", NULL)) { | |||||
int j; | |||||
/* special case for files sent to ffserver: we get the stream | |||||
parameters from ffserver */ | |||||
int err = read_ffserver_streams(o, oc, filename); | |||||
if (err < 0) { | |||||
print_error(filename, err); | |||||
exit_program(1); | |||||
} | |||||
for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) { | |||||
ost = output_streams[j]; | |||||
for (i = 0; i < nb_input_streams; i++) { | |||||
ist = input_streams[i]; | |||||
if(ist->st->codecpar->codec_type == ost->st->codecpar->codec_type){ | |||||
ost->sync_ist= ist; | |||||
ost->source_index= i; | |||||
if(ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull"); | |||||
if(ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null"); | |||||
ist->discard = 0; | |||||
ist->st->discard = ist->user_set_discard; | |||||
break; | |||||
} | |||||
} | |||||
if(!ost->sync_ist){ | |||||
av_log(NULL, AV_LOG_FATAL, "Missing %s stream which is required by this ffm\n", av_get_media_type_string(ost->st->codecpar->codec_type)); | |||||
exit_program(1); | |||||
} | |||||
} | |||||
} else if (!o->nb_stream_maps) { | |||||
if (!o->nb_stream_maps) { | |||||
char *subtitle_codec_name = NULL; | char *subtitle_codec_name = NULL; | ||||
/* pick the "best" stream of each type */ | /* pick the "best" stream of each type */ | ||||
@@ -3719,8 +3626,6 @@ const OptionDef options[] = { | |||||
"set the maximum demux-decode delay", "seconds" }, | "set the maximum demux-decode delay", "seconds" }, | ||||
{ "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) }, | { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) }, | ||||
"set the initial demux-decode delay", "seconds" }, | "set the initial demux-decode delay", "seconds" }, | ||||
{ "override_ffserver", OPT_BOOL | OPT_EXPERT | OPT_OUTPUT, { &override_ffserver }, | |||||
"override the options from ffserver", "" }, | |||||
{ "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { .func_arg = opt_sdp_file }, | { "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { .func_arg = opt_sdp_file }, | ||||
"specify a file in which to print sdp information", "file" }, | "specify a file in which to print sdp information", "file" }, | ||||
@@ -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,5 +1,3 @@ | |||||
FFSERVER_REFFILE = $(SRC_PATH)/tests/ffserver.regression.ref | |||||
THREADS = 1 | THREADS = 1 | ||||
VREF = tests/vsynth1/00.pgm | VREF = tests/vsynth1/00.pgm | ||||
AREF = tests/data/asynth1.sw | AREF = tests/data/asynth1.sw | ||||
@@ -11,14 +9,6 @@ FFMPEG=ffmpeg$(PROGSSUF)$(EXESUF) | |||||
$(AREF): CMP= | $(AREF): CMP= | ||||
ffservertest: export PROGSUF = $(PROGSSUF) | |||||
ffservertest: ffserver$(PROGSSUF)$(EXESUF) ffmpeg$(PROGSSUF)$(EXESUF) tests/vsynth1/00.pgm tests/data/asynth1.sw | |||||
@echo | |||||
@echo "Unfortunately ffserver is broken and therefore its regression" | |||||
@echo "test fails randomly. Treat the results accordingly." | |||||
@echo | |||||
$(SRC_PATH)/tests/ffserver-regression.sh $(FFSERVER_REFFILE) $(SRC_PATH)/tests/ffserver.conf "$(TARGET_SAMPLES)" "$(TARGET_EXEC)" "$(TARGET_PATH)" | |||||
APITESTSDIR := tests/api | APITESTSDIR := tests/api | ||||
OBJDIRS += tests/data tests/vsynth1 tests/data/filtergraphs $(APITESTSDIR)/ | OBJDIRS += tests/data tests/vsynth1 tests/data/filtergraphs $(APITESTSDIR)/ | ||||
@@ -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 |
@@ -20,7 +20,7 @@ fi | |||||
case "$1" in | case "$1" in | ||||
need) | need) | ||||
case $2 in | case $2 in | ||||
ffmpeg|ffplay|ffprobe|ffserver) | |||||
ffmpeg|ffplay|ffprobe) | |||||
echo $2.c >> tools/bisect.need | echo $2.c >> tools/bisect.need | ||||
;; | ;; | ||||
esac | esac | ||||