我们正在开发可实时监控您的后院的应用。每个客户端都有一台连接到互联网的摄像机,并流到我们的公共node.js服务器。
我正在尝试使用node-media-server发布MPEG-DASH(或HLS)流,以供我们的应用程序客户端在世界各地的不同网络,带宽和分辨率上使用。
我们的目标是使尽可能接近以实时“实时”生活,以便您可以立即监视后院的情况。
已经完成的技术流程是:
我们服务器上的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
node-media-server正在使用我发现的“实时流”的默认配置运行
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。使用这些格式的各种在线播放器,我可以使用localhost上的url访问该流。使用mpeg-dash和hls,我得到的延迟介于10-15秒之间,还有更多。
我现在的目标是使用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 ...
HLS和MPEG DASH并不是标准的低延迟,而且您得到的数字也不罕见。