dmc1989
@dmc1989

Как работать с rtmp в Node.js?

Делаю запись десктопа через ffmpeg: ffmpeg -f gdigrab -framerate 25 -i desktop out.mpg
Потом стримлю файл: ffmpeg -re -i output.flv -c copy -f flv rtmp://localhost/live/STREAM_NAMEffmpeg -re -i output.flv -c:v libx264 -preset superfast -tune zerolatency -c:a aac -ar 44100 -f flv rtmp://localhost/live/STREAM_NAME
И через сервер отдаю на страницу:
const { NodeMediaServer } = require('node-media-server')

const config = {
  rtmp: {
    port: 1935,
    chunk_size: 60000,
    gop_cache: true,
    ping: 60,
    ping_timeout: 30
  },
  http: {
    port: PORT,
    allow_origin: '*'
  }
}

var nmcs = new NodeMediaServer(config)
nmcs.run()

На клиенте так принимаю:
<script src="https://cdn.bootcss.com/flv.js/1.5.0/flv.min.js"></script>
<video id="videoElement" allow="autoplay"></video>
  <script>
      if (flvjs.isSupported()) {
          var videoElement = document.getElementById('videoElement');
          var flvPlayer = flvjs.createPlayer({
              type: 'flv',
              url: 'ws://localhost:3443/live/STREAM_NAME.flv'
          });
          flvPlayer.attachMediaElement(videoElement);
          flvPlayer.load();
          flvPlayer.play();
      }
  </script>

Но получаю просто картинку с начала стрима, причем в плохом качестве.
Как правильно делать такие штуки? Искал модули, но такого, чтобы можно было просто подключится к rtmp и использовать express server не нашел. Где можно почитать о том, как правильно делать такие штуки? Есть ли модули чтобы контролировать трансляцию, например: включил захват в оперативку, потом трансляцию, а затем через сервер подключился, и по мере поступления передавал через socket.io?
Можно ли делать такие конструкции?:
const express = require('express')
const http = require('http')
const socketIo = require('socket.io')
const ffmpeg = require('fluent-ffmpeg')

const app = express()
const server = http.createServer(app)
const io = socketIo(server, {})

const PORT = process.env.PORT || 3443

const write_command = ffmpeg.startRecord()
const stream_command = ffmpeg.startStreaming()

rtmp.connect('localhost/live/STREAM_NAME')

io.on('connection', socket => {
  rtmp.on('data', data => {
    socket.broadcast.emit('stream', data)
  })
})

server.listen(PORT, () => {
  console.log(`Server work on port: ${PORT}`)
})
  • Вопрос задан
  • 735 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы