这是我的用例:Alice 有一个很酷的新媒体曲目,她想让 Bob 收听。她在浏览器中选择媒体文件,媒体文件立即在 Bob 的浏览器中开始播放。
我什至不确定现在是否可以使用 WebRTC API 构建。我可以找到的所有示例都使用通过 getUserMedia() 获得的流,但这就是我所拥有的:
var context = new AudioContext();
var pc = new RTCPeerConnection(pc_config);
function handleFileSelect(event) {
var file = event.target.files[0];
if (file) {
if (file.type.match('audio*')) {
console.log(file.name);
var reader = new FileReader();
reader.onload = (function(readEvent) {
context.decodeAudioData(readEvent.target.result, function(buffer) {
var source = context.createBufferSource();
var destination = context.createMediaStreamDestination();
source.buffer = buffer;
source.start(0);
source.connect(destination);
pc.addStream(destination.stream);
pc.createOffer(setLocalAndSendMessage);
});
});
reader.readAsArrayBuffer(file);
}
}
}
在接收方,我有以下内容:
function gotRemoteStream(event) {
var mediaStreamSource = context.createMediaStreamSource(event.stream);
mediaStreamSource.connect(context.destination);
}
此代码不会使媒体(音乐)在接收端播放。然而,在 WebRTC 握手完成并调用gotRemoteStream函数后,我确实收到了一个结束的事件。gotRemoteStream函数被调用,媒体没有开始播放。
在 Alice 方面,魔法应该发生在source.connect(destination)行中。当我用source.connect(context.destination)替换该行时,媒体开始通过 Alice 的扬声器正确播放。
在 Bob 方面,基于 Alice 的流创建了一个媒体流源。但是,当使用mediaStreamSource.connect(context.destination)连接本地扬声器时,音乐不会开始通过扬声器播放。
当然,我总是可以通过 DataChannel 发送媒体文件,但其中的乐趣在哪里......
任何关于我的代码有什么问题的线索或关于如何实现我的用例的一些想法将不胜感激!
我正在使用最新最好的 Chrome Canary。
谢谢。