Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>tags/n4.0
@@ -29,7 +29,6 @@ | |||
/ffmpeg | |||
/ffplay | |||
/ffprobe | |||
/ffserver | |||
/config.asm | |||
/config.h | |||
/coverage.info | |||
@@ -35,6 +35,7 @@ version <next>: | |||
- hilbert audio filter source | |||
- aiir audio filter | |||
- aiff: add support for CD-ROM XA ADPCM | |||
- Removed the ffserver program | |||
version 3.4: | |||
@@ -29,9 +29,6 @@ ffplay: | |||
ffprobe: | |||
ffprobe.c Stefano Sabatini | |||
ffserver: | |||
ffserver.c Reynaldo H. Verdejo Pinochet | |||
Commandline utility code: | |||
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. | |||
* [ffprobe](https://ffmpeg.org/ffprobe.html) is a simple analysis tool to inspect | |||
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`. | |||
## Documentation | |||
@@ -116,7 +116,6 @@ Program options: | |||
--disable-ffmpeg disable ffmpeg build | |||
--disable-ffplay disable ffplay build | |||
--disable-ffprobe disable ffprobe build | |||
--disable-ffserver disable ffserver build | |||
Documentation options: | |||
--disable-doc do not build documentation | |||
@@ -1722,7 +1721,6 @@ LICENSE_LIST=" | |||
PROGRAM_LIST=" | |||
ffplay | |||
ffprobe | |||
ffserver | |||
ffmpeg | |||
" | |||
@@ -3358,8 +3356,6 @@ ffplay_select="rdft crop_filter transpose_filter hflip_filter vflip_filter rotat | |||
ffplay_suggest="shell32" | |||
ffprobe_deps="avcodec avformat" | |||
ffprobe_suggest="shell32" | |||
ffserver_deps="avformat fork sarestart" | |||
ffserver_select="ffm_muxer rtp_protocol rtsp_demuxer" | |||
# documentation | |||
podpages_deps="perl" | |||
@@ -26,12 +26,12 @@ bitstream level modifications without performing decoding. | |||
@chapter See Also | |||
@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} | |||
@end ifhtml | |||
@ifnothtml | |||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavcodec(3) | |||
ffmpeg(1), ffplay(1), ffprobe(1), libavcodec(3) | |||
@end ifnothtml | |||
@include authors.texi | |||
@@ -23,12 +23,12 @@ the libavcodec library. | |||
@chapter See Also | |||
@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} | |||
@end ifhtml | |||
@ifnothtml | |||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavcodec(3) | |||
ffmpeg(1), ffplay(1), ffprobe(1), libavcodec(3) | |||
@end ifnothtml | |||
@include authors.texi | |||
@@ -23,12 +23,12 @@ libavdevice library. | |||
@chapter See Also | |||
@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} | |||
@end ifhtml | |||
@ifnothtml | |||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavdevice(3) | |||
ffmpeg(1), ffplay(1), ffprobe(1), libavdevice(3) | |||
@end ifnothtml | |||
@include authors.texi | |||
@@ -23,12 +23,12 @@ libavfilter library. | |||
@chapter See Also | |||
@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} | |||
@end ifhtml | |||
@ifnothtml | |||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavfilter(3) | |||
ffmpeg(1), ffplay(1), ffprobe(1), libavfilter(3) | |||
@end ifnothtml | |||
@include authors.texi | |||
@@ -23,12 +23,12 @@ provided by the libavformat library. | |||
@chapter See Also | |||
@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} | |||
@end ifhtml | |||
@ifnothtml | |||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavformat(3) | |||
ffmpeg(1), ffplay(1), ffprobe(1), libavformat(3) | |||
@end ifnothtml | |||
@include authors.texi | |||
@@ -23,12 +23,12 @@ libavformat library. | |||
@chapter See Also | |||
@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} | |||
@end ifhtml | |||
@ifnothtml | |||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavformat(3) | |||
ffmpeg(1), ffplay(1), ffprobe(1), libavformat(3) | |||
@end ifnothtml | |||
@include authors.texi | |||
@@ -25,12 +25,12 @@ and convert audio format and packing layout. | |||
@chapter See Also | |||
@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} | |||
@end ifhtml | |||
@ifnothtml | |||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libswresample(3) | |||
ffmpeg(1), ffplay(1), ffprobe(1), libswresample(3) | |||
@end ifnothtml | |||
@include authors.texi | |||
@@ -24,12 +24,12 @@ image rescaling and pixel format conversion. | |||
@chapter See Also | |||
@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} | |||
@end ifhtml | |||
@ifnothtml | |||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libswscale(3) | |||
ffmpeg(1), ffplay(1), ffprobe(1), libswscale(3) | |||
@end ifnothtml | |||
@include authors.texi | |||
@@ -23,12 +23,12 @@ by the libavutil library. | |||
@chapter See Also | |||
@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} | |||
@end ifhtml | |||
@ifnothtml | |||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), libavutil(3) | |||
ffmpeg(1), ffplay(1), ffprobe(1), libavutil(3) | |||
@end ifnothtml | |||
@include authors.texi | |||
@@ -1167,10 +1167,6 @@ loss). | |||
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 | |||
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} | |||
Repeatedly loop output for formats that support looping such as animated GIF | |||
(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 | |||
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}) | |||
Print sdp information for an output stream to @var{file}. | |||
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 | |||
@url{ffmpeg-all.html,ffmpeg-all}, | |||
@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-scaler.html,ffmpeg-scaler}, | |||
@url{ffmpeg-resampler.html,ffmpeg-resampler}, | |||
@@ -1795,7 +1781,7 @@ ffmpeg(1), | |||
@ifset config-not-all | |||
ffmpeg-all(1), | |||
@end ifset | |||
ffplay(1), ffprobe(1), ffserver(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) | |||
@@ -291,7 +291,7 @@ Toggle full screen. | |||
@ifset config-not-all | |||
@url{ffplay-all.html,ffmpeg-all}, | |||
@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-scaler.html,ffmpeg-scaler}, | |||
@url{ffmpeg-resampler.html,ffmpeg-resampler}, | |||
@@ -310,7 +310,7 @@ ffplay(1), | |||
@ifset config-not-all | |||
ffplay-all(1), | |||
@end ifset | |||
ffmpeg(1), ffprobe(1), ffserver(1), | |||
ffmpeg(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) | |||
@@ -653,7 +653,7 @@ DV, GXF and AVI timecodes are available in format metadata | |||
@ifset config-not-all | |||
@url{ffprobe-all.html,ffprobe-all}, | |||
@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-scaler.html,ffmpeg-scaler}, | |||
@url{ffmpeg-resampler.html,ffmpeg-resampler}, | |||
@@ -672,7 +672,7 @@ ffprobe(1), | |||
@ifset config-not-all | |||
ffprobe-all(1), | |||
@end ifset | |||
ffmpeg(1), ffplay(1), ffserver(1), | |||
ffmpeg(1), ffplay(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) | |||
@@ -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 | |||
issues in or related to ffprobe.c | |||
ffserver | |||
issues in or related to ffserver.c | |||
postproc | |||
issues in libpostproc/* | |||
@@ -26,13 +26,13 @@ implementing robust and fast codecs as well as for experimentation. | |||
@chapter See Also | |||
@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{libavutil.html,libavutil} | |||
@end ifhtml | |||
@ifnothtml | |||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), | |||
ffmpeg(1), ffplay(1), ffprobe(1), | |||
ffmpeg-codecs(1), ffmpeg-bitstream-filters(1), | |||
libavutil(3) | |||
@end ifnothtml | |||
@@ -23,13 +23,13 @@ VfW, DShow, and ALSA. | |||
@chapter See Also | |||
@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{libavutil.html,libavutil}, @url{libavcodec.html,libavcodec}, @url{libavformat.html,libavformat} | |||
@end ifhtml | |||
@ifnothtml | |||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), | |||
ffmpeg(1), ffplay(1), ffprobe(1), | |||
ffmpeg-devices(1), | |||
libavutil(3), libavcodec(3), libavformat(3) | |||
@end ifnothtml | |||
@@ -21,14 +21,14 @@ framework containing several filters, sources and sinks. | |||
@chapter See Also | |||
@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{libavutil.html,libavutil}, @url{libswscale.html,libswscale}, @url{libswresample.html,libswresample}, | |||
@url{libavcodec.html,libavcodec}, @url{libavformat.html,libavformat}, @url{libavdevice.html,libavdevice} | |||
@end ifhtml | |||
@ifnothtml | |||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), | |||
ffmpeg(1), ffplay(1), ffprobe(1), | |||
ffmpeg-filters(1), | |||
libavutil(3), libswscale(3), libswresample(3), libavcodec(3), libavformat(3), libavdevice(3) | |||
@end ifnothtml | |||
@@ -26,13 +26,13 @@ resource. | |||
@chapter See Also | |||
@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{libavutil.html,libavutil}, @url{libavcodec.html,libavcodec} | |||
@end ifhtml | |||
@ifnothtml | |||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), | |||
ffmpeg(1), ffplay(1), ffprobe(1), | |||
ffmpeg-formats(1), ffmpeg-protocols(1), | |||
libavutil(3), libavcodec(3) | |||
@end ifnothtml | |||
@@ -42,12 +42,12 @@ It should avoid useless features that almost no one needs. | |||
@chapter See Also | |||
@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} | |||
@end ifhtml | |||
@ifnothtml | |||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), | |||
ffmpeg(1), ffplay(1), ffprobe(1), | |||
ffmpeg-utils(1) | |||
@end ifnothtml | |||
@@ -48,13 +48,13 @@ enabled through dedicated options. | |||
@chapter See Also | |||
@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{libavutil.html,libavutil} | |||
@end ifhtml | |||
@ifnothtml | |||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), | |||
ffmpeg(1), ffplay(1), ffprobe(1), | |||
ffmpeg-resampler(1), | |||
libavutil(3) | |||
@end ifnothtml | |||
@@ -41,13 +41,13 @@ colorspaces differ. | |||
@chapter See Also | |||
@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{libavutil.html,libavutil} | |||
@end ifhtml | |||
@ifnothtml | |||
ffmpeg(1), ffplay(1), ffprobe(1), ffserver(1), | |||
ffmpeg(1), ffplay(1), ffprobe(1), | |||
ffmpeg-scaler(1), | |||
libavutil(3) | |||
@end ifnothtml | |||
@@ -27,8 +27,7 @@ for examples. | |||
@item | |||
@url{https://lists.ffmpeg.org/mailman/listinfo/ffmpeg-user/, ffmpeg-user}: | |||
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 | |||
@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 | |||
an input option. | |||
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 | |||
# Server side (sending): | |||
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_FFPLAY) += ffplay | |||
AVPROGS-$(CONFIG_FFPROBE) += ffprobe | |||
AVPROGS-$(CONFIG_FFSERVER) += ffserver | |||
AVPROGS := $(AVPROGS-yes:%=%$(PROGSSUF)$(EXESUF)) | |||
PROGS += $(AVPROGS) | |||
AVBASENAMES = ffmpeg ffplay ffprobe ffserver | |||
AVBASENAMES = ffmpeg ffplay ffprobe | |||
ALLAVPROGS = $(AVBASENAMES:%=%$(PROGSSUF)$(EXESUF)) | |||
ALLAVPROGS_G = $(AVBASENAMES:%=%$(PROGSSUF)_g$(EXESUF)) | |||
@@ -17,7 +16,6 @@ ifndef CONFIG_VIDEOTOOLBOX | |||
OBJS-ffmpeg-$(CONFIG_VDA) += fftools/ffmpeg_videotoolbox.o | |||
endif | |||
OBJS-ffmpeg-$(CONFIG_VIDEOTOOLBOX) += fftools/ffmpeg_videotoolbox.o | |||
OBJS-ffserver += fftools/ffserver_config.o | |||
define DOFFTOOL | |||
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 do_psnr = 0; | |||
static int input_sync; | |||
static int override_ffserver = 0; | |||
static int input_stream_potentially_available = 0; | |||
static int ignore_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; | |||
} | |||
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, | |||
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; | |||
/* pick the "best" stream of each type */ | |||
@@ -3719,8 +3626,6 @@ const OptionDef options[] = { | |||
"set the maximum demux-decode delay", "seconds" }, | |||
{ "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET | OPT_OUTPUT, { .off = OFFSET(mux_preload) }, | |||
"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 }, | |||
"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 | |||
VREF = tests/vsynth1/00.pgm | |||
AREF = tests/data/asynth1.sw | |||
@@ -11,14 +9,6 @@ FFMPEG=ffmpeg$(PROGSSUF)$(EXESUF) | |||
$(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 | |||
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 | |||
need) | |||
case $2 in | |||
ffmpeg|ffplay|ffprobe|ffserver) | |||
ffmpeg|ffplay|ffprobe) | |||
echo $2.c >> tools/bisect.need | |||
;; | |||
esac | |||