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 | |||