[FFmpeg-user] Mulitple output files from one -map?

Moritz Barsnick barsnick at gmx.net
Wed Aug 26 10:19:33 CEST 2015


Hi Jonathan,

On Wed, Aug 26, 2015 at 14:11:05 +1200, Jonathan Viney wrote:

> high.mp4 is encoded correctly with the contents of output2, but
> medium.mp4 and low.mp4 are copies of input1.mkv.

Each new output file triggers a new set of output options. So strictly,
those are probably not "copies" but separate encodes with default
options (whatever ffmpeg applies by default to an mpeg4 container).

> Is there a way to encode multiple copies of output2 using -map?
> Specifying -map "[output2]" more than once causes errors saying it's
> already been used.

"-map" maps the _inputs_ to the filters/encoders. There are some nice
graphs here, and the solution(s) to your problem:
https://trac.ffmpeg.org/wiki/Creating%20multiple%20outputs

> Inserting a split=3 filter into the filter chain works fine and allows
> each output to be mapped individually:

Correct, now you get your intended outputs, but they're encoded
multiple times.

> Is that the best way to do this or can -map be used somehow? Would the
> split filter potentially be doing extra frame copies unnecessarily?
> I'm using current ffmpeg head.

No, that's not the best way. Don't worry about the frame copies - it's
the encodes that gobble up your CPU.

You're looking for the "tee" muxer:
https://www.ffmpeg.org/ffmpeg-formats.html#tee

  "The tee muxer can be used to write the same data to several files or
   any other kind of muxer. It can be used, for example, to both stream
   a video to the network and save it to disk at the same time.

   It is different from specifying several outputs to the ffmpeg
   command-line tool because the audio and video data will be encoded
   only once with the tee muxer; encoding can be a very expensive
   process."

ffmpeg -i input1.mkv -i input2.mkv -filter_complex
"myfilter[output1][output2]" -map "[output1]" -f null /dev/null -map
"[output2]" -y -f tee "high.mp4|medium.mp4|low.mp4"


(I think you now need to add "-c:v foo -c:a bar", as it seems that
using the tee muxer requires you to explicitly map input streams, and
to explicitly give encoding options, as ffmpeg can't determine
defaults.)

HTH,
Moritz


More information about the ffmpeg-user mailing list