Agora:ReactNative 未渲染显示视频通话中的远程用户视频

如何解决Agora:ReactNative 未渲染显示视频通话中的远程用户视频

我正在使用 ReactNative 构建群组视频聊天应用程序。对于视频通话,我使用 Agora for ReactNative,https://www.npmjs.com/package/react-native-agora。但是远程用户视频显示黑块。

这是我的代码。

const agoraAppId = "xxx";
const channelName = "myChannel";
const cerfificateKey = "xxxxx";
const token = "xxxxx";

import React,{ useEffect,useState } from 'react';
import { View,Text,StyleSheet,Dimensions,PermissionsAndroid,Button,ScrollView } from 'react-native';
import RtcEngine,{RtcLocalView,RtcRemoteView,VideoRenderMode} from 'react-native-agora'

const dimensions = {
    width: Dimensions.get('window').width,height: Dimensions.get('window').height,}

//https://docs.agora.io/en/Video/start_call_react_native?platform=React%20Native
//TODO: pass the id from the previous screen
const AgoraVideoCall = (props) => {
    let engine = null;
    const userId = props.route.params.userId;
    const [ initialised,setInitialised ] = useState(false);
    const [ joinedChannel,setJoinedChannel ] = useState(false);
    const [ engineInitialised,setEngineInitialised ] = useState(false);
    const [ userIds,setUserIds ] = useState([ ]);

    const requestCameraAndAudioPermission = async () => {
        try {
            const granted = await PermissionsAndroid.requestMultiple([
                PermissionsAndroid.PERMISSIONS.CAMERA,PermissionsAndroid.PERMISSIONS.RECORD_AUDIO
            ])

            if (
                granted['android.permission.RECORD_AUDIO'] === PermissionsAndroid.RESULTS.GRANTED
                && granted['android.permission.CAMERA'] === PermissionsAndroid.RESULTS.GRANTED
            ) {
                console.log('You can use the cameras & mic')
            } else {
                console.log('Permission denied')
            }
        } catch (err) {
            console.log(err);
        }
    }

    const startCall = async () => {
        try {
            if (engine == null) {
                await initialiseEngine()
            }
            await engine.joinChannel(token,channelName,null,userId)
            console.log("StartCall is run")
        } catch (err) {
            console.log("StartCall throws error")
            console.log(engine)
            console.log(err)
        }
    }

    const initialiseEngine = async () => {
        try {
            engine = await RtcEngine.create(agoraAppId);
            console.log("Engine initiaised");
            setEngineInitialised(true)
        } catch (err) {
            console.log("Unable to initialise engine");
            console.log(err);
            setEngineInitialised(false)
        }
    }

    const setUpMeeting = async () => {
        await engine.enableVideo();

        engine.addListener("UserJoined",(uid,elapsed) => {
            console.log(`User has joined,${uid}`);
            if (uid != userId && userIds.filter(id => id == uid).length < 1) {
                let tempUserIds = [ ...userIds ]
                tempUserIds.push(uid);

                setUserIds(tempUserIds);
                console.log(`User ids have been updated`);
            }
        })

        engine.addListener("UserOffline",reason) => {
            console.log("User has gone offline");
        })

        engine.addListener("JoinChannelSuccess",(channel,uid,elapsed) => {
            console.log(`Successfully joined the channel,${channel},${uid}`);
            setJoinedChannel(true);
        })

        setInitialised(true)
    }

    useEffect(() => {

        requestCameraAndAudioPermission()
            .then(() => {
                initialiseEngine()
                    .then(result => {
                        setUpMeeting()
                    })
            })
    },[ ])

    const renderVideos = () => {
        if (! joinedChannel) {
            return null
        }

        return (
            <View style={styles.fullView}>
                <RtcLocalView.SurfaceView
                    style={styles.max}
                    channelId={channelName}
                    renderMode={VideoRenderMode.Hidden} />
                {renderRemoteVideos()}
            </View>
        )
    }

    const renderRemoteVideos = () => {
        if (userIds.length < 1) {
            return null;
        }

        return (
            <ScrollView
            style={styles.remoteContainer}
            contentContainerStyle={{paddingHorizontal: 2.5}}
            horizontal={true}
            >
                {userIds.map((id,index) => {
                    return (
                        <RtcRemoteView.SurfaceView
                            key={index}
                            style={styles.remote}
                            channelId={channelName}
                            renderMode={VideoRenderMode.Hidden}
                            uid={id}
                            zOrderMediaOverlay={true}
                        />
                    )
                })}
            </ScrollView>
        )
    }

    const renderStartCallButton = () => {
        if (joinedChannel) {
            return null;
        }

        return (
            <View style={styles.actionButton}>
                <Button
                    title={"Start Call"}
                    onPress={() => {
                        startCall()
                    }}
                />
            </View>
        )
    }

    const leaveChannel = async () => {
        try {
            if (engine ==null) {
                await initialiseEngine()
            }

            await engine.leaveChannel()

            setJoinedChannel(false)
        } catch (err) {
            console.log("Unable to leave the channel")
            console.log(engine)
            console.log(err)
        }
    }

    const renderLeaveChannelButton = () => {
        if (! joinedChannel) {
            return null
        }

        return (
            <View style={styles.actionButton}>
                <Button
                    title={"Leave Channel"}
                    onPress={() => {
                        leaveChannel()
                    }}
                />
            </View>
        )
    }

    const renderContent = () => {
        if (!engineInitialised) {
            return <Text>Initializing the Agora engine</Text>
        }

        if (! initialised) {
            return <Text>Initializing the meeting</Text>
        }

        if (joinedChannel) {
            return (
                <View style={styles.max}>
                    <View style={styles.actionButtonsContainer}>
                        {renderLeaveChannelButton()}
                    </View>
                    <View style={styles.max}>
                        {renderVideos()}
                    </View>
                </View>
            )
        }

        return (
            <View>
                <View style={styles.actionButtonsContainer}>
                    {renderStartCallButton()}
                </View>
            </View>
        )
    }

    return (
        <View style={styles.container}>
            <ScrollView>
                {renderContent()}
            </ScrollView>
        </View>
    )
}

const styles = StyleSheet.create({
    container: {
        justifyContent: "center",alignItems: "center",flex: 1
    },actionButtonsContainer: {
        flexDirection: "row"
    },actionButton: {
        padding: 10
    },max: {
        flex: 1,},buttonHolder: {
        height: 100,alignItems: 'center',flex: 1,flexDirection: 'row',justifyContent: 'space-evenly',button: {
        paddingHorizontal: 20,paddingVertical: 10,backgroundColor: '#0093E9',borderRadius: 25,buttonText: {
        color: '#fff',fullView: {
        width: dimensions.width,height: dimensions.height - 100,remoteContainer: {
        width: '100%',height: 150,position: 'absolute',top: 5
    },remote: {
        width: 150,marginHorizontal: 2.5
    },noUserText: {
        paddingHorizontal: 10,paddingVertical: 5,color: '#0093E9',})

export default AgoraVideoCall;

渲染远程视频视图时,渲染后面的矩形块如下。

enter image description here

我的代码有什么问题,我该如何修复?

解决方法

尝试在卸载组件时清除远程 userIds 状态。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res