nginx-rtmp live viewer stats

Die Statistik Daten in einer Origin  / Edge Umgebung von mehreren nginx-rtmp Modulen mit Javascript abholen und auswerten.

<script>
var stats = { "origin": 0, "edge1" : 0, "edge2" : 0  };
var server = 0;
var viewer = 0;
$(document).ready(function() {
  setInterval("askServer();", 1000);
  setInterval("getViewers();", 1000);
});

function getServer() {
var s = "";
var i = 0;
for (var key in stats) {
  if (i++ == server){
    s = key;
  }
}
if (server++ == Object.keys(stats).length-1) {
server = 0;
}
return s;
}

function askServer(index){
var host = getServer();
$.ajax({
type: "GET",
url: "http://" + host + ".sound-stream.org/stat",
dataType: "xml",
success: function(xml) {
var val = parseInt( $(xml).find('nclients').last().text() -1);
stats[host] = val;
}
});
}

function getViewers(){
viewer = 0;
for (var key in stats) {
viewer += stats[key];
}
$('#viewer').html( viewer + ' Viewer');
}
</script>
Tagged with: ,
Veröffentlicht in Allgemein

DIY Y-Tricopter

Y-Tricopter für 3S 2000-4000mAh < 700g (ohne Akku)

CFK Rahmen
2 x Base – CFK Platte 100x100x1mm
2 x Boom – CFK Vierkant-Rohr 10x10x310mm mit 8mm Innen-Loch
1 x Boom – CFK Vierkant-Rohr 10x10x350mm mit 8mm Innen-Loch
2 x Motorhalterungen aus Platinenmaterial 45x30mm
5 x Landegestell aus Weinflaschenkorken 

Bushless Antrieb
3 x ESC – Cayenne ECO SimonK BL-ESC 20A 600Hz Opto
3 x Motor – Emax MT2213 935KV  (Ebay)
    + Bullet Connector  3,5mm
    + Propeller Mutter
    + Befestigung-Schrauben
    + Propeller Paar 1045 1xCW / 1xCCW
1 x Servo – HDKJ S3150D 15Kg Digital High Precision (JR) 
    + Robot Servo U-Bracket
    + Befestigung-Schrauben

Elektronik und Verkabelung
1 x Steuerung – KK2.1
5 x Kabel – Servo-Patch-Cable 100mm (JR)
1 x Kabel – Servo-Extension-Cable 400mm (JR)
1 x Kabel – Servo-Y-Kabel 100mm (JR)
1 x UBEC – Hobbywing UBEC 5V
1 x Kabel – Litze 1,5mm² rot 2000mm
1 x Kabel – Litze 1,5mm² schwarz  2000mm
1 x Buchse – XT60 Akku anschluß Buchse

Empfänger
1 x Receiver – JR Graupner GR-12 6 Kanal

Verwendetes Werkzeug
Ständerbohrmaschine
Bandschleifer
Dremel
Seitenschneider
Heißklebepistole
Lötkolben
Kabelbinder
Schrumpfschlauch
Loctite
Puk-Säge
Schraubenzieher/Schraubendreher

alle Werkzeuge und Teile sind wie üblich bei Ebay, Amazon, Conrad, Reichelt oder im Baumarkt zu finden…

Tagged with: , , , , , ,
Veröffentlicht in Allgemein

Webcam Empfehlungen

Goint Gray FULl HD 1080p USB 3.0          

Cisco/TANDBERG PrecisionHD 1080p Camera  

HP Webcam HD-4110          
HP WebCam HD-5210      

Logitech Full HD 1080p QUICKCAM    
Logitech HD Pro Webcam C930      
Logitech HD Pro Webcam C920        

Microsoft LifeCam Studio      
Microsoft LifeCam Cinema
Microsoft LifeCam HD-6000             

Tagged with:
Veröffentlicht in Allgemein

nginx mit rtmp-module als Edge für einen Wowza

nginx mit rtmp-module als Edge Server

Hier eine Beispiel Konfiguration um einen Livestram einmal abzuholen und beliebig oft zu verteilen.

