forked from LeWarpy/opusify
-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.js
74 lines (62 loc) · 1.75 KB
/
app.js
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
const express = require('express');
const app = express();
const { spawn } = require('child_process');
const PORT = 8080;
// Flux audio à transcoder
const audioStreams = [
{ name: 'franceinfo', url: 'http://icecast.radiofrance.fr/franceinfo-hifi.aac' },
{ name: 'NRJ', url: 'http://cdn.nrjaudio.fm/adwz2/fr/30001/mp3_128.mp3' },
//
];
app.get('/opus-stream/:streamIndex', (req, res) => {
const streamIndex = req.params.streamIndex;
if (streamIndex < 0 || streamIndex >= audioStreams.length) {
return res.status(404).send('Stream not found');
}
const audioStream = audioStreams[streamIndex];
res.set({
'Content-Type': 'audio/ogg',
'Transfer-Encoding': 'chunked',
'Cache-Control': 'no-cache',
});
// Arguments FFMPEG transcodage AAC vers OPUS
const ffmpeg = spawn('ffmpeg', [
'-i',
audioStream.url,
'-c:a',
'libopus',
'-ar',
'48000',
'-ac',
'2',
'-f',
'ogg',
'-',
]);
// Pipe sortie FFMPEG à la réponse client
ffmpeg.stdout.pipe(res);
// Erreur
ffmpeg.on('error', (error) => {
console.error('Erreur lors de l\'exécution de ffmpeg :', error);
res.status(500).send('Erreur interne du serveur');
});
ffmpeg.on('exit', (code, signal) => {
console.log(`Le processus ffmpeg s'est terminé avec le code ${code} et le signal ${signal}`);
});
// Nettoyage
res.on('close', () => {
ffmpeg.kill();
});
});
// Route pour obtenir la liste des flux audio disponibles
app.get('/audio-streams', (req, res) => {
const streamList = audioStreams.map((stream, index) => ({
name: stream.name,
url: `/opus-stream/${index}`,
}));
res.json(streamList);
});
// Liftoff
app.listen(PORT, () => {
console.log(`Le serveur est en cours d'exécution sur le port ${PORT}`);
});