[FFmpeg-user] How to transcode to HLS and DASH with mp4 and webm all at once

Stefan Oltmanns stefan-oltmanns at gmx.net
Sun Oct 9 18:53:14 EEST 2022


Hello,

I would like ffmpeg to transcode a file into different versions for
adaptive streaming (different codecs, different resolutions, different
bitrates):

DASH with webm (av1, opus) and MP4 (h264, aac)
HLS with MPEG2-TS (h264, aac)

While it is easy to find example command-lines for each of these formats
(webm-DASH, MPEG-DASH or HLS) I currently fail at two things:

-I would like to use one DASH manifest for webm and mp4 files. I'm not
sure if this is possible in general and if supported by ffmpeg. I would
like the player (scala with video.js) to choose the best codec for the
client.

-I would like to prevent unnecessary encoding: The x264 encoder output
(same for aac) for each resolution/bandwidth should be used for DASH and
HLS. There is the tee-muxer that seems to be designed for that, but I
cannot figure out how to use it in such a complex situation.

Can somebody give me an example howto
a) extend my (simplified) command-line to also generate a HLS output for
the h264/aac stream
b) generate a DASH manifest for all currently generated output files

ffmpeg -i $VIDEO_IN\
     -filter_complex
'[0:v]split=2[in1][in2];[in1]scale=w=1920:h=1080,split=2[1080a][1080b];[in2]scale=w=1280:h=720,split=2[720a][720b]'
\
     -map [720a] -keyint_min 100 -g 100 -c:v libsvtav1 -crf:v 25
-maxrate 2000k -bufsize 3M -f webm -dash 1 output_dash/video_720.webm \
     -map [720b] -keyint_min 100 -g 100 -c:v libx264 -crf:v 23 -maxrate
2000k -bufsize 3M -f mp4 -movflags dash output_dash/video_720.mp4 \
     -map [1080a] -keyint_min 100 -g 100 -c:v libsvtav1 -crf:v 25
-maxrate 5000k -bufsize 8M -f webm -dash 1 output_dash/video_1080.webm \
     -map [1080b] -keyint_min 100 -g 100 -c:v libx264 -crf:v 23 -maxrate
5000k -bufsize 8M -f mp4 -movflags dash output_dash/video_1080.mp4 \
     -map a:0 -c:a libopus -b:a 64k -ac 1 -ar 48000 -f webm -dash 1
output_dash/audio_mono_64k.webm \
     -map a:0 -c:a libopus -b:a 128k -ar 48000 -f webm -dash 1
output_dash/audio_stereo_128k.webm \
     -map a:0 -c:a libfdk_aac -b:a 64k -ac 1 -ar 48000 -f mp4 -movflags
dash output_dash/audio_mono_64k.mp4 \
     -map a:0 -c:a libfdk_aac -b:a 128k -ar 48000 -f mp4 -movflags dash
output_dash/audio_stereo_128k.mp4

Best regards
Stefan


More information about the ffmpeg-user mailing list