实时流:节点媒体服务器+为实时低延迟配置的Dash.js

问题描述 投票:2回答:1

我们正在开发可实时监控您的后院的应用。每个客户端都有一台连接到互联网的摄像机,并流到我们的公共node.js服务器。

我正在尝试使用node-media-server发布MPEG-DASH(或HLS)流,以供我们的应用程序客户端在世界各地的不同网络,带宽和分辨率上使用。

我们的目标是使尽可能接近以实时“实时”生活,以便您可以立即监视后院的情况。

已经完成的技术流程是:

  1. 我们服务器上的ffmpeg进程处理传入的摄像机流(每个摄像机的单独子进程),并通过RTSP在本地计算机上将该流发布,以供node-media-server用作“输入”(我们还在保存分段文件,生成缩略图等)。负责该任务的ffmpeg命令是:

    -c:v libx264 -preset ultrafast -tune zerolatency -b:v 900k -f flv rtmp://127.0.0.1:1935/live/office

  2. node-media-server正在使用我发现的“实时流”的默认配置运行

  3. private NMS_CONFIG = {
    server: {
      secret: 'thisisnotmyrealsecret',
    },
    rtmp_server: {
      rtmp: {
        port: 1935,
        chunk_size: 60000,
        gop_cache: false,
        ping: 60,
        ping_timeout: 30,
      },
      http: {
        port: 8888,
        mediaroot: './server/media',
        allow_origin: '*',
      },
      trans: {
        ffmpeg: '/usr/bin/ffmpeg',
        tasks: [
          {
            app: 'live',
            hls: true,
            hlsFlags: '[hls_time=2:hls_list_size=3:hls_flags=delete_segments]',
            dash: true,
            dashFlags: '[f=dash:window_size=3:extra_window_size=5]',
          },
        ],
      },
    },
    

    };

  4. 据我所知,NMS(node-media-server)开箱即用地以多种输出格式发布了输入流:flv,mpeg-dash,hls。使用这些格式的各种在线播放器,我可以使用localhost上的url访问该流。使用mpeg-dash和hls,我得到的延迟介于10-15秒之间,还有更多。


  5. 我现在的目标是使用dash.js来实现本地客户端mpeg-dash播放器,并将其配置为尽可能接近实况。

我的代码是:

<!doctype html>
<html>
    <head>
        <title>Dash.js Rocks</title>
        <style>
            video {
                width: 640px;
                height: 480px;
            }
        </style>
    </head>
    <body>
        <div>
            <video autoplay="" id="videoPlayer" controls=""></video>
        </div>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/dashjs/3.0.2/dash.all.min.js"></script>

        <script>
            (function(){
                // var url = "https://dash.akamaized.net/envivio/EnvivioDash3/manifest.mpd";
                var url = "http://localhost:8888/live/office/index.mpd";
                var player = dashjs.MediaPlayer().create();
                
                

                // config
                targetLatency = 2.0;        // Lowering this value will lower latency but may decrease the player's ability to build a stable buffer.
                minDrift = 0.05;            // Minimum latency deviation allowed before activating catch-up mechanism.
                catchupPlaybackRate = 0.5;  // Maximum catch-up rate, as a percentage, for low latency live streams.
                stableBuffer = 2;           // The time that the internal buffer target will be set to post startup/seeks (NOT top quality).
                bufferAtTopQuality = 2;     // The time that the internal buffer target will be set to once playing the top quality.


                player.updateSettings({
                    'streaming': {
                        'liveDelay': 2,
                        'liveCatchUpMinDrift': 0.05,
                        'liveCatchUpPlaybackRate': 0.5,
                        'stableBufferTime': 2,
                        'bufferTimeAtTopQuality': 2,
                        'bufferTimeAtTopQualityLongForm': 2,
                        'bufferToKeep': 2,
                        'bufferAheadToKeep': 2,
                        'lowLatencyEnabled': true,
                        'fastSwitchEnabled': true,
                        'abr': {
                            'limitBitrateByPortal': true
                        },
                    }
                });

                console.log(player.getSettings());

                setInterval(() => {
                  console.log('Live latency= ', player.getCurrentLiveLatency());
                  console.log('Buffer length= ', player.getBufferLength('video'));
                }, 3000);

                player.initialize(document.querySelector("#videoPlayer"), url, true);

            })();

        </script>
    </body>
</html>

带有在线测试视频(https://dash.akamaized.net/envivio/EnvivioDash3/manifest.mpd),我看到实时延迟值接近2秒(但是我无法真正确认它。这是一个视频文件。在我的办公室,我有一个摄像头,所以我可以实际比较现实生活和我得到的视频流之间的延迟)。但是,当在我的NMS本地工作时,此值似乎不想低于20-25秒。

我做错什么了吗?我忘记了播放器上的任何配置(客户端html)吗?还是我应该在服务器端(NMS)上添加缺少的配置?

我们正在开发可实时监控您的后院的应用。每个客户端都有一台连接到互联网的摄像机,并流到我们的公共node.js服务器。我正在尝试使用node-media-server ...

node.js ffmpeg live-streaming mpeg-dash dash.js
1个回答
0
投票

HLS和MPEG DASH并不是标准的低延迟,而且您得到的数字也不罕见。

© www.soinside.com 2019 - 2024. All rights reserved.