0

I am trying to created an adaptive stream from an mp4 file. I have a decent amount of experience at doing streaming, and have successfully implemented smooth streaming via Silverlight. We want a solution for everything that works in HTML5. I am pursuing DASH. So here are the steps I take...

  1. Resample the mp4 to different sizes using ffmpeg.
  2. Ensure the files are properly fragmented using Bento4s mp4Fragment utility.
  3. Create the DASH mpd file and associated segments using Bento4s mp4dash utility.

I have done a lot of work to learn each of these utilities and create a process that gets to output that I think will work. To create reliable DASH artifacts. But it seems I am doing something wrong. Here are examples of command lines I run.

For step one I create three different files... for three different rates and sizes... (these may not be the exact command lines, they are from old notes... but the parameter values are the ones I am using for sure)

ffmpeg -y -i C:\_SIMULATED_SHARE_C\ff\big_buck_bunny.mp4 -c:v libx264 -x264opts keyint=24:min-keyint=24:no-scenecut -b:v 1500k -maxrate 1500k -bufsize 1000k -vf "scale=-1:720" C:\_SIMULATED_SHARE_C\ff\output\outputfile720.mp4

ffmpeg -y -i C:\_SIMULATED_SHARE_C\ff\big_buck_bunny.mp4 -c:v libx264 -x264opts keyint=24:min-keyint=24:no-scenecut -b:v 800k -maxrate 800k -bufsize 500k -vf "scale=-1:540" C:\_SIMULATED_SHARE_C\ff\output\outputfile540.mp4

ffmpeg -y -i C:\_SIMULATED_SHARE_C\ff\big_buck_bunny.mp4 -c:v libx264 -x264opts keyint=24:min-keyint=24:no-scenecut -b:v 400k -maxrate 400k -bufsize 400k -vf "scale=-1:360" C:\_SIMULATED_SHARE_C\ff\output\outputfile360.mp4

So that gives you the three files that need to be fragmented. So I fragment them using the mp4fragment utility from Bento4. That command line is simple so I will not offer an example.

The I use Bento4s mp4dash to create the dash. Something like this...

"E:\\_INSTALL\\Bento4\\Bento4-SDK-1-4-3-607.x86-microsoft-win32-vs2010\\Bento4-SDK-1-4-3-607.x86-microsoft-win32-vs2010\\bin\\mp4dash.exe --mpd-name=\"\\\\d9fqt52\\_SIMULATED_SHARE_C\\ff\\output\\dash\\something.mpd\" -f -o \"\\\\d9fqt52\\_SIMULATED_SHARE_C\\ff\\output\\dash\" \"\\\\d9fqt52\\_SIMULATED_SHARE_C\\ff\\output\\bunny360f.mp4\" \"\\\\d9fqt52\\_SIMULATED_SHARE_C\\ff\\output\\bunny540f.mp4\" \"\\\\d9fqt52\\_SIMULATED_SHARE_C\\ff\\output\\bunny720f.mp4\" "

This runs ok. And creates the mpd file, an audio folder with segment files, an a video folder with 3 folders each with the segment files.

I am able to configure IIS to play the mpd ok. As well as the segement files. The video plays fine... and then it stops. It freezes between 50 and 60 seconds. Right before it freezes I can confirm that the onratechange event of the HTML5 video tag is raised. This is an event that is raised with the rate of play is changed. I do nothing to change this it just happens.

The actual video in question is about 1hr long. Also I am using the dash.js library as a player.

If you can identify any components or specifics I should change please let me know!

UPDATE ON MAR 7, 2016

As requested here is the MPD content...

