Originally committed as revision 6 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
| @@ -0,0 +1,42 @@ | |||||
| # Main ffmpeg Makefile | |||||
| # (c) 2000, 2001 Gerard Lantau | |||||
| # | |||||
| include config.mk | |||||
| CFLAGS= -O2 -Wall -g -I./libavcodec -I./libav | |||||
| LDFLAGS= -g | |||||
| ifdef CONFIG_GPROF | |||||
| CFLAGS+=-p | |||||
| LDFLAGS+=-p | |||||
| endif | |||||
| PROG= ffmpeg ffserver | |||||
| all: lib $(PROG) | |||||
| lib: | |||||
| make -C libavcodec all | |||||
| make -C libav all | |||||
| ffmpeg: ffmpeg.o libav/libav.a libavcodec/libavcodec.a | |||||
| gcc $(LDFLAGS) -o $@ $^ -lm | |||||
| ffserver: ffserver.o libav/libav.a libavcodec/libavcodec.a | |||||
| gcc $(LDFLAGS) -o $@ $^ -lm | |||||
| %.o: %.c | |||||
| gcc $(CFLAGS) -c -o $@ $< | |||||
| install: all | |||||
| install -s -m 755 $(PROG) $(PREFIX)/bin | |||||
| clean: | |||||
| make -C libavcodec clean | |||||
| make -C libav clean | |||||
| rm -f *.o *~ gmon.out TAGS $(PROG) | |||||
| distclean: clean | |||||
| rm -f Rules.mk config.h | |||||
| TAGS: | |||||
| etags *.[ch] libav/*.[ch] libavcodec/*.[ch] | |||||
| @@ -0,0 +1,73 @@ | |||||
| FFmpeg - (c) 2000,2001 Gerard Lantau. | |||||
| 1) Introduction | |||||
| --------------- | |||||
| ffmpeg is a hyper fast realtime audio/video encoder, a streaming | |||||
| server and a generic audio and video file converter. | |||||
| It can grab from a standard Video4Linux video source and convert it | |||||
| into several file formats based on DCT/motion compensation | |||||
| encoding. Sound is compressed in MPEG audio layer 2 or using an AC3 | |||||
| compatible stream. | |||||
| What makes ffmpeg interesting ? | |||||
| - Innovative streaming technology : multiformat, real time encoding, | |||||
| simple configuration. | |||||
| - Simple and efficient video encoder: outputs MPEG1, H263, Real | |||||
| Video(tm), MPEG4, DIVX and MJPEG compatible bitstreams using the | |||||
| same encoder core. | |||||
| - Real time encoding (25 fps in 352x288 on a K6 500) using the | |||||
| video4linux API. | |||||
| - Generates I and P frames, which means it is far better than a MJPEG | |||||
| encoder. | |||||
| - Hyper fast MPEG audio layer 2 compression (50 times faster than | |||||
| realtime on a K6 500). | |||||
| - Hyper fast AC3 compatible encoder. | |||||
| - simple and very small portable C source code, easy to understand and | |||||
| to modify. It be may the smallest decent MPEG encoder :-) | |||||
| - optional non real time higher quality encoding (different motion | |||||
| estimators available). | |||||
| - Audio and Video decoders are in development. | |||||
| ffmpeg is made of two programs: | |||||
| * ffmpeg: soft VCR which encodes in real time to several formats. It | |||||
| can also encode from any supported input file format to any input | |||||
| supported format. | |||||
| * ffserver: high performance live broadcast streaming server based on | |||||
| the ffmpeg core encoders. | |||||
| 2) Documentation | |||||
| ---------------- | |||||
| * Read doc/ffmpeg.txt and doc/ffserver.txt to learn the basic features. | |||||
| * Read doc/TODO to know what are the know bugs and missing features. | |||||
| * Read doc/README.dev if you want to contribute or use the codec or | |||||
| format libraries. | |||||
| 3) Licensing: | |||||
| ------------ | |||||
| * See the file COPYING. ffmpeg and the associated library are licensed | |||||
| under the GNU General Public License. I may change the license of | |||||
| libavcodec and libav to LGPL if many people ask it (and if they | |||||
| submit good patches!). | |||||
| * This code should be patent free since it is very simple. I took care | |||||
| to use the same video encoder/decoder core for all formats to show | |||||
| that they really ARE THE SAME except for the encoding huffman codes. | |||||
| Gerard Lantau (glantau@yahoo.fr). | |||||
| @@ -0,0 +1,46 @@ | |||||
| Technical notes: | |||||
| --------------- | |||||
| Video: | |||||
| ----- | |||||
| - The decision intra/predicted macroblock is the algorithm suggested | |||||
| by the mpeg 1 specification. | |||||
| - only Huffman based H263 is supported, mainly because of patent | |||||
| issues. | |||||
| - MPEG4 is supported, as an extension of the H263 encoder. MPEG4 DC | |||||
| prediction is used, but not AC prediction. Specific VLC are used for | |||||
| intra pictures. The output format is compatible with Open DIVX | |||||
| version 47. | |||||
| - MJPEG is supported, but in the current version the huffman tables | |||||
| are not optimized. It could be interesting to add this feature for | |||||
| the flash format. | |||||
| - To increase speed, only motion vectors (0,0) are tested for real | |||||
| time compression. NEW: now motion compensation is done with several | |||||
| methods : none, full, log, and phods. The code is mmx/sse optimized. | |||||
| - In high quality mode, full search is used for motion | |||||
| vectors. Currently, only fcode = 1 is used for both H263/MPEG1. Half | |||||
| pel vectors are used. | |||||
| I also plan to improve the bitrate control which is too simplistic. | |||||
| Audio: | |||||
| ----- | |||||
| - I rewrote the mpeg audio layer 2 compatible encoder from scratch. It | |||||
| is one of the simplest encoder you can imagine (800 lines of C code | |||||
| !). It is also one of the fastest because of its simplicity. There | |||||
| are still some problems of overflow. A minimal psycho acoustic model | |||||
| could be added. Currently, stereo is supported, but not joint | |||||
| stereo. | |||||
| - I rewrote the AC3 audio encoder from scratch. It is fairly naive, | |||||
| but the result are quiet interesting at 64 kbit/s. It includes | |||||
| extensions for low sampling rates used in some Internet | |||||
| formats. Differential and coupled stereo is not handled. Stereo | |||||
| channels are simply handled as two mono channels. | |||||
| @@ -0,0 +1,63 @@ | |||||
| ffmpeg TODO list: | |||||
| ---------------- | |||||
| (in approximate decreasing priority order) | |||||
| Planned in next release: | |||||
| (DONE) - apply header fixes | |||||
| (DONE) - mpeg audio decoder. | |||||
| (DONE) - fix decode/encode codec string. | |||||
| (DONE) - fix EINTR error if VIDIOCSYNC. | |||||
| (DONE) - add CONFIG system. | |||||
| (DONE) - merge mplayer mmx accel. | |||||
| (DONE) - fix emms bug. | |||||
| (DONE) - add I263 handling | |||||
| (DONE) - add RV10 decoding. | |||||
| (DONE) - add true pgm support. | |||||
| (DONE) - msmpeg4 0x18 fix. | |||||
| - add qscale out. | |||||
| - add format autodetect with content (for example to distinguish | |||||
| mpegvideo/mpegmux). | |||||
| - add external alloc for libavcodec (avifile request). | |||||
| - fix -sameq in grabbing | |||||
| - find a solution to clear feed1.ffm if format change. | |||||
| - new grab architecture : use avformat instead of audio: and video: | |||||
| protocol. | |||||
| - correct PTS handling to sync audio and video. | |||||
| - fix 0 size picture in AVIs = skip picture | |||||
| BUGS: | |||||
| - fix audio/video synchro (including real player synchro bugs) | |||||
| - Improve the bit rate control for video codecs. | |||||
| - see ov511.o YUV problem (420 instead of 420P). | |||||
| - fix file caching pb in windows (add correct headers) | |||||
| - add low pass filter to suppress noise coming from cheap TV cards. | |||||
| - test/debug audio in flash format | |||||
| - sort out ASF streaming pbs. | |||||
| - Improve psycho acoustic model for AC3 & mpeg audio. | |||||
| FEATURES: | |||||
| - add MPEG4 in mpegmux support. | |||||
| - add RTP / multicast layer. | |||||
| - demux streams for CCTV : N streams in one stream. Add option to | |||||
| generate multiple streams. | |||||
| - add disconnect user option in stat.html. | |||||
| - deny & allow + password in ffserver. | |||||
| - graphical user interface. | |||||
| - animated gif as output format | |||||
| @@ -0,0 +1,181 @@ | |||||
| *************** FFMPEG soft VCR documentation ***************** | |||||
| 0) Introduction | |||||
| --------------- | |||||
| FFmpeg is a very fast video and audio encoder. It can grab from | |||||
| files or from a live audio/video source. | |||||
| The command line interface is designed to be intuitive, in the sense | |||||
| that ffmpeg tries to figure out all the paramters, when | |||||
| possible. You have usually to give only the target bitrate you want. | |||||
| FFmpeg can also convert from any sample rate to any other, and | |||||
| resize video on the fly with a high quality polyphase filter. | |||||
| 1) Video and Audio grabbing | |||||
| --------------------------- | |||||
| * ffmpeg can use a video4linux compatible video source and any Open | |||||
| Sound System audio source: | |||||
| ffmpeg /tmp/out.mpg | |||||
| Note that you must activate the right video source and channel | |||||
| before launching ffmpeg. You can use any TV viewer such as xawtv by | |||||
| Gerd Knorr which I find very good. You must also set correctly the | |||||
| audio recording levels with a standard mixer. | |||||
| 2) Video and Audio file format convertion | |||||
| ----------------------------------------- | |||||
| * ffmpeg can use any supported file format and protocol as input : | |||||
| examples: | |||||
| ffmpeg -i /tmp/test%d.Y /tmp/out.mpg | |||||
| If will use the files: | |||||
| /tmp/test0.Y, /tmp/test0.U, /tmp/test0.V, | |||||
| /tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc... | |||||
| The Y files use twice the resolution of the U and V files. They are | |||||
| raw files, without header. They can be generated by all decent video | |||||
| decoders. You must specify the size of the image with the '-s' option | |||||
| if ffmpeg cannot guess it. | |||||
| * You can set several input files and output files: | |||||
| ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg | |||||
| Convert the audio file a.wav and the raw yuv video file a.yuv to mpeg file a.mpg | |||||
| * you can also do audio and video convertions at the same time: | |||||
| ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2 | |||||
| Convert the sample rate of a.wav to 22050 Hz and encode it to MPEG audio. | |||||
| * you can encode to several formats at the same time and define a | |||||
| mapping from input stream to output streams: | |||||
| ffmpeg -i /tmp/a.wav -ab 64 /tmp/a.mp2 -ab 128 /tmp/b.mp2 -map 0:0 -map 0:0 | |||||
| convert a.wav to a.mp2 at 64 kbits and b.mp2 at 128 kbits. '-map | |||||
| file:index' specify which input stream is used for each output | |||||
| stream, in the order of the definition of output streams. | |||||
| NOTE: to see the supported input formats, use 'ffmpeg -formats'. | |||||
| 2) Invocation | |||||
| ------------- | |||||
| * The generic syntax is : | |||||
| ffmpeg [[options][-i input_file]]... {[options] output_file}... | |||||
| If no input file is given, audio/video grabbing is done. | |||||
| As a general rule, options are applied to the next specified | |||||
| file. For example, if you give the '-b 64' option, it sets the video | |||||
| bitrate of the next file. Format option may be needed for raw input | |||||
| files. | |||||
| By default, ffmpeg tries to convert as losslessly as possible: it | |||||
| uses the same audio and video parameter fors the outputs as the one | |||||
| specified for the inputs. | |||||
| * Main options are: | |||||
| -h show help | |||||
| -formats show available formats, codecs and protocols | |||||
| -L print the LICENSE | |||||
| -i filename input file name | |||||
| -y overwrite output files | |||||
| -t duration set recording time in seconds | |||||
| -f format set encoding format [guessed] | |||||
| -title string set the title | |||||
| -author string set the author | |||||
| -copyright string set the copyright | |||||
| -comment string set the comment | |||||
| * Video Options are: | |||||
| -s size set frame size [160x128] | |||||
| -r fps set frame rate [25] | |||||
| -b bitrate set the video bitrate in kbit/s [200] | |||||
| -vn disable video recording [no] | |||||
| * Audio Options are: | |||||
| -ar freq set the audio sampling freq [44100] | |||||
| -ab bitrate set the audio bitrate in kbit/s [64] | |||||
| -ac channels set the number of audio channels [1] | |||||
| -an disable audio recording [no] | |||||
| Advanced options are: | |||||
| -map file:stream set input stream mapping | |||||
| -g gop_size set the group of picture size [12] | |||||
| -intra use only intra frames [no] | |||||
| -qscale q use fixed video quantiser scale (VBR) | |||||
| -c comment set the comment string | |||||
| -vd device set video4linux device name [/dev/video] | |||||
| -vcodec codec force audio codec | |||||
| -me method set motion estimation method | |||||
| -ad device set audio device name [/dev/dsp] | |||||
| -acodec codec force audio codec | |||||
| The output file can be "-" to output to a pipe. This is only possible | |||||
| with mpeg1 and h263 formats. | |||||
| 3) Protocols | |||||
| ffmpeg handles also many protocols specified with the URL syntax. | |||||
| Use 'ffmpeg -formats' to have a list of the supported protocols. | |||||
| The protocol 'http:' is currently used only to communicate with | |||||
| ffserver (see the ffserver documentation). When ffmpeg will be a | |||||
| video player it will also be used for streaming :-) | |||||
| 4) File formats and codecs | |||||
| -------------------------- | |||||
| Use 'ffmpeg -formats' to have a list of the supported output | |||||
| formats. Only some formats are handled as input, but it will improve | |||||
| in the next versions. | |||||
| 5) Tips | |||||
| ------- | |||||
| - For streaming at very low bit rate application, use a low frame rate | |||||
| and a small gop size. This is especially true for real video where | |||||
| the Linux player does not seem to be very fast, so it can miss | |||||
| frames. An example is: | |||||
| ffmpeg -g 3 -r 3 -t 10 -b 50 -s qcif -f rv10 /tmp/b.rm | |||||
| - The parameter 'q' which is displayed while encoding is the current | |||||
| quantizer. The value of 1 indicates that a very good quality could | |||||
| be achieved. The value of 31 indicates the worst quality. If q=31 | |||||
| too often, it means that the encoder cannot compress enough to meet | |||||
| your bit rate. You must either increase the bit rate, decrease the | |||||
| frame rate or decrease the frame size. | |||||
| - If your computer is not fast enough, you can speed up the | |||||
| compression at the expense of the compression ratio. You can use | |||||
| '-me zero' to speed up motion estimation, and '-intra' to disable | |||||
| completly motion estimation (you have only I frames, which means it | |||||
| is about as good as JPEG compression). | |||||
| - To have very low bitrates in audio, reduce the sampling frequency | |||||
| (down to 22050 kHz for mpeg audio, 22050 or 11025 for ac3). | |||||
| - To have a constant quality (but a variable bitrate), use the option | |||||
| '-qscale n' when 'n' is between 1 (excellent quality) and 31 (worst | |||||
| quality). | |||||
| - When converting video files, you can use the '-sameq' option which | |||||
| uses in the encoder the same quality factor than in the decoder. It | |||||
| allows to be almost lossless in encoding. | |||||
| @@ -0,0 +1,261 @@ | |||||
| # 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. | |||||
| Port 8090 | |||||
| # Address on which the server is bound. Only useful if you have | |||||
| # several network interfaces. | |||||
| BindAddress 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 | |||||
| # 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 /tmp/feed1.ffm | |||||
| FileMaxSize 50M | |||||
| </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 test1.mpg> | |||||
| # coming from live feed 'feed1' | |||||
| Feed feed1.ffm | |||||
| # Format of the stream : you can choose among: | |||||
| # mpeg : MPEG1 multiplexed video and audio | |||||
| # mpegvideo : only MPEG1 video | |||||
| # mp2 : MPEG audio layer 2 | |||||
| # mp3 : MPEG audio layer 3 (currently sent as layer 2) | |||||
| # rm : Real Networks compatible stream. Multiplexed audio and video. | |||||
| # ra : Real Networks compatible stream. Audio only. | |||||
| # mpjpeg : Multipart JPEG (works with Netscape without any plugin) | |||||
| # jpeg : Generate a single JPEG image. | |||||
| # asf : ASF compatible stream (Windows Media Player format). Not finished yet. | |||||
| # swf : Macromedia flash(tm) compatible stream | |||||
| # avi : AVI format (open divx video, mpeg audio sound) | |||||
| # master : special ffmpeg stream used to duplicate a server | |||||
| 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 | |||||
| # Number of frames per second | |||||
| VideoFrameRate 3 | |||||
| # Size of the video frame : WxH (default: 160x128) | |||||
| # W : width, H : height | |||||
| # The following abbreviation are defined : sqcif, qcif, cif, 4cif | |||||
| VideoSize 160x128 | |||||
| # transmit only intra frames (useful for low bitrates) | |||||
| VideoIntraOnly | |||||
| # If non intra only, an intra frame is transmitted every VideoGopSize | |||||
| # frames Video synchronization can only begin at an I frames. | |||||
| #VideoGopSize 12 | |||||
| # Suppress audio | |||||
| #NoAudio | |||||
| # Suppress video | |||||
| #NoVideo | |||||
| </Stream> | |||||
| # second mpeg stream with high frame rate | |||||
| <Stream test2.mpg> | |||||
| Feed feed1.ffm | |||||
| Format mpegvideo | |||||
| VideoBitRate 128 | |||||
| VideoFrameRate 25 | |||||
| #VideoSize 352x240 | |||||
| VideoGopSize 25 | |||||
| </Stream> | |||||
| ################################################################## | |||||
| # A stream coming from a file : you only need to set the input | |||||
| # filename and optionnally a new format. Supported conversions: | |||||
| # avi -> asf | |||||
| # | |||||
| <Stream file.asf> | |||||
| #File "/tmp/file.avi" | |||||
| File "tmp/file.avi" | |||||
| # avi must be converted to asf to be streamed | |||||
| Format asf | |||||
| </Stream> | |||||
| # another file streaming | |||||
| <Stream file.mp3> | |||||
| File "tmp/file.mp3" | |||||
| </Stream> | |||||
| ################################################################## | |||||
| # Another stream : Real with audio only at 32 kbits | |||||
| <Stream test.ra> | |||||
| Feed feed1.ffm | |||||
| Format rm | |||||
| AudioBitRate 32 | |||||
| NoVideo | |||||
| </Stream> | |||||
| ################################################################## | |||||
| # Another stream : Real with audio and video at 64 kbits | |||||
| <Stream test.rm> | |||||
| Feed feed1.ffm | |||||
| Format rm | |||||
| AudioBitRate 32 | |||||
| VideoBitRate 20 | |||||
| VideoFrameRate 2 | |||||
| VideoIntraOnly | |||||
| </Stream> | |||||
| ################################################################## | |||||
| # Another stream : Mpeg audio layer 2 at 64 kbits. | |||||
| <Stream test.mp2> | |||||
| Feed feed1.ffm | |||||
| Format mp2 | |||||
| AudioBitRate 64 | |||||
| AudioSampleRate 44100 | |||||
| </Stream> | |||||
| <Stream test1.mp2> | |||||
| Feed feed1.ffm | |||||
| Format mp2 | |||||
| AudioBitRate 32 | |||||
| AudioSampleRate 16000 | |||||
| </Stream> | |||||
| ################################################################## | |||||
| # Another stream : Multipart JPEG | |||||
| <Stream test.mjpg> | |||||
| Feed feed1.ffm | |||||
| Format mpjpeg | |||||
| VideoFrameRate 2 | |||||
| VideoIntraOnly | |||||
| </Stream> | |||||
| ################################################################## | |||||
| # Another stream : Multipart JPEG | |||||
| <Stream test.jpg> | |||||
| Feed feed1.ffm | |||||
| Format jpeg | |||||
| # the parameters are choose here to take the same output as the | |||||
| # Multipart JPEG one. | |||||
| VideoFrameRate 2 | |||||
| VideoIntraOnly | |||||
| #VideoSize 352x240 | |||||
| </Stream> | |||||
| ################################################################## | |||||
| # Another stream : Flash | |||||
| <Stream test.swf> | |||||
| Feed feed1.ffm | |||||
| Format swf | |||||
| VideoFrameRate 2 | |||||
| VideoIntraOnly | |||||
| </Stream> | |||||
| ################################################################## | |||||
| # Another stream : ASF compatible | |||||
| <Stream test.asf> | |||||
| Feed feed1.ffm | |||||
| Format asf | |||||
| AudioBitRate 64 | |||||
| AudioSampleRate 44100 | |||||
| VideoFrameRate 2 | |||||
| VideoIntraOnly | |||||
| </Stream> | |||||
| ################################################################## | |||||
| # Special stream : server status | |||||
| <Stream stat.html> | |||||
| Format status | |||||
| </Stream> | |||||
| @@ -0,0 +1,22 @@ | |||||
| include ../config.mk | |||||
| CFLAGS= -O2 -Wall -g -I../libavcodec | |||||
| OBJS= rm.o mpeg.o asf.o avienc.o jpegenc.o swf.o wav.o raw.o \ | |||||
| avidec.o ffm.o \ | |||||
| avio.o aviobuf.o utils.o \ | |||||
| udp.o http.o file.o grab.o audio.o img.o | |||||
| LIB= libav.a | |||||
| all: $(LIB) | |||||
| $(LIB): $(OBJS) | |||||
| rm -f $@ | |||||
| $(AR) rcs $@ $(OBJS) | |||||
| %.o: %.c | |||||
| $(CC) $(CFLAGS) -c -o $@ $< | |||||
| clean: | |||||
| rm -f *.o *~ *.a | |||||