在尝试发送mp3数据时,我们遇到了一个非常烦人的错误。我们有以下设置。
生成aac的网络摄像头 - > ffmpeg转换为adts - >发送到nodejs服务器 - >服务器上的ffmpeg将adts转换为mp3 - > mp3然后流式传输到浏览器。
这完全适用于Linux(Chrome与HTML5和闪存,仅限firefox flash)
然而,在Windows上,无论我们使用什么组合(浏览器/ html5 / flash),声音都会“停滞”。然而,如果我们关闭服务器声音,那么就会立即开始播放。
出于某种原因,在基于Windows的机器上,就好像声音正在缓冲“等待”某些东西,但我们不知道那是什么。
非常感谢任何帮助。
节点
中的相关代码 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,
});
}
});
答案 0 :(得分:1)
但是,如果我们关闭服务器声音,那么就会立即开始播放。
出于某些原因,在基于Windows的机器上,它好像声音被缓冲了#34;等待"对于某些事情,但我们不知道那是什么。
这正是发生的事情。
首先,chrome可以播放ADTS流,所以如果可能的话,只需直接使用它就可以通过不必在链中使用第二个有损编解码器来节省一些音频质量。
接下来,不要使用soundManager,或者至少让它使用HTML5音频。在大多数情况下,您现在不需要Flash后备,而Chrome完全有能力播放您的视频流。我怀疑这是你的问题所在。
接下来,尝试禁用分块传输。许多客户不喜欢在流上传输编码。
最后,我看到过Chrome浏览器的内置媒体处理(我认为从操作系统到操作系统不同)无法同步到流的情况。 Chromium有一些错误票。如果你的播放计时器没有递增,这可能是你的问题,你可以简单地尝试以编程方式重新加载流来解决它。