javascript - 如何切换相机 webrtc Android
问题描述
因此,我正在使用 webrtc 构建一个 android 视频通话应用程序,我已经实现了所有东西,并从我的应用程序中测试了视频通话功能,它就像魅力一样。但是现在我想实现用户可以将相机从后部切换到前部的位置,反之亦然。我看到了一个类似的答案,它不是针对 android 的,它说要删除流并协商和新流我没有正确理解如何在这段代码中实现它,所以我希望有人可以帮助我解决这个问题谢谢
JavaScript 文件
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, {
host: 'messenger-by-margs-video-call.herokuapp.com',
secure: true
})
peer.on('open', () => {
Android.onPeerConnected()
})
listen()
}
let localStream
function listen() {
peer.on('call', (call) => {
navigator.getUserMedia({
audio: true,
video: 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"
})
})
})
}
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"
})
})
}
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
}
}
这是我的 kotlin 活动文件。
class CallActivity : AppCompatActivity() {
var username = ""
var friendsUsername = ""
var isPeerConnected = false
var firebaseRef = FirebaseDatabase.getInstance().getReference("Users")
var isAudio = true
var isVideo = true
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_video_call)
username = FirebaseAuth.getInstance().uid.toString();
friendsUsername = intent.getStringExtra("userid")!!
call.setOnClickListener {
sendCallRequest()
}
toggleAudioBtn.setOnClickListener {
isAudio = !isAudio
callJavascriptFunction("javascript:toggleAudio(\"${isAudio}\")")
toggleAudioBtn.setImageResource(if (isAudio) R.drawable.ic_baseline_mic_24 else R.drawable.ic_baseline_mic_off_24 )
}
toggleVideoBtn.setOnClickListener {
isVideo = !isVideo
callJavascriptFunction("javascript:toggleVideo(\"${isVideo}\")")
toggleVideoBtn.setImageResource(if (isVideo) R.drawable.ic_baseline_videocam_24 else R.drawable.ic_baseline_videocam_off_24 )
}
setupWebView()
}
private fun sendCallRequest() {
if (!isPeerConnected) {
Toast.makeText(this, "You're not connected. Check your internet", Toast.LENGTH_LONG).show()
return
}
firebaseRef.child(friendsUsername).child("videocall").child("incall").setValue(username)
firebaseRef.child(friendsUsername).child("videocall").child("isAvailable").addValueEventListener(object: ValueEventListener {
override fun onCancelled(error: DatabaseError) {}
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.value.toString() == "true") {
listenForConnId()
}
}
})
}
private fun listenForConnId() {
firebaseRef.child(friendsUsername).child("videocall").child("connId").addValueEventListener(object: ValueEventListener {
override fun onCancelled(error: DatabaseError) {}
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.value == null)
return
switchToControls()
callJavascriptFunction("javascript:startCall(\"${snapshot.value}\")")
}
})
}
@SuppressLint("SetJavaScriptEnabled")
private fun setupWebView() {
webView.webChromeClient = object: WebChromeClient() {
override fun onPermissionRequest(request: PermissionRequest?) {
request?.grant(request.resources)
}
}
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?) {
initializePeer()
}
}
}
var uniqueId = ""
private fun initializePeer() {
uniqueId = getUniqueID()
callJavascriptFunction("javascript:init(\"${uniqueId}\")")
firebaseRef.child(username).child("videocall").child("incall").addValueEventListener(object: ValueEventListener {
override fun onCancelled(error: DatabaseError) {}
override fun onDataChange(snapshot: DataSnapshot) {
onCallRequest(snapshot.value as? String)
}
})
}
private fun onCallRequest(caller: String?) {
if (caller == null) return
callLayout.visibility = View.VISIBLE
incomingCallTxt.text = "$caller is calling..."
acceptBtn.setOnClickListener {
firebaseRef.child(username).child("videocall").child("connId").setValue(uniqueId)
firebaseRef.child(username).child("videocall").child("isAvailable").setValue(true)
callLayout.visibility = View.GONE
switchToControls()
}
rejectBtn.setOnClickListener {
firebaseRef.child(username).child("videocall").child("incall").setValue(null)
callLayout.visibility = View.GONE
}
}
private fun switchToControls() {
//inputLayout.visibility = View.GONE
call.visibility = View.INVISIBLE
callControlLayout.visibility = View.VISIBLE
}
private fun getUniqueID(): String {
return UUID.randomUUID().toString()
}
private fun callJavascriptFunction(functionString: String) {
webView.post { webView.evaluateJavascript(functionString, null) }
}
fun onPeerConnected() {
isPeerConnected = true
}
}
我希望这些是我回答的必要信息
解决方案
推荐阅读
- swift - Swift 调试参数
- ipython - 在 IPython 中编辑多行代码
- reactjs - 如何将 Props 传递给 reactjs 处理程序?
- java - 骆驼收件人列表太长会导致 StackOverflow 错误
- vuejs2 - 我在 Vue 项目中的哪里添加我的 .eslintrc.js 文件?
- android - 创建 URL 时遇到问题。无法访问分支服务器,请稍后再试
- vim - "+ 注册不能在支持剪贴板的 vim 中工作
- cordova - 离子科尔多瓦文件传输插件未通过 HTTPS 在 android 中下载文件
- angular - 从环境变量 Angular 4 中读取值
- jquery - 如何在没有 http 或 https 的情况下验证 Jquery 插件 url?