当前位置: 首页 > 知识库问答 >
问题:

实时流媒体:node-media-server+Dash.js为实时低延迟配置

曾苗宣
2023-03-14

我们正在开发一个应用程序,可以实时监控你的后院。每个客户端都有一个连接到internet的摄像头,流媒体到我们的公共Node.js服务器。

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

我们的目标是尽可能接近“实时”生活,这样你就可以立即监控你后院发生的事情。

已经完成的技术流程是:

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]',
      },
    ],
  },
},

据我所知,开箱即用的NMS(node-media-server)以多种输出格式发布输入流:flv、mpeg-dash、HLS。有了这些格式的各种在线播放器,我可以使用本地主机上的url访问和流。与mpeg-dash和hls我得到任何10-15秒之间的延迟,甚至更多。

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

我的代码是:

<!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>

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

共有1个答案

翟越
2023-03-14

HLS和MPEG破折号并不是标准的特别低的延迟,你得到的数字并不罕见。

一个公开的DASH论坛文档中的一些例子(链接如下)包括:

考虑到其中一些组织的资源,你取得的成果还不错!

分块自适应比特率(ABR,有关更多信息,请参见此答案:https://stackoverflow.com/a/42365034/334402)中延迟的一个关键组成部分是播放器需要在显示视频之前接收和解码视频的一个或多个片段。传统上,播放器必须接收整个片段,然后才能开始解码和显示它。下面第一个链接的开源参考中的图表说明了这一点:

低延迟破折号和HLS利用CMAF,即“通用媒体应用程序格式”,它将片段(例如,可能是6秒长)分成每个片段中的较小的“块”。这些块被设计成允许播放器解码并在收到完整段之前开始播放它们。

在典型的实时流中,延迟的其他来源将是从一种格式到另一种格式的任何转换,以及流服务器接收提要的任何延迟,在您的情况下,从网络摄像头接收提要,并对提要进行编码和打包以供流使用。

目前有很多关于低延迟流的好信息,无论是来自标准机构还是开源讨论,我认为这些信息将真正帮助您理解这些问题(在撰写本文时,所有链接都是当前的)。来自开源和标准讨论:

  • https://dashif.org/docs/report%20on%20low%20latency%20DASH.pdf(DASH focus)
  • https://github.com/video-dev/hlsjs-rfcs/pull/1。(HLS焦点)

和供应商:

    null

如果您希望提供一个提供实时流和录音的服务,您可能希望考虑使用实时流视图协议和HLS/DASH流,供任何回顾录音的人使用,在这种情况下,延迟可能不重要,但质量可能更关键。

 类似资料:
  • 配置SRS为Realtime模式,使用RTMP可以将延迟降低到0.8-3秒,可以应用到对实时性要求不苛刻的地方,譬如视频会议(其实视频会议,以及人类在开会的时候,正常时候是会有人讲,有人在听在想,然后换别人讲,其实1秒左右延迟没有问题的,除非要吵架,就需要0.3秒左右的延迟)。 配置最低延迟的服务器详细信息可以参考:LowLatency,本文举例说明部署的实例步骤。 假设服务器的IP是:192.1

  • 我想使用Flink流媒体以低延迟处理市场数据( 我有一组计算,每个都订阅三个流:缓慢移动的参数数据、股票价格和汇率。 例如。 Params(缓慢滴答:每天一次或两次): 资源(每秒多次滴答声): fx(每秒多次滴答声): 每当任何股票、外汇汇率或参数数据发生变化时,我都想立即计算结果并将其输出为新流。这在逻辑上可以表示为连接: 例如选择价格=(params.strike-asset.spot)*f

  • Node-Media-Server 是一个 Node.js 实现的 RTMP/HTTP/WebSocket/HLS/DASH 流媒体服务器。 特性 跨平台支持 Windows/Linux/Unix 支持的音视频编码 H.264/H.265/AAC/SPEEX/NELLYMOSER 支持缓存最近一个关键帧间隔数据,实现RTMP协议秒开 支持RTMP直播流转LIVE-HTTP/WS-FLV流,支持 N

  • 我正在使用Google的YouTube API Explorer(备用)来查找属于其他人的任意流媒体广播的信息。 无论我在字段中输入了什么,我都会返回 这似乎很荒谬,考虑到视频显然是流媒体。 我突然想到,我可能误解了字段的说明,所以我尝试了几种不同的可能性。这些包括。。。 频道ID() 用户ID() 视频ID() ...每个都无济于事。 我如何询问一个频道有关其直播流视频的信息?这个问题在过去可以

  • Media 对象提供录制和回放设备上的音频文件的能力。 var media = new Media(src, mediaSuccess, [mediaError]); 备注:Media的当前实现并没有遵守W3C媒体捕获的相关规范,目前只是为了提供方便。未来的实现将遵守最新的W3C规范并可能不再支持当前的APIs。 参数: src:一个包含音频内容的URI。(DOMString类型) mediaSu

  • @media工作原理和在常规CSS中一样,但是,要使用Stylus的块状符号。 @media print #header #footer display none 生成为: @media print { #header, #footer { display: none; } }