LINUX.ORG.RU

Как раздавать аудио поток?

 


0

3

Привет, All!

можно ли поток (аудио) передаваемый через BinaryJS «раздавать» сторонним слушателям?

никак не могу понять как это сделать

в идеале должен быть урл куда можно подключиться и прослушать содержимое потока

Спасибо



Последнее исправление: CYB3R (всего исправлений: 1)

Ответ на: комментарий от bugreport

спасибо, но не совсем то

вопрос не как слушать,

а как отдавать с веб-сервера (nodeJS)

ravend
() автор топика

У нас на работе инет ваще никакой. А музон послушать хочется почти всем.
Ну я накидал треков в директорию. Поднял хост и шутканул на пых-пыхе. Теперь весь офис слушает. Тут главное принцип. Перенесёшь кароче:

<?php


$speed = 20; // kbps
$path = realpath('../../Downloads/music') . '/';


if (!array_key_exists('HTTP_ICY_METADATA', $_SERVER)) {
    exit('You must open this ULR with audio player!');
}

header('ICY 200 OK');
header('Icy-Notice2: Stream server via PHP v-0.1-prealpha');
header('Icy-Name: Local radio');
header('Icy-Genre: misc');
header('Icy-Url: ' . $_SERVER['HTTP_HOST']);
header('Icy-Pub: 0');

set_time_limit(0);
$chunkSize = $speed * 1024 * 8;
$tracks = glob($path . '*.mp3');
if (!$tracks) {
    $tracks = array();
}

while (1) {
    // shuffle all tracks
    shuffle($tracks);
    // each track by track
    foreach ($tracks as $track) {
        $fp = @ fopen($track, 'rb');
        if ($fp) {
            // play (streaming) track
            while (1) {
                $data = fread($fp, $chunkSize);
                print $data;
                flush();
                if (strlen($data) < $chunkSize) {
                    break;
                } else {
                    sleep(1);
                }
            }
        }
    }
}
Главное принять/отправить нужные заголовки. Плеер сам отловит.

deep-purple ★★★★★
()
Ответ на: комментарий от bihunger

Оно не?

Не оно. Ибо ты отвалил файло как можно скорее клиенту и подох. А тут надо почуть сливать поток «типа риалтайм».

deep-purple ★★★★★
()

Может быть так?
Сервер

var BinaryServer = require('binaryjs').BinaryServer;
var fs = require('fs');
// Start Binary.js server
var server = BinaryServer({port: 9000});
// Wait for new user connections
server.on('connection', function(client){
// Stream a flower as a hello!
  var file = fs.createReadStream(__dirname + '/test.mp3');
  client.send(file);
});
Клиент
<!DOCTYPE html>
<html>
<head>
  <title>Test Page</title>
  <script src="http://cdn.binaryjs.com/0/binary.js"></script>
  <script>
    // Connect to Binary.js server
    var client = new BinaryClient('ws://localhost:9000');
    // Received new stream from server!
    client.on('stream', function(stream, meta){
      // Buffer for parts
      var parts = [];
      // Got new data
      stream.on('data', function(data){
        parts.push(data);
      });
      stream.on('end', function(){
        // Display new data in browser!
        var audio = document.getElementById("test1")
        audio.src = (window.URL || window.webkitURL).createObjectURL(new Blob(parts));
        //document.body.appendChild(audio);
      });
    });
  </script>
</head>

<body>
<audio id="test1" autoplay="autoplay" controls="controls">Test</audio>
</body>
</html>

bihunger
()

Ребята, спасибо за дискуссию

нашел подходящее решение:

https://github.com/gabrielpoca/browser-pcm-stream

вариант похож на предложенный «bihunger» Как раздавать аудио поток? (комментарий)

суть приложения

- читаем с микрофона

- пишем потоком в wav файл на сервер

- файл можно читать в реалтайме

но опять не то, хотелось отдавать именно поток, т.к. если читать файл то мы услышим начало записи, а не текущий монолог

ravend
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.