Чтобы создать сервер Node.js, который транслирует бесконечный звук тишины, переключается на потоковую передачу фактических аудиоданных при получении события, а затем возвращается в тишину после окончания аудиоданных события, выполните следующие действия:
План:
Создание HTTP-сервера: настройка HTTP-сервера для обработки входящих запросов.
Звук бесконечной тишины: бесконечная потоковая передача звука тишины при начале запроса.
Обработка аудиособытий: при получении appEvent.on('audio') начните потоковую передачу аудиоданных.
Возврат к тишине: как только аудиоданные закончатся, вернитесь к потоковой передаче тишины.
Сохранение запроса открытым: убедитесь, что запрос остается открытым, пока клиент подключен.
Моя проблема:
переключение между потоковой передачей файлов не работает
звук тишины всегда бесконечен, воспроизводится хорошо, но speech.mp3 не работает
Как решить проблему переключения между потоками файлов для конвейера в ответ? Эта служба должна работать как радио
import events from 'events'
import express from 'express'
import * as fs from 'fs'
import path from 'path'
import { Readable } from 'stream'
const appEvent = new events.EventEmitter()
const silencePath = path.join(__dirname, 'silence.mp3')
// Helper function to generate silence sound
function silence() {
const buffer = fs.readFileSync(silencePath) // Read file as Buffer
return Readable.from(
(async function* () {
while (true) {
yield buffer // Yield Buffer, not ArrayBuffer
}
})(),
)
}
const app = express()
app.get('/stream', (req, res) => {
// Example: Emit audio event to start streaming audio data
setTimeout(() => {
const speechPath = path.join(__dirname, 'speech.mp3')
const speechStream = fs.createReadStream(speechPath)
appEvent.emit('audio', speechStream)
}, 5000)
res.writeHead(200, {
'Content-Type': 'audio/mpeg',
'Transfer-Encoding': 'chunked',
Connection: 'keep-alive',
})
let silenceStream = silence()
silenceStream.pipe(res)
let audioStream: fs.ReadStream
let audioInProgress = false
// Listen for audio event to switch to the audio stream
appEvent.on('audio', (audioDataStream: fs.ReadStream) => {
if (audioInProgress) return // Ignore if already playing audio
audioInProgress = true
silenceStream.unpipe(res)
audioStream = audioDataStream
audioStream.pipe(res)
// When the audio finishes, return to silence
audioStream.on('end', () => {
silenceStream = silence()
silenceStream.pipe(res)
audioInProgress = false
})
})
req.on('close', () => {
if (audioStream) {
audioStream.unpipe(res)
audioStream.destroy()
}
silenceStream.unpipe(res)
})
})
app.listen(3000, () => console.log(`Client side start on 3000 port http://localhost:3000`))