• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[GELÖST] Prototyping in Nodejs, ich versteh‘s nicht.

xorg1990

New member
Hallo, ich habe zur Abwechslung mal keine frage über DSP.
Dieses mal habe ich ein Problem mit den Prototyping in Nodejs.

Aus Übersichtsgründen habe ich mich entschieden meine Server-Anwendung Objektorientiert zu Programmiren.
Ich habe 2 Dateien erstellt die main.js und die child.js in der GStremaer gespawnt wird.
main.js:
Code:
var GstreamerPipe = null;

var SampleRate = 96000;
var cmd = 'gst-launch-1.0';
var options = null;
var args = ['audiotestsrc freq=1500', '!', 'audioconvert', '!', 'audio/x-raw, rate='+SampleRate+', channels=1, format=F32LE, signed=true', '!','fdsink fd=1'];

var Gstreamer = require('./requires/child.js');
var GstreamerPipe = new Gstreamer(cmd, args, options);

console.log(GstreamerPipe.GstreamerOutput);

child.js:
Code:
var child = require('child_process');
//constructor
function Gstreamer(cmd, Args, Options){
	this.cmd = cmd;
	this.Args = Args;
	this.Options = Options;
	this.spawn();

}

Gstreamer.prototype.spawn = function(){
	//Spawn the external Programm
	var GstLaunch = child.spawn(this.cmd, this.Args, this.Options);

	//var Receive = function(data){
	//	return data;
	//}
	
	//Error callbacks
	GstLaunch.on('message', Message);
	GstLaunch.stderr.on('data', onSpawnError);
	GstLaunch.on('exit', onSpawnExit);

	//Read from stdout
	GstLaunch.stdout.on('data', this.Receive);

	function Message(msg){;
		 console.log(msg.toString());
	}

	function onSpawnError(data){
		 console.log(data.toString());
	}

	function onSpawnExit(data){
		if(data != null){
		console.error('GStreamer error, exit code ' + data);
		}
	}
	//this.GstreamerOutput = Receive;
	
}

Gstreamer.prototype.Receive = function(data){
this.GstreamerOutput = data;
}

module.exports = Gstreamer;

Receive wird auch von stdout ausgeführt. Als Ausgabe erhalte ich in der main.js immer Undefined oder [Function], je nachdem ob ich mit this.GstreamerOutput oder return arbeite.
Return = [Function], this.GstreamerOutput = undefined.

PS.:Bin noch Neuling was OOP in JavaScript betrifft.

Huch Frage vergessen: Wie komme ich denn nun an die Daten von Receive ran innerhalb von main.js?
PSS.: das console.log steht nur aus Testzwecken in der main.js, eigentlich sollen die Daten der Methode „Receive“ in einen Buffer geschrieben werden.
Danke im Voraus xorg1990
 
Zuletzt bearbeitet von einem Moderator:
Receive wird auch von stdout ausgeführt. Als Ausgabe erhalte ich in der main.js immer Undefined oder [Function], je nachdem ob ich mit this.GstreamerOutput oder return arbeite.
Return = [Function], this.GstreamerOutput = undefined.
das verstehe ich nicht, wo gibst du denn was aus?

Wie komme ich denn nun an die Daten von Receive ran innerhalb von main.js?
entweder reichst du ein callback rein, oder du speicherst die daten in einem array und baust dir eine funktion, welche du aud der main aufrufst und die dir die daten aus dem array ausliest

das console.log steht nur aus Testzwecken in der main.js, eigentlich sollen die Daten der Methode „Receive“ in einen Buffer geschrieben werden.
ich sehe kein console.log in deiner main
 
Ich sehe in deine Code ein paar Probleme:
Code:
GstLaunch.stdout.on('data', this.Receive);
Hier hast du das Problem, dass du die Funktion zwar registrierst, aber der Kontext (also das Objekt, das in this gespeichert ist) geht dabei verloren. Das this im Aufruf der Receive-Funktion ist deswegen dann nicht die Gstreamer-Instanz, sondern Gstlaunch.stdout. Um das zu umgehen kannst du entweder mit einer anonymen Funktion oder mit Function.prototype.bind():
Code:
GstLaunch.stdout.on('data', this.Receive.bind(this));

Dann hast du auch noch das "Problem", dass du nicht auf deine Events wartest. Deswegen kann das console.log() gar nichts liefern. Die ganzen Events des Gstlaunch sind da einfach noch gar nicht angekommen. Du musst also deinen Gstreamer zu einen EventEmitter machen, die Events sozusagen "weiterleiten" und in er main.js auf diese Events deine Funktionalität registrieren.

ich sehe kein console.log in deiner main
Ich schon ;)
 
