Video Element Error: MEDIA_ERR_SRC_NOT_SUPPORTED

2019-02-28 16:01发布

问题:

I'm trying to play a dash mpd file with dash.js.I used axinom tutorial for guidance which suggested the command below for generating the mpd file.

mkdir dash_unprotected
MP4Box -dash 4000 -rap -frag-rap -sample-groups-traf -profile dashavc264:live
-bs-switching no -segment-name dash_$RepresentationID$_$Number$ -url-template
video-700k.mp4 video-1000k.mp4 video-1500k.mp4 video-2000k.mp4 audio.mp4 -out
"dash_unprotected/manifest.mpd"

The resulting mpd file

 <?xml version="1.0"?>
<!-- MPD file Generated with GPAC version 0.5.1-DEV-rev5619  on 2017-06-29T06:08:26Z-->
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" minBufferTime="PT1.500000S" type="static" mediaPresentationDuration="PT0H1M55.01S" profiles="urn:mpeg:dash:profile:isoff-live:2011, http://dashif.org/guildelines/dash264">
 <ProgramInformation moreInformationURL="http://gpac.sourceforge.net">
  <Title>dash_unprotected/manifest.mpd generated by GPAC</Title>
 </ProgramInformation>

 <Period duration="PT0H1M55.01S">
  <AdaptationSet segmentAlignment="true" maxWidth="316" maxHeight="576" maxFrameRate="30" par="316:576" lang="und">
   <SegmentTemplate timescale="15360" media="dash_dash_unprotected$$Number$.m4s" startNumber="1" duration="49009" initialization="dash_dash_unprotected$init.mp4"/>
   <Representation id="1" mimeType="video/mp4" codecs="avc1.64002a" width="158" height="288" frameRate="30" sar="396:395" startWithSAP="1" bandwidth="699969">
   </Representation>
   <Representation id="2" mimeType="video/mp4" codecs="avc1.64002a" width="198" height="360" frameRate="30" sar="1:1" startWithSAP="1" bandwidth="996926">
   </Representation>
   <Representation id="3" mimeType="video/mp4" codecs="avc1.64002a" width="264" height="480" frameRate="30" sar="1:1" startWithSAP="1" bandwidth="1496279">
   </Representation>
   <Representation id="4" mimeType="video/mp4" codecs="avc1.64002a" width="316" height="576" frameRate="30" sar="396:395" startWithSAP="1" bandwidth="1993448">
   </Representation>
  </AdaptationSet>
  <AdaptationSet segmentAlignment="true" lang="und">
   <SegmentTemplate timescale="44100" media="dash_dash_unprotected$$Number$.m4s" startNumber="1" duration="174856" initialization="dash_dash_unprotected$init.mp4"/>
   <Representation id="5" mimeType="audio/mp4" codecs="mp4a.40.2" audioSamplingRate="44100" startWithSAP="1" bandwidth="97798">
    <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>
   </Representation>
  </AdaptationSet>
 </Period>
</MPD>

I then try to play it in dash.js using the JavaScript code below

    var url = "drm/dash_unprotected/manifest.mpd";
    var player = dashjs.MediaPlayer().create();

$(function() {
    player.initialize(document.querySelector("#videoPlayer"),null, true);
    player.attachVideoContainer(document.getElementById("videoContainer"));

    $('#playButton').click(function() {
        player.attachSource(url);
    });
});

But dash.js throws an error

[42585] Video Element Error: MEDIA_ERR_SRC_NOT_SUPPORTED (CHUNK_DEMUXER_ERROR_APPEND_FAILED: audio object type 0x40 does not match what is specified in the mimetype.) 
dash.all.debug.js:14793 [42586] [object MediaError] 
dash.all.debug.js:14793 [42588] Schedule controller stopping for video 
dash.all.debug.js:14793 [42589] Schedule controller stopping for audio 
dash.all.debug.js:14793 [42591] Caught pending play exception - continuing (NotSupportedError: Failed to load because no supported source was found.)

How can i solve this error? I'm new to dash.js and mpeg-dash staff

回答1:

I was able to solve the error by just removing the -segment-name option and it's value. So my command look like this

 mkdir dash_unprotected
MP4Box -dash 4000 -rap -frag-rap -sample-groups-traf -profile dashavc264:live
-bs-switching no -url-template
video-700k.mp4 video-1000k.mp4 video-1500k.mp4 video-2000k.mp4 audio.mp4 -out
"dash_unprotected/manifest.mpd"

-segment-name option was making my segments to overwrite each other. e.g video segments to be overwritten by audio segments. Overwriting was happening because both video and audio segments were being given the same names even when i use unique values to the -segment-name option.

-segment-name $RepresentationID$$ or -segment-name $Time$$

Eliminating this option make MP4Box to use the default value %s_dash for -segment-name. So audio segments will be named like this

 audio_dash1.m4s

and video segments like this

 `video_dash1.m4s`