<?xml version="1.0" ?>
<MPD mediaPresentationDuration="PT51M51.909S" minBufferTime="PT0.80S" profiles="urn:mpeg:dash:profile:isoff-live:2011" type="static" xmlns="urn:mpeg:dash:schema:mpd:2011">
  <!-- Created with Bento4 mp4-dash.py, VERSION=1.6.0-607 -->
  <Period>
    <!-- Audio -->
    <AdaptationSet lang="en" mimeType="audio/mp4" segmentAlignment="true" startWithSAP="1">
      <SegmentTemplate duration="801" initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/seg-$Number$.m4f" startNumber="1" timescale="1000"/>
      <Representation audioSamplingRate="48000" bandwidth="132491" codecs="mp4a.40.2" id="audio/en">
        <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
      </Representation>
    </AdaptationSet>
    <!-- Video -->
    <AdaptationSet maxHeight="720" maxWidth="1280" mimeType="video/mp4" minHeight="540" minWidth="640" segmentAlignment="true" startWithSAP="1">
      <SegmentTemplate duration="801" initialization="$RepresentationID$/init.mp4" media="$RepresentationID$/seg-$Number$.m4f" startNumber="1" timescale="1000"/>
      <Representation bandwidth="785536" codecs="avc1.64001F" frameRate="30000/1001" height="540" id="video/1" scanType="progressive" width="960"/>
      <Representation bandwidth="403537" codecs="avc1.64001E" frameRate="30000/1001" height="360" id="video/2" scanType="progressive" width="640"/>
      <Representation bandwidth="1496514" codecs="avc1.64001F" frameRate="30000/1001" height="720" id="video/3" scanType="progressive" width="1280"/>
    </AdaptationSet>
  </Period>
</MPD>

UPDATE ON MAR 7, 2016

Here is the console output for two different videos that just stop for some unknown reason between 50 and 60s

///ABS VIDEO 

58393][rulesController] [RULES]: playbackTimeRule [Fragment:download,82,MediaSegment,0video] Default 
dash.all.js:11 [58395][rulesController] [RULES]: sameTimeRequestRule [Fragment:download,82,MediaSegment,0,video] Default 
dash.all.js:11 [58401][indexHandler][audio] Getting the request for time: 82.082 
dash.all.js:11 [58403][indexHandler][audio] Index for time 82.082 is 81 
dash.all.js:11 [58405][indexHandler][audio] SegmentTemplate: 81.08099999999999 / 1361.235 
dash.all.js:11 [58406][indexHandler][audio] SegmentTemplate: 82.082 / 1361.235 
dash.all.js:11 [58407][rulesController] [RULES]: playbackTimeRule [Fragment:download,82,MediaSegment,0audio] Default 
dash.all.js:11 [58417][fragmentLoader] loaded video:MediaSegment:82.082 (200, 18ms, 2ms) 
dash.all.js:11 [58419][rulesController] [RULES]: sameTimeRequestRule [Fragment:download,82,MediaSegment,0,audio] Default 
dash.all.js:11 [58435][fragmentLoader] loaded audio:MediaSegment:82.082 (200, 14ms, 0ms) 
dash.all.js:11 [59390][indexHandler][video] Getting the request for time: 83.083 
dash.all.js:11 [59392][indexHandler][video] Index for time 83.083 is 82 
dash.all.js:11 [59393][indexHandler][video] SegmentTemplate: 82.082 / 1361.235 
dash.all.js:11 [59394][indexHandler][video] SegmentTemplate: 83.08299999999998 / 1361.235 
dash.all.js:11 [59395][rulesController] [RULES]: playbackTimeRule [Fragment:download,83,MediaSegment,0video] Default 
dash.all.js:11 [59396][rulesController] [RULES]: sameTimeRequestRule [Fragment:download,83,MediaSegment,0,video] Default 
dash.all.js:11 [59401][indexHandler][audio] Getting the request for time: 83.083 
dash.all.js:11 [59403][indexHandler][audio] Index for time 83.083 is 82 
dash.all.js:11 [59404][indexHandler][audio] SegmentTemplate: 82.082 / 1361.235 
dash.all.js:11 [59406][indexHandler][audio] SegmentTemplate: 83.08299999999998 / 1361.235 
dash.all.js:11 [59408][rulesController] [RULES]: playbackTimeRule [Fragment:download,83,MediaSegment,0audio] Default 
dash.all.js:11 [59416][fragmentLoader] loaded video:MediaSegment:83.08299999999998 (200, 17ms, 1ms) 
dash.all.js:11 [59418][rulesController] [RULES]: sameTimeRequestRule [Fragment:download,83,MediaSegment,0,audio] Default 
dash.all.js:11 [59437][fragmentLoader] loaded audio:MediaSegment:83.08299999999998 (200, 14ms, 1ms) 
dash.all.js:11 [59902][scheduleController][video] Stalling Buffer 
dash.all.js:11 [59903][bufferController][video] Waiting for more buffer before starting playback. 
dash.all.js:11 [59906][scheduleController][audio] Stalling Buffer 
dash.all.js:11 [59907][bufferController][audio] Waiting for more buffer before starting playback. 
dash.all.js:11 [63684][playbackController] <video> ratechange:  0 




