ffmpegvideo-streamingwebmdash.js

dashjs can't find initialization segment on manifest.mpd


I am following this tutorial to stream a WebM. I have no issues running the ffmpeg commands to generate the videos/audio/manifest files but when I try to run it locally, there's no video or audio at all and dashjs floods the console with:

Searching for initialization.    
Start searching for initialization.     
Perform init search: http://localhost:8080/video_1280x720_500k.webm    
Perform SIDX load: http://localhost:8080/video_640x360_750k.webm     
Perform SIDX load: http://localhost:8080/video_1280x720_500k.webm 

Writing that to console until I stop the server. I have tried using other mpd files such as this, which is used on the dashjs quickstart and it plays the video without any problems.

I used this guide to install the latest version of ffmpeg on Ubuntu 14.04 LTS:

ffmpeg version N-79688-g3cb3ddd Copyright (c) 2000-2016 the FFmpeg developers
built with gcc 5.3.0 (Ubuntu 5.3.0-3ubuntu1~14.04) 20151204
configuration: --prefix=/home/ab/cpp/ffmpeg_build --pkg-config-flags=--static --extra-cflags=-I/home/ab/cpp/ffmpeg_build/include --extra-ldflags=-L/home/ab/cpp/ffmpeg/lib --bindir=/home/ab/bin --enable-gpl --enable-libass --enable-libfdk-aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree
libavutil      55. 23.100 / 55. 23.100
libavcodec     57. 38.100 / 57. 38.100
libavformat    57. 34.103 / 57. 34.103
libavdevice    57.  0.101 / 57.  0.101
libavfilter     6. 44.100 /  6. 44.100
libswscale      4.  1.100 /  4.  1.100
libswresample   2.  0.101 /  2.  0.101
libpostproc    54.  0.100 / 54.  0.100

When running on ffmpeg:

ffmpeg \
 -f webm_dash_manifest -i video_160x90_250k.webm \
 -f webm_dash_manifest -i video_320x180_500k.webm \
 -f webm_dash_manifest -i video_640x360_750k.webm \
 -f webm_dash_manifest -i video_640x360_1000k.webm \
 -f webm_dash_manifest -i video_1280x720_500k.webm \
 -f webm_dash_manifest -i audio_128k.webm \
 -c copy -map 0 -map 1 -map 2 -map 3 -map 4 -map 5 \
 -f webm_dash_manifest \
 -adaptation_sets "id=0,streams=0,1,2,3,4 id=1,streams=5" \
 manifest.mpd

It generates the following manifest.mpd:

<?xml version="1.0" encoding="UTF-8"?>
<MPD
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="urn:mpeg:DASH:schema:MPD:2011" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011" type="static" mediaPresentationDuration="PT117.726S" minBufferTime="PT1S" profiles="urn:webm:dash:profile:webm-on-demand:2012">
  <Period id="0" start="PT0S" duration="PT117.726S">
    <AdaptationSet id="0" mimeType="video/webm" codecs="vp9" lang="eng" bitstreamSwitching="true" subsegmentAlignment="true" subsegmentStartsWithSAP="1">
      <Representation id="0" bandwidth="198155" width="160" height="90">
        <BaseURL>video_160x90_250k.webm</BaseURL>
        <SegmentBase indexRange="2007834-2008211">
          <Initialization range="0-437" />
        </SegmentBase>
      </Representation>
      <Representation id="1" bandwidth="459264" width="320" height="180">
        <BaseURL>video_320x180_500k.webm</BaseURL>
        <SegmentBase indexRange="4459996-4460374">
          <Initialization range="0-439" />
        </SegmentBase>
      </Representation>
      <Representation id="2" bandwidth="718495" width="640" height="360">
        <BaseURL>video_640x360_750k.webm</BaseURL>
        <SegmentBase indexRange="6614036-6614414">
          <Initialization range="0-441" />
        </SegmentBase>
      </Representation>
      <Representation id="3" bandwidth="931445" width="640" height="360">
        <BaseURL>video_640x360_1000k.webm</BaseURL>
        <SegmentBase indexRange="8309082-8309460">
          <Initialization range="0-441" />
        </SegmentBase>
      </Representation>
      <Representation id="4" bandwidth="821274" width="1280" height="720">
        <BaseURL>video_1280x720_500k.webm</BaseURL>
        <SegmentBase indexRange="8728812-8729190">
          <Initialization range="0-441" />
        </SegmentBase>
      </Representation>
    </AdaptationSet>
    <AdaptationSet id="1" mimeType="audio/webm" codecs="vorbis" lang="eng" audioSamplingRate="44100" bitstreamSwitching="true" subsegmentAlignment="true" subsegmentStartsWithSAP="1">
      <Representation id="5" bandwidth="107104">
        <BaseURL>audio_128k.webm</BaseURL>
        <SegmentBase indexRange="1538710-1539184">
          <Initialization range="0-4112" />
        </SegmentBase>
      </Representation>
    </AdaptationSet>
  </Period>
</MPD>

The index.html has a few changes because dash.js changed the way the player gets initialized.

<!doctype html>
<html>
    <head>
        <title>Video Streaming</title>
        <style>
            video {
                width: 640px;
                height: 360px;
            }
        </style>
        <script src="http://cdn.dashjs.org/latest/dash.all.debug.js"></script>
    </head>
    <body>
        <div>
            <video data-dashjs-player src="manifest.mpd" controls></video>
        </div>
    </body>
</html>

And here is Chromium's log file. I'm converting this webm from this site.

If I missed out any other relevant information or if anyone can guide me into the right direction, please let me know.

Edit:

Like Will Law mentioned, using the Shaka Player worked without any issues with my current manifest. Hope this helps anyone else.


Solution

  • @Abelardo - that article was written against 1.x versions of dash.js player. With the 2.x versions, the page embed and in initialization instructions have changed (as you have pointed out) . Additionally, the dash.webm.min.js library has not been updated since 2.x. The focus of most participants in the dash.js project has been AVC with ISOBMFF. While we would love dash.webm.min.js to be updated and maintained, it hasn't and so I wouldn't want you banging your head expecting it to work. I would expect Shaka player, being a Google initiative, to be current with respect to WebM - is that working for you? If you would like to get down in to the weeds and bring dash.webm.min up to date, that would be good for the community.