rtmp {
    access_log /var/log/nginx/rtmp_access.log;
    server {
      listen 1935;
      application testapp{
        live on;
        meta copy;
        pull rtmp://server.name:1935/testapp;
      }
}

Beim Wowza ist nichts weiter zu beachten, wenn der Stream öffendlich zugänglich ist,.
Ansonsten kann man z.B. einen Token vom Client in der Stream Adresse mitgeben und durch den nginx schleifen.

Tagged with: , , ,
Veröffentlicht in Allgemein

rtmp Livestream mit Node.js und ffmpeg auf Html5 Canvas malen

Im Node.js einen neuen ffmpeg Prozess abspalten und einen rtmp Livestream in Video und Audio trennen.

ffmpeg = child_process.spawn("ffmpeg",[ "-re","-y",
 "-i","rtmp://server.name:port/application/stream",
 "-f","tee", 
 "-map","0:0","-an","-f","image2pipe","-r","30","-q:v","1","-vf","select=gt(scene\\,0.001),scale=320:240","-vcodec","ppm","video.mjpeg",
 "-map","0:1","-vn","-acodec","pcm_s32le","-ac","1","-ar","44100","audio.wav"
]);

Die Motion JPEG Daten Frame für Frame annehmen, und durch ImageMagick pumpen um sie ein wenig zu schärfen.

video.on('data', function(data) {
  var sharpen = new Buffer('','binary');
  var im = child_process.spawn("convert.exe",["ppm:-","-sharpen","1x1","-"]);
  im.stdout.on('data', function(imdata) {
    sharpen += imdata;
  });
});

Die aufbereiteten Bilder per Socket.IO ans Frontend senden (broadcast)

im.on('exit', function(code) { 
  var frame = new Buffer(sharpen).toString('base64');
  socket.broadcast.to(room).emit('canvas',frame);
});

Die Daten im Frontend annehmen und auf die Canvas kopieren

sock.on('canvas', function(data) {
  try {
    var canvas = document.getElementById('videostreamshow');
    var context = canvas.getContext('2d');
    var imageObj = new Image();
    imageObj.src = "data:image/jpeg;base64," + data;
    imageObj.onload = function(){
      context.height = imageObj.height;
      context.width = imageObj.width;
      context.drawImage(imageObj,0 ,0,320,150);
    }
  } catch(e){ }
});
Tagged with: , , , , ,
Veröffentlicht in Allgemein

Vorschaubilder aus einem Video erstellen

ffmpeg und avconv (libav) eigenen sich herforragend um Einzelbilder aus einem Video herauszuholen.

Alle Einzelbilder des Videos Extrahieren und als PNG speichern.

ffmpeg -i input_video.avi -f image2 output%03d.png

Oder als JPEG speichern

ffmpeg -i input_video.avi -f image2 output%03d.jpeg

Ein Vorschaubild bei Sekunde 10 im Video erstellen

ffmpeg -i input_video.avi -ss 00:00:10 -f image2 -vframes 1 output.png

Oder jede Minute eine Vorschaubild

ffmpeg -i myvideo.avi -f image2 -vf fps=fps=1/60 img%03d.jpg
Tagged with: , , , , , ,
Veröffentlicht in Allgemein

Das richtige H264 Profile und Level wählen.

Bei H264 kommt es darauf an, das richtige Profile und das Level des Codecs zu wählen.

Beim H264 Profil kommt es auf das abspielende Gerät an,
ich würde mich auf BASELINE oder MAIN Profile für Internet oder Live Anwendungen beschenken.
– BASELINE für ältere oder schwächere Geräte.
– MAIN für fast alle Geräte geeignet.
– HIGH für Leistungsstarke Geräte, Desktop Computer, Set-Top-Boxen

Die höheren Profile sind nicht für Internet Streaming, sondern eher für Offline Videos geeignet.
– HIGH 4:2:2
– HIGH 4:4:4

Beim H264 Level kommt es auf den Videostream an,  genauer gesagt auf die pixel pro Sekunde  oder die frames pro Sekunde (fps), was zuerst das Maximum des Levels erreicht.

Die Pixel/s berechnet man einfach

width * height * fps = Pixel/s

und dann wählt man einfach das passende H264 Level anhand der Pixel/s oder der fps.

H264 Level Pixel/s fps
1 380160 30
1b 380160 30
1.1 786000 30
1.2 1536000 30
1.3 3041280 30
2 3041280 30
2.1 5068800 30
2.2 5184000 30
3 10368000 60
3.1 27648000 60
3.2 55296000 60
4 62914560 30
4.1 62914560 60
4.2 133693440 60
5. 150994994 60
5.1 251658240 120
5.2 530841600 120

Das ist es dann eigentlich schon.

Wenn die Frames per Second im Videostream nicht konstant sind, kann man ausprobieren, ob ein Level tiefer oder höher bessere Ergebnisse liefert. Das Video sollte flüssig laufen, und keine Artefakte enthalten.

Tagged with: , ,
Veröffentlicht in Allgemein