///HOG VIDEO

[58250][rulesController] [RULES]: playbackTimeRule [Fragment:download,105,MediaSegment,0audio] Default 
dash.all.js:11 [58266][fragmentLoader] loaded video:MediaSegment:84.105 (200, 28ms, 1ms) 
dash.all.js:11 [58269][rulesController] [RULES]: sameTimeRequestRule [Fragment:download,105,MediaSegment,0,audio] Default 
dash.all.js:11 [58287][fragmentLoader] loaded audio:MediaSegment:84.105 (200, 14ms, 1ms) 
dash.all.js:11 [58982][indexHandler][video] Getting the request for time: 84.906 
dash.all.js:11 [58983][indexHandler][video] Index for time 84.906 is 105 
dash.all.js:11 [58984][indexHandler][video] SegmentTemplate: 84.105 / 3111.909 
dash.all.js:11 [58984][indexHandler][video] SegmentTemplate: 84.906 / 3111.909 
dash.all.js:11 [58985][rulesController] [RULES]: playbackTimeRule [Fragment:download,106,MediaSegment,0video] Default 
dash.all.js:11 [58986][rulesController] [RULES]: sameTimeRequestRule [Fragment:download,106,MediaSegment,0,video] Default 
dash.all.js:11 [58989][indexHandler][audio] Getting the request for time: 84.906 
dash.all.js:11 [58990][indexHandler][audio] Index for time 84.906 is 105 
dash.all.js:11 [58991][indexHandler][audio] SegmentTemplate: 84.105 / 3111.909 
dash.all.js:11 [58992][indexHandler][audio] SegmentTemplate: 84.906 / 3111.909 
dash.all.js:11 [58993][rulesController] [RULES]: playbackTimeRule [Fragment:download,106,MediaSegment,0audio] Default 
dash.all.js:11 [59002][fragmentLoader] loaded video:MediaSegment:84.906 (200, 14ms, 1ms) 
dash.all.js:11 [59003][rulesController] [RULES]: sameTimeRequestRule [Fragment:download,106,MediaSegment,0,audio] Default 
dash.all.js:11 [59014][fragmentLoader] loaded audio:MediaSegment:84.906 (200, 8ms, 1ms) 
dash.all.js:11 [59735][scheduleController][video] Stalling Buffer 
dash.all.js:11 [59736][bufferController][video] Waiting for more buffer before starting playback. 
dash.all.js:11 [59738][scheduleController][audio] Stalling Buffer 
dash.all.js:11 [59739][bufferController][audio] Waiting for more buffer before starting playback. 
dash.all.js:11 [61695][playbackController] <video> ratechange:  0 
Nick Birke
  • 47
  • 2
  • Actually I don't think the onratechange event is anymore than a symptom as the rate of play is indeed changing - it stops. I should also note that there are no errors that I can seem to capture. – Nick Birke Mar 04 '16 at 17:39

1 Answers1

0

Can you supply more info, such as the manifest that bento produces, as well as the debug console log produced by dash.js when playback stops? Also, which version of dash.js are you using - the latest released is 2.0 and you can get the nightly build from the /dev branch at https://github.com/Dash-Industry-Forum/dash.js.git

Cheers

Will

Will Law
  • 176
  • 1
  • 1
  • I am sorry to come across as a novice but can you tell me what you are talking about wrt the Debug console for DASH? I am not aware of the process for debugging the player while it is playing. Simply provided an appropriate link for me would be great. I am interested to find that this exists... I will definitely be researching this. – Nick Birke Mar 07 '16 at 14:06
  • FYI I tried this with a source file of a totally different nature and it does the same thing. I just got the latest dash player last week, I don't know what the version is. – Nick Birke Mar 07 '16 at 18:38
  • This other video I made freezes between 50 and 60s just like the other one. – Nick Birke Mar 07 '16 at 18:39