如何解决PeerJS 不返回远程流
我用 PeerJS 做 android webRTC。 在本地流显示、发送和接收呼叫响应方面一切正常。
但很少有成功的连接。 大多数结果在远程显示器上是空白的(两个用户)。 我没有从 logcat 收到任何错误,也没有收到连接成功的原因。 这就是为什么我不知道如何解决这个问题。
请给一些建议。
//Kotlin 活动//
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_call)
first = true
type = intent.getIntExtra("type",-1)
qUID = intent.getStringExtra("qUID")
setupWebView()
}
fun onPeerConnected() {
isPeerConnected = true
listenForConnId()
}
private fun setupWebView() {
webView.webChromeClient = object: WebChromeClient() {
override fun onPermissionRequest(request: PermissionRequest?) {
request?.grant(request.resources)
}
override fun onConsoleMessage(message: ConsoleMessage): Boolean {
Log.e("PeerJS","${message.message()} >> From line:" +
"${message.lineNumber()} /// ID:${message.sourceId()}")
return true
}
}
webView.settings.javaScriptEnabled = true
webView.settings.mediaPlaybackRequiresUserGesture = false
webView.addJavascriptInterface(JavascriptInterface(this),"Android")
loadVideoCall()
}
private fun loadVideoCall() {
val filePath = "file:android_asset/call.html"
webView.loadUrl(filePath)
webView.webViewClient = object: WebViewClient() {
override fun onPageFinished(view: WebView?,url: String?) {
if (first) {
callJavascriptFunction("javascript:init(\"${cUID}\")")
if (type == 1 && first) {
RDB.child("Users")
.child(qUID!!)
.child("incoming")
.setValue(cUID)
}
first = false
}
}
}
}
private fun listenForConnId() {
if (type == 0) {
RDB.child("Users").child(cUID).child("incoming")
.addValueEventListener(object : ValueEventListener {
override fun onCancelled(error: DatabaseError) {}
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.value != null && isPeerConnected) {
callJavascriptFunction("javascript:startCall(\"${snapshot.value.toString()}\")")
} else {
finish()
}
}
})
}
if (type == 1) {
RDB.child("Users").child(qUID!!).child("incoming")
.addValueEventListener(object : ValueEventListener {
override fun onCancelled(error: DatabaseError) {}
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.value != null && isPeerConnected) {
callJavascriptFunction("javascript:listen()")
}
if (snapshot.value == null) {
finish()
}
}
})
}
}
private fun callJavascriptFunction(functionString: String) {
webView.post { webView.evaluateJavascript(functionString,null) }
}
//javascript call.js//
let localVideo = document.getElementById("local-video")
let remoteVideo = document.getElementById("remote-video")
localVideo.style.opacity = 0
remoteVideo.style.opacity = 0
localVideo.onplaying = () => { localVideo.style.opacity = 1 }
remoteVideo.onplaying = () => { remoteVideo.style.opacity = 1 }
let peer
function init(userId) {
// peer = new Peer(userId) **<<<get same result with default method**
peer = new Peer(userId,{ 'iceServers': [
{ 'urls': 'stun:stun.l.google.com:19302' },{ url: 'turn:homeo@turn.bistri.com:80',credential: 'homeo' },{
url: 'turn:numb.viagenie.ca',credential: 'muazkh',username: 'webrtc@live.com'
},{
url: 'turn:192.158.29.39:3478?transport=udp',credential: 'JZEOEt2V3Qb0y27GRntt2u2PAYA=',username: '28224511:1379330808'
},{
url: 'turn:192.158.29.39:3478?transport=tcp',{
url: 'turn:turn.bistri.com:80',credential: 'homeo',username: 'homeo'
},{
url: 'turn:turn.anyfirewall.com:443?transport=tcp',credential: 'webrtc',username: 'webrtc'
}
],'sdpSemantics': 'unified-plan'
})
peer.on('open',() => {
Android.onPeerConnected()
navigator.getUserMedia({
audio: true,video: true
},(stream) => {
localVideo.srcObject = stream
localStream = stream
localVideo.className = "secondary-video"
},(err) => {
console.error('PeerJS > Failed : peer.on open > navigator.getUserMedia',err);
})
},(err) => {
console.error('PeerJS > Failed : peer.on open',err);
})
peer.on('error',function(err) {
console.error('PeerJS > error : function(err)',err);
});
}
let localStream
function listen() {
peer.on('call',(call) => {
navigator.getUserMedia({
audio: true,(stream) => {
localVideo.srcObject = stream
localStream = stream
call.answer(stream)
call.on('stream',(remoteStream) => {
remoteVideo.srcObject = remoteStream
remoteVideo.className = "primary-video"
localVideo.className = "secondary-video"
},(err) => {
console.error('PeerJS > Failed : peer.on call > call.on stream',err);
})
},(err) => {
console.error('PeerJS > Failed : peer.on call > navigator.getUserMedia',(err) => {
console.error('PeerJS > Failed : peer.on call',err);
})
}
function startCall(otherUserId) {
navigator.getUserMedia({
audio: true,video: true
},(stream) => {
localVideo.srcObject = stream
localStream = stream
const call = peer.call(otherUserId,stream)
call.on('stream',(remoteStream) => {
remoteVideo.srcObject = remoteStream
remoteVideo.className = "primary-video"
localVideo.className = "secondary-video"
},(err) => {
console.error('PeerJS > Failed : startCall > navigator.getUserMedia > call.on stream',(err) => {
console.error('PeerJS > Failed : startCall > navigator.getUserMedia',err);
})
}
function toggleVideo(b) {
if (b == "true") {
localStream.getVideoTracks()[0].enabled = true
} else {
localStream.getVideoTracks()[0].enabled = false
}
}
function toggleAudio(b) {
if (b == "true") {
localStream.getAudioTracks()[0].enabled = true
} else {
localStream.getAudioTracks()[0].enabled = false
}
}
function getUserID() {
return peer.id
}
function disconnect() {
peer.disconnect()
peer.destroy()
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。