NorskControl.streamStatistics() method
Record statistical information about media streams, including bitrate, frame rate, and number of keyframes, measured over some configurable sampling windows.
Corresponding settings are found on many input and output nodes.
Signature:
streamStatistics(settings: StreamStatisticsSettings): Promise<StreamStatisticsNode>;
Parameters
Parameter | Type | Description |
---|---|---|
settings |
Callback and sampling intervals |
Returns:
Promise<StreamStatisticsNode>
Example [09_rtmp_stream_stats.ts]
Print out audio and video bitrate every 5 seconds.
This demo uses the dedicated StreamStatisticsNode, but other nodes also expose stream stats through the same interface (e.g. NorskInput.rtmpServer)
const sampleIntervalSeconds = 5;
const input_stats = await norsk.processor.control.streamStatistics({
id: "inputStreamStatistics",
onStreamStatistics: ({ audio, video, total, allStreams }) => {
// Stats can be found for each stream individually by stream key
console.log(`${allStreams.length} streams:`);
// And aggregated information for audio, video, and total is available
console.log(` audio: ${(audio.bitrate / 1000).toFixed(1)}kbps`);
console.log(` video: ${(video.bitrate / 1000).toFixed(1)}kbps`);
console.log(` total: ${(total.bitrate / 1000).toFixed(1)}kbps`);
},
statsSampling: { sampleIntervalsSeconds: [sampleIntervalSeconds] },
});
input_stats.subscribe([{ source: input, sourceSelector: selectAV }]);
Run the following command to generate example input at url rtmp://127.0.0.1:1935/norsk/high
:
ffmpeg -v error -re -stream_loop -1 -i data/InkDrop.ts -vcodec copy -codec copy -f flv 'rtmp://127.0.0.1:1935/norsk/high'
Example [10_bitrate_estimator.ts]
Measure bitrate and set this estimate in the stream metadata
// SRT inputs do not have bitrate information, which is required for HLS
// multi variant playlists.
//
// AAC audio does not need a transcode in this setting, and without a
// transcode (implicit or explicit), there is no bitrate information added.
const srtAacInput = await norsk.input.srt(srtSettings);
// So we sample the stream for 10 seconds to estimate its bitrate and add this
// bitrate to the stream's metadata before subscribing the multi variant playlist to
// the stream.
let streamStarted = false;
const streamStatistics = await norsk.processor.control.streamStatistics({
id: "inputStreamStatistics",
statsSampling: {
// 1s for visualiser updates
// 5s for console updates
// 10s for stream bitrate estimation
sampleIntervalsSeconds: [1, 5, 10],
},
onStreamStatistics: stats => {
const { audio, video } = stats;
if (stats.sampleSizeSeconds === 10) {
if (streamStarted) return;
streamStarted = true;
console.log(`+ audio: ${(audio.bitrate / 1000).toFixed(1)}kbps`)
console.log(`+ video: ${(video.bitrate / 1000).toFixed(1)}kbps`);
// Use NorskTransform.streamMetadataOverride to add bitrate information
// to the video and audio streams
streamMetadataOverride.updateConfig({
video: {
bitrate: video.bitrate,
},
audio: {
bitrate: audio.bitrate,
}
});
// And subscribe the multi variant playlist, now that the stream has bitrate
// metadata
// multiVariantOutput.subscribe([
// { source: streamMetadataOverride, sourceSelector: selectPlaylist },
// ]);
} else if (stats.sampleSizeSeconds === 5 && streamStarted) {
console.log(` audio: ${(audio.bitrate / 1000).toFixed(1)}kbps`)
console.log(` video: ${(video.bitrate / 1000).toFixed(1)}kbps`);
}
},
});
streamStatistics.subscribe([
{ source: srtAacInput, sourceSelector: selectAV },
]);
const streamMetadataOverride = await norsk.processor.transform.streamMetadataOverride({
id: "setBitrate",
});
streamMetadataOverride.subscribe([
{ source: srtAacInput, sourceSelector: selectAV },
]);
Run the following command to generate example input at url srt://127.0.0.1:5001?pkt_size=1316
:
ffmpeg -v error -re -stream_loop -1 -i data/InkDrop.ts -vcodec copy -codec copy -f mpegts -flush_packets 0 'srt://127.0.0.1:5001?pkt_size=1316'
Find Examples
Search for examples using streamStatistics in our examples repo.