summaryrefslogtreecommitdiff
path: root/ffmpegServer.js
blob: 0ab0e6aa03ae63622c0537c22fbe9754951eab8e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
const child_process = require('child_process');
const WebSocketServer = require('ws').Server;
const http = require('http');

const server = http.createServer().listen(4000, () => {
  console.log('Listening...');
});

const wss = new WebSocketServer({
	server: server
});


const rtmpUrl = "rtmp://a.rtmp.youtube.com/live2/MyKey";

wss.on('connection', function connection(ws, req) {
	console.log('connection');

	let auth;

	if ( !(auth = req.url.match(/^\/auth\/(.*)$/)) ) {
		ws.terminate();
		return;
	}

	if(auth[1] !== "mZFZN4yc"){
		ws.terminate();
		return;
	}

	const ffmpeg = child_process.spawn('ffmpeg', [

		// FFmpeg will read input video from STDIN
    	'-i', '-',

    	// Chromium doesn't support H.264, set the video codec to 'libx264'
	    // or similar to transcode it to H.264 here on the server.
	    '-vcodec', 'libx264',

	    //No browser currently supports encoding AAC, so we must transcode the audio to AAC here on the server.
	    '-acodec', 'aac',
	    
	    // FLV is the container format used in conjunction with RTMP
	    '-f', 'flv',

	    '-max_muxing_queue_size', '99999',

	    //'-vf', 'mpdecimate', '-vsync', 'vfr',
	    //'-vf', 'mpdecimate,setpts=N/FRAME_RATE/TB',
	    
	    // The output RTMP URL.
	    // For debugging, you could set this to a filename like 'test.flv', and play
	    // the resulting file with VLC.
	    rtmpUrl 
	])

	// If FFmpeg stops for any reason, close the WebSocket connection.
	ffmpeg.on('close', (code, signal) => {
		console.log('FFmpeg child process closed, code ' + code + ', signal ' + signal);
		ws.terminate();
	});

	ffmpeg.stdin.on('error', (e) => {
		console.log('FFmpeg STDIN Error', e);
	});

	ffmpeg.stderr.on('data', (data) => {
    	console.log('FFmpeg STDERR:', data.toString());
    });

    // When data comes in from the WebSocket, write it to FFmpeg's STDIN.
	ws.on('message', (msg) => {
	    console.log('DATA', msg);
	    ffmpeg.stdin.write(msg);
	});

	// If the client disconnects, stop FFmpeg.
	ws.on('close', (e) => {
    	ffmpeg.kill('SIGINT');
    	ws.terminate();
	});

});