IceConnectionState выполнено, но камера пуста ⇐ Android
IceConnectionState выполнено, но камера пуста
Я новичок в React, пытающийся реализовать видеозвонок с помощью Web RTC. Теперь я столкнулся с проблемой: у меня пустой удаленный видеовызов. Я проверил свою регистрацию и вижу, что мой веб-RTC зарегистрировал onIceGatheringChangeCOMPLETE, но по какой-то причине кадры, полученные в моем удаленном потоке, всегда имеют следующий вид: EglRenderer: Продолжительность: 4007 мс. Получено кадров: 0. Отброшено: 0. Обработано: 0. Частота кадров рендеринга: .0. Среднее время рендеринга: нет данных. Среднее время буфера подкачки: нет данных.
Прикреплен мой код
функция ConnectScreen2({маршрут}) { const ctx = useContext(AuthContext) const MyRandomId = "554433"; const [localStream, setLocalStream] = useState(); const [remoteStream, setRemoteStream] = useState(); // для завершения вызова const [CachedLocalPC, setCachedLocalPC] = useState(); const ref = Collection(firebase, «Комната»); const targetCollectionRef = коллекция (firebase, «расходы»); пусть таймер = ноль; функция SnapShotAndSetICE(Коллекция, MyPC) { console.log("SnapShotAndSetICE кэшируется локально " + MyPC); onSnapshot(Коллекция, (снимок) => { snapshot.docChanges().forEach((change) => { если (change.type === "добавлено") { пусть данные = изменение.doc.data(); console.log("Addcaller " + data.candidate); MyPC.addIceCandidate(новый RTCIceCandidate(данные)); } }); }); } асинхронная функция StartCall2() { const localPC = новый RTCPeerConnection (peerConstraints); console.log("StartCall2"); const UserRef = doc(ref, MyRandomId); localStream.getTracks().forEach((track) => { localPC.addTrack(трек, localStream); }); const roomRef = doc(ref, MyRandomId); const callerCandidatesCollection = коллекция (roomRef, «callerCandidates»); const calleeCandidatesCollection = коллекция (roomRef, «calleeCandidates»); //настройка при добавлении ледяного кандидата добавить в документ localPC.addEventListener("icecandidate", (e) => { если (!e.candidate) { возвращаться; } попробуйте { addDoc(callerCandidatesCollection, e.candidate.toJSON()) } улов (ошибка) { console.log("Ошибка кандидата на лед при добавлении"); } }); // настройка для прослушивания добавления удаленного потока localPC.ontrack = (e) => { console.log("на ходу" + e.streams.length); const newStream = новый MediaStream(); если (e.streams.length > 0) { e.streams[0].getTracks().forEach((track) => { newStream.addTrack(дорожка); }); console.log("начать вызов удаленного потока" + newStream.toURL()) setRemoteStream (newStream); } }; // сделать предложение пусть предложение = ноль пытаться { console.log("Начать звонок, создать предложение"); предложение = ждут localPC.createOffer(); } улов (ошибка) { console.log("Сбой при запуске звонка и создании предложения"); } пытаться { дождитесь localPC.setLocalDescription (предложение); } улов (ошибка) { console.log("Ошибка запуска вызова setLocalDescription"); } await setDoc(roomRef, {offer, linked: false, RoomDetails: { HostName: ctx.UserName } }, { merge: true }); // Прослушивание удаленного ответа onSnapshot(roomRef, (doc) => { console.log("Начать вызов SetupRemoteDescription2" + localPC); константные данные = doc.data(); if (!localPC.currentRemoteDescription && data.ответ) { const rtcSessionDescription = новое RTCSessionDescription(data.ответ); localPC.setRemoteDescription(rtcSessionDescription); //timer=setTimeout(SnapShotAndSetICE.bind(this,calleeCandidatesCollection,CachedLocalPC),10000); SnapShotAndSetICE (calleeCandidatesCollection, localPC); console.log("локальный компьютер" + localPC.iceConnectionState) } еще { установитьRemoteStream(); } }); const TargetRef = doc(targetCollectionRef,route.params.targetuid); ждут setDoc (TargetRef, {InvitationId: MyRandomId}, {merge: true}); console.log("ice Connection 3" + localPC.iceConnectionState + "signal str" + localPC.signalingState); setCachedLocalPC (локальный ПК) setInterval (checkIce, 5000, localPC); } ///// присоединяемся к вызову асинхронная функция JoinCall() { const localPC = новый RTCPeerConnection (peerConstraints); const roomRef = doc(ref,route.params.id); const roomSnapshot = ждут getDoc (roomRef); console.log("присоединиться к вызову"); если (!roomSnapshot.exists) { console.log("Присоединиться к вызову, места нет"); возвращаться; } localStream.getTracks().forEach((track) => { localPC.addTrack(трек, localStream); }); const callerCandidatesCollection = коллекция (roomRef, «callerCandidates»); const calleeCandidatesCollection = коллекция (roomRef, «calleeCandidates»); localPC.addEventListener("icecandidate", (e) => { если (!e.candidate) { возвращаться; } addDoc(calleeCandidatesCollection, e.candidate.toJSON()); }); localPC.ontrack = (e) => { const newStream = новый MediaStream(); e.streams[0].getTracks().forEach((track) => { newStream.addTrack(дорожка); }); console.log("Присоединиться к удаленному потоку вызова " + новыйStream.toURL()) setRemoteStream (newStream); }; пусть ответ = ноль; const предложение = roomSnapshot.data().offer; если (!localPC.currentLocalDescription) { попробуйте {ждём localPC.setRemoteDescription(новый RTCSessionDescription(предложение)); } улов (ошибка) { console.log("Ошибка создания нового удаленного описания"); } попробуйте {ответ = ожидайте localPC.createAnswer(); } улов (ошибка) { console.log("создать createAnswer не удалось"); } попробуйте {ждём localPC.setLocalDescription(ответ); } улов (ошибка) { console.log("Ошибка локального описания"); } //timer=setTimeout(SnapShotAndSetICE.bind(this,callerCandidatesCollection,CachedLocalPC),10000); SnapShotAndSetICE (callerCandidatesCollection, localPC); } ждут updateDoc (roomRef, {ответ, подключен: правда}, {слияние: правда}); setCachedLocalPC (локальный ПК); setInterval (checkIce, 5000, localPC); } функция checkIce(MyPC) {//console.log("ice Connection 4"); если (МойПК) { console.log("ice Connection 4" + MyPC.iceConnectionState + " signal str " + MyPC.signalingState); } еще { console.log("CachedLocalPC " + MyPC); } // } useEffect(() => { асинхронная функция SetupStream() { const Stream = ждут GetStreams(); setLocalStream(Поток); console.log("Поток" + Поток); } асинхронная функция Settings() { дождитесь SetupStream(); } Настройки(); }, []); useEffect(() => { если (локальный поток) { если (route.params.StartCall === true) { НачатьВызов2(); } еще { ПрисоединяйтесьВызов(); } } }, [локальный поток]) const PeerConstraints = { ледовые серверы: [ { URL: 'stun:stun.l.google.com:19302' }, { URL: 'stun:stun1.l.google.com:19302' }, { URL: 'stun:stun2.l.google.com:19302' }, { URL: 'stun:stun3.l.google.com:19302' }, {URL: 'turn:numb.viagenie.ca', учетные данные: 'muazkh', имя пользователя: '[email protected]' }, { URL: 'turn:relay.backups.cz', учетные данные: 'webrtc', имя пользователя: 'webrtc' }, { URL: 'turn:relay.backups.cz?transport=tcp', учетные данные: 'webrtc', имя пользователя: 'webrtc' }, {urls: 'turn:192.158.29.39:3478?transport=udp', учетные данные: 'JZEOEt2V3Qb0y27GRntt2u2PAYA=', имя пользователя: '28224511:1379330808' }, ] }; возвращаться ( {!remoteStream && ( MyCam )} {удаленный поток && ( {( )} )} ); } константные стили = StyleSheet.create({ ГлавныйКонтейнер: { гибкий: 1 }, ЛокальныйКамКонтейнер: { гибкий: 1, Цвет фона: «красный», границаРадиус: 8 }, Текст: { alignItems: "центр", justifyContent: "центр" } }) экспортировать ConnectScreen2 по умолчанию;
Я новичок в React, пытающийся реализовать видеозвонок с помощью Web RTC. Теперь я столкнулся с проблемой: у меня пустой удаленный видеовызов. Я проверил свою регистрацию и вижу, что мой веб-RTC зарегистрировал onIceGatheringChangeCOMPLETE, но по какой-то причине кадры, полученные в моем удаленном потоке, всегда имеют следующий вид: EglRenderer: Продолжительность: 4007 мс. Получено кадров: 0. Отброшено: 0. Обработано: 0. Частота кадров рендеринга: .0. Среднее время рендеринга: нет данных. Среднее время буфера подкачки: нет данных.
Прикреплен мой код
функция ConnectScreen2({маршрут}) { const ctx = useContext(AuthContext) const MyRandomId = "554433"; const [localStream, setLocalStream] = useState(); const [remoteStream, setRemoteStream] = useState(); // для завершения вызова const [CachedLocalPC, setCachedLocalPC] = useState(); const ref = Collection(firebase, «Комната»); const targetCollectionRef = коллекция (firebase, «расходы»); пусть таймер = ноль; функция SnapShotAndSetICE(Коллекция, MyPC) { console.log("SnapShotAndSetICE кэшируется локально " + MyPC); onSnapshot(Коллекция, (снимок) => { snapshot.docChanges().forEach((change) => { если (change.type === "добавлено") { пусть данные = изменение.doc.data(); console.log("Addcaller " + data.candidate); MyPC.addIceCandidate(новый RTCIceCandidate(данные)); } }); }); } асинхронная функция StartCall2() { const localPC = новый RTCPeerConnection (peerConstraints); console.log("StartCall2"); const UserRef = doc(ref, MyRandomId); localStream.getTracks().forEach((track) => { localPC.addTrack(трек, localStream); }); const roomRef = doc(ref, MyRandomId); const callerCandidatesCollection = коллекция (roomRef, «callerCandidates»); const calleeCandidatesCollection = коллекция (roomRef, «calleeCandidates»); //настройка при добавлении ледяного кандидата добавить в документ localPC.addEventListener("icecandidate", (e) => { если (!e.candidate) { возвращаться; } попробуйте { addDoc(callerCandidatesCollection, e.candidate.toJSON()) } улов (ошибка) { console.log("Ошибка кандидата на лед при добавлении"); } }); // настройка для прослушивания добавления удаленного потока localPC.ontrack = (e) => { console.log("на ходу" + e.streams.length); const newStream = новый MediaStream(); если (e.streams.length > 0) { e.streams[0].getTracks().forEach((track) => { newStream.addTrack(дорожка); }); console.log("начать вызов удаленного потока" + newStream.toURL()) setRemoteStream (newStream); } }; // сделать предложение пусть предложение = ноль пытаться { console.log("Начать звонок, создать предложение"); предложение = ждут localPC.createOffer(); } улов (ошибка) { console.log("Сбой при запуске звонка и создании предложения"); } пытаться { дождитесь localPC.setLocalDescription (предложение); } улов (ошибка) { console.log("Ошибка запуска вызова setLocalDescription"); } await setDoc(roomRef, {offer, linked: false, RoomDetails: { HostName: ctx.UserName } }, { merge: true }); // Прослушивание удаленного ответа onSnapshot(roomRef, (doc) => { console.log("Начать вызов SetupRemoteDescription2" + localPC); константные данные = doc.data(); if (!localPC.currentRemoteDescription && data.ответ) { const rtcSessionDescription = новое RTCSessionDescription(data.ответ); localPC.setRemoteDescription(rtcSessionDescription); //timer=setTimeout(SnapShotAndSetICE.bind(this,calleeCandidatesCollection,CachedLocalPC),10000); SnapShotAndSetICE (calleeCandidatesCollection, localPC); console.log("локальный компьютер" + localPC.iceConnectionState) } еще { установитьRemoteStream(); } }); const TargetRef = doc(targetCollectionRef,route.params.targetuid); ждут setDoc (TargetRef, {InvitationId: MyRandomId}, {merge: true}); console.log("ice Connection 3" + localPC.iceConnectionState + "signal str" + localPC.signalingState); setCachedLocalPC (локальный ПК) setInterval (checkIce, 5000, localPC); } ///// присоединяемся к вызову асинхронная функция JoinCall() { const localPC = новый RTCPeerConnection (peerConstraints); const roomRef = doc(ref,route.params.id); const roomSnapshot = ждут getDoc (roomRef); console.log("присоединиться к вызову"); если (!roomSnapshot.exists) { console.log("Присоединиться к вызову, места нет"); возвращаться; } localStream.getTracks().forEach((track) => { localPC.addTrack(трек, localStream); }); const callerCandidatesCollection = коллекция (roomRef, «callerCandidates»); const calleeCandidatesCollection = коллекция (roomRef, «calleeCandidates»); localPC.addEventListener("icecandidate", (e) => { если (!e.candidate) { возвращаться; } addDoc(calleeCandidatesCollection, e.candidate.toJSON()); }); localPC.ontrack = (e) => { const newStream = новый MediaStream(); e.streams[0].getTracks().forEach((track) => { newStream.addTrack(дорожка); }); console.log("Присоединиться к удаленному потоку вызова " + новыйStream.toURL()) setRemoteStream (newStream); }; пусть ответ = ноль; const предложение = roomSnapshot.data().offer; если (!localPC.currentLocalDescription) { попробуйте {ждём localPC.setRemoteDescription(новый RTCSessionDescription(предложение)); } улов (ошибка) { console.log("Ошибка создания нового удаленного описания"); } попробуйте {ответ = ожидайте localPC.createAnswer(); } улов (ошибка) { console.log("создать createAnswer не удалось"); } попробуйте {ждём localPC.setLocalDescription(ответ); } улов (ошибка) { console.log("Ошибка локального описания"); } //timer=setTimeout(SnapShotAndSetICE.bind(this,callerCandidatesCollection,CachedLocalPC),10000); SnapShotAndSetICE (callerCandidatesCollection, localPC); } ждут updateDoc (roomRef, {ответ, подключен: правда}, {слияние: правда}); setCachedLocalPC (локальный ПК); setInterval (checkIce, 5000, localPC); } функция checkIce(MyPC) {//console.log("ice Connection 4"); если (МойПК) { console.log("ice Connection 4" + MyPC.iceConnectionState + " signal str " + MyPC.signalingState); } еще { console.log("CachedLocalPC " + MyPC); } // } useEffect(() => { асинхронная функция SetupStream() { const Stream = ждут GetStreams(); setLocalStream(Поток); console.log("Поток" + Поток); } асинхронная функция Settings() { дождитесь SetupStream(); } Настройки(); }, []); useEffect(() => { если (локальный поток) { если (route.params.StartCall === true) { НачатьВызов2(); } еще { ПрисоединяйтесьВызов(); } } }, [локальный поток]) const PeerConstraints = { ледовые серверы: [ { URL: 'stun:stun.l.google.com:19302' }, { URL: 'stun:stun1.l.google.com:19302' }, { URL: 'stun:stun2.l.google.com:19302' }, { URL: 'stun:stun3.l.google.com:19302' }, {URL: 'turn:numb.viagenie.ca', учетные данные: 'muazkh', имя пользователя: '[email protected]' }, { URL: 'turn:relay.backups.cz', учетные данные: 'webrtc', имя пользователя: 'webrtc' }, { URL: 'turn:relay.backups.cz?transport=tcp', учетные данные: 'webrtc', имя пользователя: 'webrtc' }, {urls: 'turn:192.158.29.39:3478?transport=udp', учетные данные: 'JZEOEt2V3Qb0y27GRntt2u2PAYA=', имя пользователя: '28224511:1379330808' }, ] }; возвращаться ( {!remoteStream && ( MyCam )} {удаленный поток && ( {( )} )} ); } константные стили = StyleSheet.create({ ГлавныйКонтейнер: { гибкий: 1 }, ЛокальныйКамКонтейнер: { гибкий: 1, Цвет фона: «красный», границаРадиус: 8 }, Текст: { alignItems: "центр", justifyContent: "центр" } }) экспортировать ConnectScreen2 по умолчанию;
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Hmac из python в js – когда полезная нагрузка не пуста, подписи разные
Anonymous » » в форуме Python - 0 Ответы
- 101 Просмотры
-
Последнее сообщение Anonymous
-