Ich habe ein Android -Telefon und möchte es in einem Webbrowser streamen. Mein Webbrowser, obwohl er am Telefon sichtbar ist. < /p>
Hier habe ich bisher versucht.
Ich habe ein Android -Telefon und möchte es in einem Webbrowser streamen. Mein Webbrowser, obwohl er am Telefon sichtbar ist. < /p> Hier habe ich bisher versucht.[code]// Code on android phone. private void handlePeerConnection(SurfaceViewRenderer surfaceViewRenderer) { PeerConnectionFactory.InitializationOptions initializationOptions = PeerConnectionFactory.InitializationOptions.builder(requireContext().getApplicationContext()) .setEnableInternalTracer(true) .setInjectableLogger((message, severity, tag) -> { Log.d("WEBRTC_INJ."+tag, message); }, Logging.Severity.LS_VERBOSE) .createInitializationOptions(); PeerConnectionFactory.initialize(initializationOptions);
PeerConnectionFactory.Options options = new PeerConnectionFactory.Options(); PeerConnectionFactory.Builder peerConnectionFactoryBuilder = PeerConnectionFactory.builder() .setOptions(options);
DefaultVideoEncoderFactory defaultVideoEncoderFactory = new DefaultVideoEncoderFactory( eglBaseContext, true, true); DefaultVideoDecoderFactory defaultVideoDecoderFactory = new DefaultVideoDecoderFactory( eglBaseContext);
< /code> Dies ist der Signal-Server-Teil < /p> public void onMessage(WebSocket socket, String data) { try { JSONObject object = new JSONObject(data); String type = object.getString("type"); switch (type) { case "webrtc-answer": String sdp = object.optString("sdp"); String sdptypeStr = object.optString("sdptype"); SessionDescription sessionDescription = new SessionDescription(SessionDescription.Type.fromCanonicalForm(sdptypeStr), sdp); Data.webRTCSessionDescription.postValue(sessionDescription); break; case "webrtc-ice-candidate": JSONObject iceCandidateObj = object.optJSONObject("candidate"); String sdpMid = ""; int sdpMLineIndex = 0; String candidate = ""; if( iceCandidateObj != null ) { sdpMid = iceCandidateObj.optString("sdpMid"); sdpMLineIndex = iceCandidateObj.optInt("sdpMLineIndex"); candidate = iceCandidateObj.optString("candidate"); } IceCandidate iceCandidate = new IceCandidate(sdpMid, sdpMLineIndex, candidate); Data.webRTCIceCandidate.forcePostValue(iceCandidate); break; case "informing-ready": Data.webRTCStartOffer.postValue(null); break; } } catch (JSONException e) { }
}
< /code> Und dies ist der Code im Webbrowser, der in TypeScript < /p> geschrieben wurde.const videoElement = document.getElementById("remote-video") as HTMLVideoElement; const infoWS = new WebSocket("/info"); let peerConn: RTCPeerConnection; infoWS.addEventListener("message", function (event) { const data = JSON.parse(event.data); const type = data.type; if (type === "webrtc-offer") { const rtcOffer = data; handleRTCOfferMsg(rtcOffer); } else if (type === "webrtc-ice-candidate") { peerConn.addIceCandidate(new RTCIceCandidate({ candidate: data.candidate, sdpMid: data.id, sdpMLineIndex: data.label })); } })
/* functions */ function createPeerConnection(): RTCPeerConnection { peerConn = new RTCPeerConnection(); peerConn.addEventListener('icecandidate', function (event) { const candidate = event.candidate; const iceCandidateMessage = { type: "webrtc-ice-candidate", candidate: candidate }; infoWS.send(JSON.stringify(iceCandidateMessage)); });
peerConn.addEventListener("negotiationneeded", async function (e) { });
peerConn.addEventListener("track", function (event) { console.log("ontrack is called"); videoElement.srcObject = event.streams[0]; });
return peerConn; }
async function handleRTCOfferMsg(offer) { try { const peerConn = createPeerConnection(); const desc = new RTCSessionDescription({ sdp: offer.sdp, type: offer.sdptype as any }); await peerConn.setRemoteDescription(desc); const answer = await peerConn.createAnswer({ 'mandatory': { 'OfferToReceiveAudio': 0, 'OfferToReceiveVideo': 1 } }); await peerConn.setLocalDescription(answer); const answerMsg = { type: "webrtc-answer", sdp: peerConn.localDescription?.sdp, sdptype: peerConn.localDescription?.type }; infoWS.send(JSON.stringify(answerMsg)); } catch (e) { alert("Error handleRTCOfferMsg(): " + e) } } } [/code] Ich habe dieses Verhalten beim Debugging bemerkt. /> Entschuldigung, wenn der Code so lang ist.>
Ich habe eine große Fastapi -Anwendung. Es gibt viele verschiedene Endpunkte, darunter eine, die zum Proxy -Video -Streams verwendet wird. Die Verwendung ist so etwas wie folgt: Der Endpunkt empfängt...
Ich habe andere Beiträge zu diesem Problem gesehen, aber ich war nicht, eine Lösung zu finden. Ich habe versucht, ihren Vorschlägen zu folgen. Der Oberflächenhalter wurde vor der...
Ich richte eine URL in einer webView ein. Das WebView zeigt jedoch nur eine leere Seite an. Ich habe versucht, andere URLs und diese Arbeiten festzulegen. Ich habe nach einem ähnlichen Problem...
Ich verwende Google_Mobile_Ads: ^5.3.1 in meiner Flutter -App, um belohnte Anzeigen anzuzeigen. Die Anzeigen laden und zeigen korrekt an, aber nach dem Schließen der Anzeige wird der App -Bildschirm...
Ich erwarte eine sehr niedrige CPU -Verwendung beim Hochladen von Daten über SFTP oder Web -Benutzeroberfläche in Minio. Aber CPU -Spike tritt beim Hochladen von Daten über SFTP oder Web UI auf....