57

我一直在用 Node.js 中的二进制流进行试验,令我惊讶的是,我确实有一个使用 node-radio-stream 获取 Shoutcast 流并使用分块编码将其推送到 HTML5 元素中的工作演示。但它只适用于 Safari!

这是我的服务器代码:

var radio = require("radio-stream");
var http = require('http');
var url = "http://67.205.85.183:7714";
var stream = radio.createReadStream(url);

var clients = [];

stream.on("connect", function() {
  console.error("Radio Stream connected!");
  console.error(stream.headers);
});


// When a chunk of data is received on the stream, push it to all connected clients
stream.on("data", function (chunk) {
    if (clients.length > 0){
        for (client in clients){
            clients[client].write(chunk);
        };
    }
});

// When a 'metadata' event happens, usually a new song is starting.
stream.on("metadata", function(title) {
  console.error(title);
});

// Listen on a web port and respond with a chunked response header. 
var server = http.createServer(function(req, res){ 
    res.writeHead(200,{
        "Content-Type": "audio/mpeg",
        'Transfer-Encoding': 'chunked'
    });
    // Add the response to the clients array to receive streaming
    clients.push(res);
    console.log('Client connected; streaming'); 
});
server.listen("8000", "127.0.0.1");

console.log('Server running at http://127.0.0.1:8000'); 

我的客户代码很简单:

<audio controls src="http://localhost:8000/"></audio>

这在 Mac 上的 Safari 5 中运行良好,但在 Chrome 或 Firefox 中似乎没有任何作用。有任何想法吗?

可能的候选者包括编码问题,或者只是部分实现的 HTML5 功能......

4

2 回答 2

21

这是 HTML5 Audio 和 Icecast 流的当前状态的(稍微过时的)摘要

如您所见,MP3 源似乎只能在 Safari(可能还有 IE9)中工作。您可能需要尝试一些服务器端转码(使用ffmpegmencoder)到 OGG Vorbis。我很确定当我发送 Vorbis 数据时,我能够让 Chrome 正常运行。

Firefox 仍然是个小子,也许它不喜欢分块编码(所有 SHOUTcast 服务器都以HTTP/1.0尚未定义的版本响应响应Transfer-Encoding: chunked)。尝试使用 OGG 流发送Transfer-Encoding: identity响应头来禁用chunked,Firefox 可能会工作。我没有测试过这个。

让我知道事情的后续!干杯!

于 2010-10-20T17:08:10.027 回答
0

有一些仅适用于 H5 音频直播的解决方案:

  • HLS 或 LLHLS:最佳兼容性,适用于 Safari、Android、iOS。现在有了MSE,Chrome 也可以通过hls.js播放 HLS 。请注意,仅音频流的延迟约为 10 秒或更长。
  • HTTP-MP3:也是被广泛支持的方案,但是由于mp3编解码器使用越来越少,现在aac和opus在H5中比较流行。因此,建议使用 HTTP-MP3。
  • HTTP-AAC:H5浏览器支持,CDN一般不支持,所以自己搭建服务器也可以,如果需要CDN就不行。
  • HTTP-FLV 或 HTTP-TS:使用Flv.jsMSEmpegts.js。延迟低于 HLS,并且可以使用 AAC 编解码器,因此也是一个很好的解决方案。
  • WebRTC:是的,也可以通过 WebRTC 播放纯音频流。

注意:Opus 也可以通过 HTTP-OGG 获得,但是 ogg 并不是所有浏览器都支持,CDN 也不支持,所以推荐。

让我们看一下您的流源,但是您没有提到它:

  • 如果使用 H5 发布您的流,现在只有 WebRTC 可用。
  • 如果使用 IP 摄像头,则必须拉取 RTSP 流,然后通过 FFmpeg 转换为 RTMP,如此。
  • 如果使用 OBS,RTMP 或 SRT 都可以。

因此,最好的解决方案可能是使用服务器(SRS)将您的流转换为播放器:

publisher(WebRTC, OBS, FFmpeg) 
    --RTMP/WebRTC--> Server(SRS) 
        --HLS/HTTP-FLV/WebRTC--> player(H5 audio)
于 2021-12-18T03:51:30.970 回答