Also ich verstehe hier mal überhaut nix:(, habe das jetzt mit den bind so eingetippt doch als Ausgabe erhalte ich immer noch [Funktion].

main.js:
Code:
var GstreamerPipe = null;

var SampleRate = 96000;
var cmd = 'gst-launch-1.0';
var options = null;
var args = ['audiotestsrc freq=1500', '!', 'audioconvert', '!', 'audio/x-raw, rate='+SampleRate+', channels=1, format=F32LE, signed=true', '!','fdsink fd=1'];

var Gstreamer = require('./requires/child.js');
var GstreamerPipe = new Gstreamer(cmd, args, options);

console.log(GstreamerPipe.Receive);

child.js:
Code:
var child = require('child_process');
//constructor
function Gstreamer(cmd, Args, Options){
	this.cmd = cmd;
	this.Args = Args;
	this.Options = Options;
	this.spawn();

}

Gstreamer.prototype.spawn = function(){
	//Spawn the external Programm
	var GstLaunch = child.spawn(this.cmd, this.Args, this.Options);

	//var Receive = function(data){
	//	return data;
	//}
	
	//Error callbacks
	GstLaunch.on('message', Message);
	GstLaunch.stderr.on('data', onSpawnError);
	GstLaunch.on('exit', onSpawnExit);

	//Read from stdout
	GstLaunch.stdout.on('data', this.Receive.bind(this));


	function Message(msg){;
		 console.log(msg.toString());
	}

	function onSpawnError(data){
		 console.log(data.toString());
	}

	function onSpawnExit(data){
		if(data != null){
		console.error('GStreamer error, exit code ' + data);
		}
	}
	//this.GstreamerOutput = Receive;
	
}

Gstreamer.prototype.Receive = function(data){
return data;
}

module.exports = Gstreamer;

kkapsner schrieb:
Um das zu umgehen kannst du entweder mit einer anonymen Funktion
Eine anonyme Funktion Receive habe ich auch in der Methode spawn stehen (ist auskommentiert) doch als Ausgabe erhalte ich auch nur [Funktion].

kkapsner schrieb:
Du musst also deinen Gstreamer zu einen EventEmitter machen, die Events sozusagen "weiterleiten" und in er main.js auf diese Events deine Funktionalität registrieren.
What. Hebräisch:confused:. Das ist doch irgendwie doppelt gemoppelt. Stdout.on ist doch schon ein Event.
Ein Event-Emitter würde ich jetzt so machen:
Code:
var events = require('events');
var eventEmitter = new events.EventEmitter();
 
var ringBell = function ringBell()
{
  console.log('ring ring ring');
}
eventEmitter.on('doorOpen', ringBell);
 
eventEmitter.emit('doorOpen');

Dann würde ich die Methode emit() in den stdout Event unterbringen. Das wiederum triggert dann meine Funktion X. Und wie bekomme ich dann den Rückgabewert meiner Funktion x zur main.js?

Beim besten willen, dass habe ich mir einfacher vorgestellt.:abnormal:
 
Also ich verstehe hier mal überhaut nix:(, habe das jetzt mit den bind so eingetippt doch als Ausgabe erhalte ich immer noch [Funktion].
GstreamerPipe.Receive ist ja uch eine funktion, also bringt console.log(GstreamerPipe.Receive); als ausgabe [Funktion]
du musst also entweder deine Receive so bauen, dass sie ein callback ruft,
HTML:
Gstreamer.prototype.Receive = function(data){
    callback(data);
}
oder in Receive die daten speichern, und sie über eine wetere funktion abholen
var data = GstreamerPipe.getReceivedData() oder oder oder, aber ich wiederhole mich
 
Zuletzt bearbeitet von einem Moderator:
Also ich versteh das nicht, da scheinen die entscheidende Zellen in meinem Gehirn zu fehlen.

Ich habe das jetzt so gelöst:
main.js:
Code:
var GstreamerPipe = null;

var SampleRate = 96000;
var cmd = 'gst-launch-1.0';
var options = null;
var args = ['audiotestsrc freq=1500', '!', 'audioconvert', '!', 'audio/x-raw, rate='+SampleRate+', channels=1, format=F32LE, signed=true', '!','fdsink fd=1'];

var Gstreamer = require('./requires/child.js');
var GstreamerPipe = new Gstreamer(cmd, args, options);

var get = GstreamerPipe.Receive();
//console.log(get);
get.on('data', function(data){console.log(data)});

child.js
Code:
var child = require('child_process');
//constructor
function Gstreamer(cmd, Args, Options){
	this.cmd = cmd;
	this.Args = Args;
	this.Options = Options;
	this.GstLaunch = child.spawn(this.cmd, this.Args, this.Options);
	this.spawn();
}

Gstreamer.prototype.spawn = function(){
	
	//Error callbacks
	this.GstLaunch.on('message', Message);
	this.GstLaunch.stderr.on('data', onSpawnError);
	this.GstLaunch.on('exit', onSpawnExit);

	function Message(msg){;
		 console.log(msg.toString());
	}

	function onSpawnError(data){
		 console.log(data.toString());
	}

	function onSpawnExit(data){
		if(data != null){
		console.error('GStreamer error, exit code ' + data);
		}
	}
	
}

Gstreamer.prototype.Receive = function(data){
return this.GstLaunch.stdout;
}

module.exports = Gstreamer;
Damit erhalte ich zumindest eine Ausgabe. Dasselbe mach ich noch mal mit stderr, die spawn Methode dann auch überflüssig.

Es scheint so als sollte ich mir mein Severkonzept noch mal überdenken.
 
Code:
GstreamerPipe.Receive(function(data)
{
  console.log(data);
});

Code:
Gstreamer.prototype.Receive = function(cb)
{
  this.GstLaunch.stdout.on('data', cb);
}
 
Das kann man ja als prototyping Noob unmöglich herausfinden xD. Danke dir hesst das ist genau das was ich wollte.
Kleine Frage am Rande, wo kann man eine Beitrag auf „Gelöst“ stellen?? Ich find’s nirgends.
 
Kleine Frage am Rande, wo kann man eine Beitrag auf „Gelöst“ stellen?? Ich find’s nirgends.
Ersten Beitrag im Thread Bearbeiten -> Erweitert -> oben im Präfix "Gelöst" auswählen -> speichern.
Ich weiß aber nicht, ob Nicht-Mod User da auch dran kommen. Hab es hier schon gesetzt.
 
Zurück
Oben