FFmpeg has a format named "dash":
> ffmpeg -formats
...
E dash DASH Muxer
...
This presumably corresponds to the code in libavformat/dashenc.c.
I can find a number of items on the web about how to use the WebM DASH Manifest format, but nothing at all about this other DASH format.
Can someone point me to documentation or examples that use the "DASH Muxer" either from the command line or API?
The dash muxer in ffmpeg is fairly new and not yet in the documentation. I managed to get it to work for my use case by looking at the source. It creates the .mpd dash file as well as the segments (unless you don't segment, and plan to use the Range: headers feature of DASH for seeks and partial access). The muxer options are:
My use case is live streaming, segments of exactly 4 seconds, no segment timeline, using segment template, and I use:
ffmpeg -i /dev/dvb/adapter0/dvr0 -vf yadif=0 -r 25 -vcodec libx264 -keyint_min 0 -g 100 -b:v 1000k -ac 2 -strict 2 -acodec aac -ab 64k -map 0:v -map 0:a -f dash -min_seg_duration 4000 -use_template 1 -use_timeline 0 -init_seg_name init-\$RepresentationID\$.mp4 -media_seg_name test-\$RepresentationID\$-\$Number\$.mp4 test.mpd
The generated dash manifest looks like this:
<?xml version="1.0" encoding="utf-8"?>
<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="urn:mpeg:dash:schema:mpd:2011"
xmlns:xlink="http://www.w3.org/1999/xlink"
xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd"
profiles="urn:mpeg:dash:profile:isoff-live:2011"
type="dynamic"
minimumUpdatePeriod="PT500S"
suggestedPresentationDelay="PT4S"
availabilityStartTime="2016-12-09T10:11:16"
publishTime="2016-12-09T10:13:53"
minBufferTime="PT4.0S">
<ProgramInformation>
</ProgramInformation>
<Period start="PT0.0S">
<AdaptationSet contentType="video" segmentAlignment="true" bitstreamSwitching="true" frameRate="25/1">
<Representation id="0" mimeType="video/mp4" codecs="avc1.64001e" bandwidth="1000000" width="720" height="576" frameRate="25/1">
<SegmentTemplate timescale="1000000" duration="4000000" initialization="init-$RepresentationID$.mp4" media="test-$RepresentationID$-$Number%05d$.mp4" startNumber="1">
</SegmentTemplate>
</Representation>
</AdaptationSet>
<AdaptationSet contentType="audio" segmentAlignment="true" bitstreamSwitching="true">
<Representation id="1" mimeType="audio/mp4" codecs="mp4a.40.2" bandwidth="64000" audioSamplingRate="48000">
<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2" />
<SegmentTemplate timescale="1000000" duration="4000000" initialization="init-$RepresentationID$.mp4" media="test-$RepresentationID$-$Number$.mp4" startNumber="1">
</SegmentTemplate>
</Representation>
</AdaptationSet>
</Period>
</MPD>
The manifest and associated stream plays in ExoPlayer on Android. It currently seems to only generate DASH live manifests and video or audio-only files. Changing from live to VOD is trivial though (have a look at the DASH spec). I've tested the stream in ExoPlayer on Android and it plays fine.
Just a note to complete @Jeroen's answer.
On Windows if you want ffmpeg
to write the output files to a specific directory you should write like this:
ffmpeg -i [INPUT] -f dash [OPTIONS] C:\your\output\directory/test.mpd
ffmpeg source looks for last /
in output path to split file name and output directory
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With