Recently many changes have happened, in the streaming protocols and video players industry, and allowed HTML5 and MPEG-DASH to grow rapidly.

Google Chrome decided to stop supporting flash also deprecated the old Netscape Plugin API (NPAPI) in Chrome in September 2015.

Dave Lee, North America reporter for BBC says:

“Many other tech firms, including Apple, Microsoft and Mozilla, have taken steps to stop Flash running. In 2015, Facebook’s security chief Alex Stamos called for it to be killed off once and for all. Facebook has started using HTML5 for all video across its site and phased out Flash adverts “

This had a major affect to most of the OTT providers who were using Flash, and some of them decided to switch to MPEG-DASH (with HTML5) and HLS for iOS devices to avoid the frustration and provide a future proof solution.

On the other hand, Apple decided to add the support for fragmented MP4 into HLS, as Tim Siglin from Streaming Media reports:

Apple announced the inclusion of byte-range addressing for fragmented MP4 files, or fMP4, allowing content to be played in HLS without the need to multiplex it into the traditional MPEG-2 Transport Stream. Compatible with newer versions of its operating systems (macOS, tvOS, and iOS 6.0 or higher) this new fMP4 feature makes HLS compatible with the industry standard MPEG-DASH for browser-based HTML 5 playback.

This looks interesting because Apple with the evolution of HLS, combined with MP4 byte ranges and MSE/DASH on Safari desktop, looks like is moving towards the unified media format. Netflix pushed Apple to support ISO-BMFF but there are other OTT providers, such as Hulu, BBC, YouTube that probably will try to push as well.

BBC launched an HTML5 based player and they were testing different Web browsers which support MSE, an interesting article can be found here:

MSE Support in Browsers

  • Chrome 23
  • IE 11 (only on Windows 8+)
  • Safari 8.0 (only on OS X, not on iOS)
  • Safari 10.0 (supports MPEG-DASH mp4 fragments)
  • Firefox 42
  • Opera 20, only WebM, no h.264 yet (as of 26)

However, the development of MPEG-DASH is constant and there are some new features in the latest edition:

  • Media Timeline Events
  • Empty Periods
  • Content Asset Identifiers
  • Improved Ad-insertion Support
  • Adding Inline Access Tokens

Also there is a study regarding DASH and push-based transport protocols, as Nicolas Weil from Streaming Media reports:

Another study track has been launched to see how DASH would have to be adapted to push-based transport protocols HTTP/2 and WebSocket. It’s called DASH over Full Duplex HTTP-based Protocols (FDH). It aims to provide new options for large scale and low-latency streaming, based on the ability of the DASH delivery node to push the new segments to DASH players as soon as they propagate through the network, thus avoiding the waiting time generated by client-driven requests. The new mechanisms will be interoperable with HTTP/1.1, work with existing DASH contents and support caching by CDNs.

In the following section i will show how to transcode a movie to MPEG-DASH.

1) Use FFmpeg (in Linux or Windows) to create the MP4 files. In my case i was using Ubuntu and the nohup command to be able to execute all the FFMPEG command at the same time.

nohup /home/andrew/bin/ffmpeg -y -i big_bunny.mp4 -c:a libfdk_aac -ac 2 -ab 128k -c:v libx264 -x264opts ‘keyint=48:min-keyint=48:no-scenecut’ -b:v 4500k -maxrate 4500k -bufsize 4500k -vf “scale=1920×1080” outputfile1080.mp4 &

nohup /home/andrew/bin/ffmpeg -y -i big_bunny.mp4 -c:a libfdk_aac -ac 2 -ab 96k -c:v libx264 -x264opts ‘keyint=48:min-keyint=48:no-scenecut’ -b:v 2500k -maxrate 2500k -bufsize 2500k -vf “scale=1280×720” outputfile1720.mp4 &

nohup /home/andrew/bin/ffmpeg -y -i big_bunny.mp4 -c:a libfdk_aac -ac 2 -ab 96k -c:v libx264 -x264opts ‘keyint=48:min-keyint=48:no-scenecut’ -b:v 1800k -maxrate 1800k -bufsize 1800k -vf “scale=1280×720” outputfile2720.mp4 &

nohup /home/andrew/bin/ffmpeg -y -i big_bunny.mp4 -c:a libfdk_aac -ac 2 -ab 64k -c:v libx264 -x264opts ‘keyint=48:min-keyint=48:no-scenecut’ -b:v 800k -maxrate 800k -bufsize 800k -vf “scale=896×504” outputfile504.mp4 &                                

nohup /home/andrew/bin/ffmpeg -y -i big_bunny.mp4 -c:a libfdk_aac -ac 2 -ab 64k -c:v libx264 -x264opts ‘keyint=48:min-keyint=48:no-scenecut’ -b:v 500k -maxrate 500k -bufsize 500k -vf “scale=704×396” outputfile396.mp4 &

2) Use MP4fragment (from Bento4 suite tools) to fragment the MP4 files (check the segmentation with MP4info)

 mp4fragment outputfile1080.mp4 fragmented1080.mp4

mp4fragment outputfile2720.mp4 fragmented2720.mp4

mp4fragment outputfile1720.mp4 fragmented1720.mp4

mp4fragment outputfile504.mp4 fragmented504.mp4

mp4fragment outputfile396.mp4 fragmented396.mp4

 mp4info fragmented1080.mp4

mp4info fragmented2720.mp4

 mp4info fragmented1720.mp4

 mp4info fragmented504.mp4

 mp4info fragmented396.mp4

3) Use MP4Dash to create the dash files and mpd

mp4dash fragmented396.mp4 fragmented504.mp4 fragmented1720.mp4 fragmented2720.mp4 fragmented1080.mp4

In the following URL, BBC have some test content and information for the profiles and bitrates: