我正在使用Kurento Utils与 Kurento 媒体服务器(版本 5.x)进行 WebRTC 连接
在初始化期间的 kurento-utils-js 库内部,简化代码如下所示:
if (!this.pc) {
this.pc = new RTCPeerConnection(server, options);
}
var ended = false;
pc.onicecandidate = function(e) {
// candidate exists in e.candidate
if (e.candidate) {
ended = false;
return;
}
if (ended) {
return;
}
var offerSdp = pc.localDescription.sdp;
console.log('ICE negotiation completed');
self.onsdpoffer(offerSdp, self);
ended = true;
};
Run Code Online (Sandbox Code Playgroud)
我的问题是,它似乎正在等待onicecandidate传递“null”值,这表示该过程已结束,从而能够继续创建 SDP 报价,但我在 WebRTC 规范中找不到这种行为?
我的下一个问题是,我们还能如何知道寻找ice候选人的过程已经结束?
我办公室的一台电脑无法访问该代码console.log('ICE negotiation completed');,因为未传递空值。
我正在尝试在 Chrome 上的 Android 和 Web 应用程序之间进行电话会议。当 Android 将优惠发送到 Web 应用程序时,我在 Chrome 控制台上收到以下错误:
无法构造“RTCSessionDescription”:参数 1(“descriptionInitDict”)不是对象。
这是屏幕截图:
在 Android 上,我有这样的代码:
PeerConnectionFactory.initializeAndroidGlobals(listener, true, true,
true, mEGLcontext);
Run Code Online (Sandbox Code Playgroud)
这就是我创建对等连接对象的方式:
this.pc = factory.createPeerConnection(RTCConfig.getIceServer(), RTCConfig.getMediaConstraints(), this);
Run Code Online (Sandbox Code Playgroud)
RTCConfig.getMediaConstraints() 函数定义如下:
public static MediaConstraints getMediaConstraints(){
// Initialize PeerConnection
MediaConstraints pcMediaConstraints = new MediaConstraints();
pcMediaConstraints.optional.add(new MediaConstraints.KeyValuePair(
"DtlsSrtpKeyAgreement", "true"));
pcMediaConstraints.mandatory.add(new MediaConstraints.KeyValuePair(
"OfferToReceiveAudio", "true"));
pcMediaConstraints.mandatory.add(new MediaConstraints.KeyValuePair(
"OfferToReceiveVideo", "true"));
return pcMediaConstraints;
}
Run Code Online (Sandbox Code Playgroud)
RTCConfig.getICEServer() 函数定义为:
public static LinkedList<PeerConnection.IceServer> getIceServer(){
// Initialize ICE server list
LinkedList<PeerConnection.IceServer> iceServers = new LinkedList<PeerConnection.IceServer>();
iceServers.add(new PeerConnection.IceServer("stun:stun.l.google.com:19302"));
return iceServers;
} …Run Code Online (Sandbox Code Playgroud) 我正在编写一个简单的聊天应用程序,我想向我的应用程序添加一个共享绘图画布,该应用程序使用数据通道在它们之间发送画布点。但它是一个可选规范,因此我不想每次打开聊天时都打开数据通道。如果我在建立对等连接后(提供后)打开数据通道,我将无法通过数据通道发送任何数据。否则我可以发送(我从这里得到这一点: https: //stackoverflow.com/a/35141500/5663292)。那么为什么我必须在提供对等连接之前打开数据通道?
我想将通过 getusermedia() 获得的音频流添加到画布流中,并将其发送到远程对等点...于是我抬头一看,有 addTrack()。但addTrack()似乎不能正常工作。我在 chrome 上运行。
var audioTracks;
navigator.getUserMedia({ "audio": true, "video": false }, function (stream)
{
audioTracks = stream.getAudioTracks()[0];
}, function(error) { console.log(error);});
.
.
.
var sharestream = canvas2.captureStream(25); // 25 FPS
peerConn.addTrack(audioTracks,sharestream);
peerConn.addStream(sharestream);
Run Code Online (Sandbox Code Playgroud)
这是我的代码的一部分。怎么了?我的webrtc完整源代码工作正常,但它不能与addTrack()一起工作。
我试图检测 RTCPeerConnection 的另一端何时断开连接。目前我正在使用我的 RTCPeerConnection 对象执行以下操作:
rtcPeerConnection.oniceconnectionstatechange = () => {
const state = rtcPeerConnection.iceConnectionState;
if (state === "failed" || state === "closed") {
// connection to the peer is lost and unsalvageable, run cleanup code
} else if (state === "disconnected") {
// do nothing in the "disconnected" state as it appears to be a transient
// state that can easily return to "connected" - I've seen this with Firefox
}
};
Run Code Online (Sandbox Code Playgroud)
这似乎适用于我在非常简单的网络条件下进行的有限测试,但来自MDN的以下内容让我暂停,它可能不会在生产中保持不变:
当然,“断开”和“关闭”并不一定表示错误;这些可能是正常 ICE 协商的结果,所以一定要正确处理这些(如果有的话)。
RTCPeerConnection.onconnectionstatechange如果 …
我无法让我的 WebRTC 代码正常工作..我相信我做的一切都是正确的,但它仍然无法正常工作。有一些奇怪的为什么 ontrack 这么早就被调用了,也许它应该是这样的。
该网站使用 javascript 代码,服务器代码我没有发布,但这就是 WebSockets 连接的地方只是一个交换器,您发送到服务器的内容将相同的信息发送回您也连接的其他合作伙伴(陌生人)。
服务器代码看起来像这个小示例
private void writeStranger(UserProfile you, String msg) {
UserProfile stranger = you.stranger;
if(stranger != null)
sendMessage(stranger.getWebSocket(), msg);
}
public void sendMessage(WebSocket websocket, String msg) {
try {
websocket.send(msg);
} catch ( WebsocketNotConnectedException e ) {
disconnnectClient(websocket);
}
}
//...
case "ice_candidate":
JSONObject candidatePackage = (JSONObject) packet.get(1);
JSONObject candidate = (JSONObject) candidatePackage.get("candidate");
obj = new JSONObject();
list = new JSONArray();
list.put("iceCandidate");
obj.put("candidate", candidate);
list.put(obj);
System.out.println("Sent = " + list.toString());
writeStranger(you, list.toString()); …Run Code Online (Sandbox Code Playgroud) javascript html5-video webrtc getusermedia rtcpeerconnection
TL;DR如何运行使用navigator.mediaDevicesTestCafe 和 Chromium 及其方法的功能测试?
我正在尝试使用 TestCafe 编写功能测试来测试一些 WebRTC 代码。我正在使用反应。我有一个枚举设备的自定义钩子:
function useUpdateDeviceList() {
const dispatch = useDispatch();
useEffect(() => {
async function updateDeviceList() {
const { audioInputs, videoInputs } = await getInputDeviceInfos();
dispatch(setAudioInputs(audioInputs));
dispatch(setVideoInputs(videoInputs));
}
updateDeviceList();
console.log('navigator', navigator);
navigator.mediaDevices.ondevicechange = updateDeviceList;
return () => {
navigator.mediaDevices.ondevicechange = null;
};
}, [dispatch]);
}
Run Code Online (Sandbox Code Playgroud)
哪里getInputDeviceInfos调用navigator.mediaDevices.enumerateDevices。
当我在浏览器中运行此代码时,它可以完美运行。当它在 TestCafe 的功能测试中运行时,它抛出。
TypeError: Cannot set property 'ondevicechange' of undefined
Run Code Online (Sandbox Code Playgroud)
彻底的谷歌搜索只给出了添加标志--use-fake-ui-for-media-stream和--use-fake-device-for-media-stream启动命令的答案(前者避免了授予摄像头/麦克风权限的需要,并且梯形图getUserMedia()根据文档提供测试模式而不是实时摄像头输入),其中我做了:
TypeError: Cannot …Run Code Online (Sandbox Code Playgroud) 我正在检查Pion Mediadevices并尝试从我的 Windows 计算机交叉编译 webrtc 示例以获得 rasperry pi 零。但是,当我尝试构建示例时,我从 Windows 命令提示符处收到这些错误:
# github.com/pion/mediadevices/pkg/codec/mmal
..\..\pkg\codec\mmal\params.go:30:9: undefined: newEncoder
# github.com/pion/mediadevices/pkg/driver/microphone
..\..\pkg\driver\microphone\microphone.go:27:10: undefined: malgo.AllocatedContext
..\..\pkg\driver\microphone\microphone.go:34:2: undefined: malgo.DeviceInfo
..\..\pkg\driver\microphone\microphone.go:40:13: undefined: malgo.InitContext
..\..\pkg\driver\microphone\microphone.go:40:36: undefined: malgo.ContextConfig
..\..\pkg\driver\microphone\microphone.go:78:25: undefined: malgo.DeviceInfo
Run Code Online (Sandbox Code Playgroud)
也因为该程序是针对 pi 零的,我将导入部分编辑为具有“github.com/pion/mediadevices/pkg/codec/mmal”并注释掉了 x264 导入。构建此示例的正确方法是什么?
编辑:经过进一步调查,我发现上面的错误消息:
..\..\pkg\codec\mmal\params.go:30:9: undefined: newEncoder
Run Code Online (Sandbox Code Playgroud)
与对函数 newEncoder 的调用相关,该函数在单独的 go 文件 mmal.go 中声明,与 params.go 位于同一文件夹中。这两个文件package mmal在导入之前都位于顶部,它们所在的文件夹也称为 mmal。是否有任何问题导致 params.go 无法查看该函数?
我目前正在探索 webRTC,我想要做的是获取所有 mediadevices 信息以及 deviceId 使用navigator.mediaDevices.enumerateDevices();,然后根据其种类属性将其分开,并允许用户选择用于特定种类的媒体设备。就像显示找到的摄像机下拉列表并允许用户选择要使用的摄像机,这就是为什么我需要每个设备的 deviceId。
这是我目前用于获取媒体设备的代码:
const getConnectedDevices = async (type, callback) => {
const mediaDevices = await navigator.mediaDevices.enumerateDevices();
console.log(mediaDevices);
callback(mediaDevices.filter((device) => device.kind === type));
};
Run Code Online (Sandbox Code Playgroud)
这就是我作为输出返回的内容:
[
{
deviceId: ""
groupId: "51081772b5c5df2dbcb2ca2b8ae36c5d693d816f8d4bf4039cdb15802b7ffc54"
kind: "audioinput"
label: ""
},
{
deviceId: ""
groupId: "2e7a46f912e66fea3b6af4822e427c02a7725c39d86194dccdf5b7993293d7da"
kind: "videoinput"
label: ""
},
{
deviceId: ""
groupId: "51081772b5c5df2dbcb2ca2b8ae36c5d693d816f8d4bf4039cdb15802b7ffc54"
kind: "audiooutput"
label: ""
}
]
Run Code Online (Sandbox Code Playgroud)
一直得到一个空的 deviceId。我await navigator.mediaDevices.getUserMedia( {video: true,audio: true,})之前也尝试过打电话,await navigator.mediaDevices.enumerateDevices()但仍然得到相同的结果。
我已经在我的应用程序中实现了 agora 语音通话。它在旧设备和标签上工作正常,但在锁定屏幕 1 分钟后在新设备上接收器听不到音频。我猜安卓系统会将应用程序置于睡眠模式。
我曾尝试使用 WAKE_LOCK 使应用程序保持活动状态,但没有成功。任何人都可以帮助我吗?我需要做什么?
谢谢。
webrtc ×10
javascript ×3
android ×2
agora.io ×1
c ×1
chromium ×1
getusermedia ×1
go ×1
html5-video ×1
ios ×1
java ×1
kurento ×1
mediadevices ×1
sleep-mode ×1
swift ×1
testcafe ×1