The following example command lines, that are usually written in one line, have been split into multiple lines, using the new-line delimiter character "\" for more clarity. So, if the example shows something like this:
ffmpeg -i input \ -acodec .. \ -vcodec .. \ output1
that means the actual command line, typed in the shell, would be:
ffmpeg -i input -acodec .. -vcodec .. output1
Different parallel outputs
FFmpeg supports multiple outputs created out of the same input(s). The usual way to accomplish this is:
ffmpeg -i input1 -i input2\ -acodec .. -vcodec .. output1\ -acodec .. -vcodec .. output2\ -acodec .. -vcodec .. output3
This way FFmpeg can create several different outputs out of the same input(s).
For example, to encode your video in HD, VGA and QVGA resolution, at the same time, you would use something like this:
ffmpeg -i input\ -s 1280x720 -acodec .. -vcodec .. output1\ -s 640x480 -acodec .. -vcodec .. output2\ -s 320x240 -acodec .. -vcodec .. output3
But, what if you want to have duplicate outputs of your encoding? For example, when you are streaming a live audio/video and want to save a duplicate of that stream into the file at the same time. You don't want to encode twice, that wastes cpu.
The tee pseudo-muxer was added to ffmpeg on 2013-02-03, and allows you to duplicate the output to multiple files, on a single instance of ffmpeg.
ffmpeg -i input.file -c:v libx264 -c:a mp2 \ -f tee -map 0:v -map 0:a "output.mkv|[f=mpegts]udp://10.0.1.255:1234/"
The above outputs an MKV file, and a UDP stream. Streams are separated by the | symbol. Options can be applied to an individual output: [f=mpegts] is equivalent to -f mpegts in a normal ffmpeg command-line. Multiple options can be separated with a :, which means that any : have to be escaped (so use \:).
Older versions of ffmpeg can also do this, using 2 piped processes, where the first process is used to encode the stream(s) and second process is used to duplicate that to several outputs.
ffmpeg -i input1 -i input2 -acodec .. -vcodec .. -f mpegts - | \ ffmpeg -f mpegts -i - \ -c copy output1 \ -c copy output2 \ -c copy output3 \
Note: If you are using older FFmpeg and "-c copy" is not recognized, then you can replace it with "-acodec copy -vcodec copy".
For example, if you want to stream your webcam and save the copy of the stream into the local file, you can do it like this:
ffmpeg -f v4l2 -i /dev/video0 -vcodec libx264 -f mpegts - | \ ffmpeg -f mpegts -i - \ -c copy -f mpegts udp://188.8.131.52:5678 \ -c copy -f mpegts local.ts
Another option is to output from FFmpeg to "-" then to pipe that to a "tee" command, which can send it to multiple other processes, for instance 2 different other ffmpeg processes for encoding (this may save time, as if you do different encodings, and do the encoding in 2 different simultaneous processes, it might do encoding more in parallel than elsewise). Un benchmarked, however, see also here.
Multiple encodings for same input
If you had one input, then run it through some filters, then encode it to (for instance) several different bitrates to multiple files, then you may be able to save processing power by performing the filtering only once. This can be accomplished via the "map" feature, for instance, in this example the rescaling is performed only once, then encoded to 2 outputs:
ffmpeg -i input -an -filter_complex " scale=1000:1000,split=2 [a] [b]" -y -map "[a]" output1.avi -map "[b]" output2.avi
Again, you could use the "tee" command, see Parallel Encoding, to possibly do this more quickly, but this example at least avoids scaling twice.
See also this SO post.