Chrome "stalling" 仅当从 nodejs windows 流式传输 mp3 文件时

Chrome "stalling" when streaming mp3 file from nodejs windows only

我们在尝试发送 mp3 数据时遇到了一个非常烦人的错误。我们已经进行了以下设置。

生成 aac 的网络摄像头 -> ffmpeg 转换为 adts -> 发送到 nodejs 服务器 -> 服务器上的 ffmpeg 将 adts 转换为 mp3 -> mp3 然后流式传输到浏览器。

这在 Linux(chrome 与 HTML5 和 flash,仅 firefox flash 上完美运行"

然而在 windows 上声音只是 "stalls",无论我们使用什么组合 (browser/html5/flash)。然而,如果我们关闭服务器,声音会立即开始播放。

出于某种原因,在基于 windows 的机器上,声音好像正在被缓冲 "waiting",但我们不知道那是什么。

如有任何帮助,我们将不胜感激。

节点中的相关代码

    res.setHeader('Connection', 'Transfer-Encoding');
    res.setHeader('Content-Type', 'audio/mpeg');
    res.setHeader('Transfer-Encoding', 'chunked');
    res.writeHeader('206');

    that.eventEmitter.on('soundData', function (data) {
        debug("Got sound data" + data.cameraId + " " + req.params.camera_id);
        if (req.params.camera_id == data.cameraId) {
            debug("Sending data direct to browser");
            res.write(data.sound);
        }
    });

浏览器上的代码

       soundManager.setup({
                            url: 'http://dashboard.agricamera.co.uk/themes/agricamv2/swf/soundmanager2.swf',
                            useHTML5Audio: false,
                            onready: function () {
                                that.log("Sound manager is now ready")
                                var mySound = soundManager.createSound({
                                    url: src,
                                    autoLoad: true,
                                    autoPlay: true,
                                    stream: true,
                                });
                            }
                        });

If however we shutdown the server the sound then immediately starts to play as we expect.

For some reason on windows based machines it's as if the sound is being buffered "waiting" for something but we don't know what that is.

这正是正在发生的事情。

首先,chrome 可以播放 ADTS 流,所以如果可能的话,直接使用它,不必在链中使用第二个有损编解码器,从而为自己节省一些音频质量。

接下来,不要使用 soundManager,或者至少让它使用 HTML5 音频。现在大多数情况下你不需要 Flash 后备,Chrome 完全可以播放你的流媒体。我怀疑这就是你的问题所在。

接下来,尝试禁用分块传输。许多客户不喜欢流上的传输编码。

最后,我看到 Chrome 的内置媒体处理(我认为从 OS 到 OS 不等)无法同步到流的情况。 Chromium 有一些错误票。如果您的播放计时器没有增加,这可能是您的问题,您可以简单地尝试以编程方式重新加载流来解决它。