eldiyar_321
@eldiyar_321
Программист САМОУЧКА Fullstack developer

Как сделать переключение между потоком файлов для http стриминга?

Чтобы создать сервер 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`))
  • Вопрос задан
  • 189 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы