Nginx-rtmp module and mpeg-dash(Dash industry dash.js)

13,311

While this issue was fixed in nginx-rtmp, it looks like the original repository has become stale - the fix is only available in some forks. Try compiling nginx-rtmp from https://github.com/sergey-dryabzhinsky/nginx-rtmp-module or https://github.com/mattpepin/nginx-rtmp-module - both of which seem to have the commit that fixed it in.

Share:
13,311
huuthang
Author by

huuthang

Updated on June 16, 2022

Comments

  • huuthang
    huuthang almost 2 years

    Mpeg Dash-Streaming

    I am working in my thesis about live-streaming . I used ffmpeg,ngix server with rtmp module and dash.js from Dash industry. I start stream to server by ffmpeg, and play by dash, player runned well, but there were some problems.

    Player only play if mpd-dash play list still have chunk t=0, so whenever user request player and *.mpd updated with out chunk t=0 player do not run.

    I upload my *.mpd file to Dash Validator and get error: "Schematron validation not successful – DASH is not valid! ". But playist is generate by nginx - rtmp module not me.

    After searching some forum i got some information that nginx-rtmp module generate wrong dash play list *.mpd Nginx rtmp module -bug , and may be that bug was fixed and merged to master in github (i thought so Mered - report) . But i tried downloading newest nginx and rtmp module , Player also play incorrect.

    If i played with dash.all.js version 2 year ago : video only play good (play to end) if chunk t=0 is exist in play list *.mpd ,or player do not play (play in middle of streaming) If i played with dash.all.js lasted version : video play and stop playing soon or loop playing.

    I really need some help, my deadline is comming.

    Here is my nginx config(main config):

        rtmp {
    
        server {
            listen 1935;
            ping 30s;
            notify_method get;
            chunk_size 4000;
            allow play all;
    
            application myapp {
                live on;
                dash on;
                dash_path /tmp/dash;
    
                hls on;
                hls_cleanup on;
                hls_sync 100ms;
                hls_fragment 2s;
                hls_path /tmp/hls;
    
                allow play all;
    
    
            }
        }
    }
    

    and some others config:

    location /hls {
            # Serve HLS fragments
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /tmp;
            add_header Cache-Control no-cache;
            add_header Access-Control-Allow-Origin *;
        }
        location /dash.js {
            root /usr/share/nginx/html;
        }
    
        location /streaminghls {
            root /usr/share/nginx/html;
        }
    
        location /dash {
            # Serve DASH fragments
            root /tmp;
            add_header Access-Control-Allow-Origin *;            
    
        }
    

    and in html player :

     <script src="dash-old.all.js"></script>
    
            <script>
                function getUrlVars() {
                    var vars = {};
                    var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
                        vars[key] = value;
                    });
                    return vars;
                }
                function startVideo() {
                    var vars = getUrlVars(),
                        url = "http://192.168.100.107:80/dash/Screen.mpd",
                        video,
                        context,
                        player;
                    if (vars && vars.hasOwnProperty("url")) {
                        url = vars.url;
                    }
                    video = document.querySelector(".dash-video-player video");
                    context = new Dash.di.DashContext();
                    player = new MediaPlayer(context);
                    player.startup();
                    player.attachView(video);
                    player.setAutoPlay(true);
                    player.attachSource(url);
                }
            </script>
    

    Hls play excellently but not dash. I tried changing dash config in nginx config and C-source of rtmp-module with recompiling but not thing changed.

    My mpd play list :

        <MPD xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xsi="http://www.w3.org/2011/XMLSchema-instance" type="dynamic" availabilityStartTime="2015-12-17T03:17:07+07:00" availabilityEndTime="2015-12-17T03:18:23+07:00" minimumUpdatePeriod="PT5S" minBufferTime="PT5S" timeShiftBufferDepth="PT0H0M0.00S" suggestedPresentationDelay="PT10S" profiles="urn:hbbtv:dash:profile:isoff-live:2012,urn:mpeg:dash:profile:isoff-live:2011" xsi:schemaLocation="urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd">
    <Period start="PT0S" id="dash">
    <AdaptationSet id="1" segmentAlignment="true" maxWidth="320" maxHeight="240" maxFrameRate="20">
    <Representation id="Screen_H264" mimeType="video/mp4" codecs="avc1.64000c" width="320" height="240" frameRate="20" sar="1:1" startWithSAP="1" bandwidth="192000">
    <SegmentTemplate presentationTimeOffset="0" timescale="1000" media="Screen-$Time$.m4v" initialization="Screen-init.m4v">
    
    <SegmentTimeline>
    <S t="0" d="12500"/>
    <S t="12500" d="12500"/>
    <S t="25000" d="10550"/>
    <S t="35550" d="15700"/>
    <S t="51250" d="12500"/>
    <S t="63750" d="12500"/>
    </SegmentTimeline>
    </SegmentTemplate>
    </Representation>
    </AdaptationSet>
    <AdaptationSet id="2" segmentAlignment="true">
    <AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="1"/>
    <Representation id="Screen_AAC" mimeType="audio/mp4" codecs="mp4a.40.2" audioSamplingRate="22050" startWithSAP="1" bandwidth="62000">
    <SegmentTemplate presentationTimeOffset="0" timescale="1000" media="Screen-$Time$.m4a" initialization="Screen-init.m4a">
    <SegmentTimeline>
    <S t="0" d="12500"/>
    <S t="12500" d="12500"/>
    <S t="25000" d="10550"/>
    <S t="35550" d="15700"/>
    <S t="51250" d="12500"/>
    <S t="63750" d="12500"/>
    </SegmentTimeline>
    </SegmentTemplate>
    </Representation>
    </AdaptationSet>
    </Period>
    </MPD>
    

    I really need help.

    Thanks for reading, and am so sorry about my bad english.