【发布时间】:2020-06-15 10:39:31
【问题描述】:
我尝试使用 Unity 制作视频流应用程序,我已成功连接两个用户,并且能够进行视频聊天和共享屏幕。现在的问题是当另一个/第二个用户按下离开频道并再次重新加入时,第一个用户将看到第二个用户屏幕刚刚停止在最后一帧。目前唯一的处理方法是退出 Unity 播放模式并重新进入。下面是代码:
void LoadEngine()
{
print("Loading Engine...");
if (engine != null)
{
print("Engine already exists. Please unload it first!");
return;
}
engine = IRtcEngine.GetEngine(appId);
engine.SetLogFilter(LOG_FILTER.DEBUG);
}
void UnloadEngine()
{
print("Unloading Engine...");
if (engine != null)
{
IRtcEngine.Destroy();
engine = null;
}
}
void EnableVideo(bool yes)
{
engine.DisableAudio();
if (yes)
{
engine.EnableVideo();
engine.EnableVideoObserver();
}
else
{
engine.DisableVideo();
engine.DisableVideoObserver();
}
}
private void JoinChannel()
{
print("Joining Channel...");
EnableVideo(true);
// add our callback to handle Agora events
engine.OnJoinChannelSuccess += OnJoinChannelSuccess;
engine.OnUserJoined += OnUserJoined;
engine.OnUserOffline += OnUserLeave;
engine.OnLeaveChannel += OnLeaveChannel;
button_Join.onClick.RemoveListener(JoinChannel);
button_Join.onClick.AddListener(LeaveChannel);
button_Join.GetComponentInChildren<Text>().text = "Leave Channel";
if (string.IsNullOrEmpty(channelName))
{
return;
}
engine.JoinChannel(channelName, null, 0);
}
private void LeaveChannel()
{
print("Leaving Channel...");
button_Join.onClick.RemoveListener(LeaveChannel);
button_Join.onClick.AddListener(JoinChannel);
button_Join.GetComponentInChildren<Text>().text = "Join Channel";
playerOne.Clear();
playerTwo.Clear();
engine.LeaveChannel();
EnableVideo(false);
engine.OnJoinChannelSuccess -= OnJoinChannelSuccess;
engine.OnUserJoined -= OnUserJoined;
engine.OnUserOffline -= OnUserLeave;
engine.OnLeaveChannel -= OnLeaveChannel;
}
private void OnJoinChannelSuccess(string channelName, uint uid, int elapsed)
{
print("Joined with uid " + uid);
myId = uid;
playerOne.Set(0);
}
private void OnUserJoined(uint uid, int elapsed)
{
string userJoinedMessage = string.Format("onUserJoined callback uid {0} with elapsed {1}", uid, elapsed);
print(userJoinedMessage);
playerTwo.Set(uid);
}
private void OnUserLeave(uint uid, USER_OFFLINE_REASON reason)
{
string userLeaveMessage = string.Format("onUserOffline callback uid {0} with reason {1}", uid, reason);
print(userLeaveMessage);
playerTwo.Clear();
}
private void OnLeaveChannel(RtcStats stats)
{
playerTwo.Clear();
}
private void OnApplicationQuit()
{
UnloadEngine();
}
我在代码中遗漏了什么吗?
编辑
我怀疑这是 Agora API 的错误,当在运行时更改 UID 时,视频表面将不会继续流式传输视频。这解释了当同一个用户离开并重新加入时,他每次重新加入都会得到不同的 uid。视频表面需要将 UID 设置为另一个数字,这会导致视频表面停止流式传输。
解决方案
我使用统一实例化解决了这个问题,以便在连接到频道时实时实例化视频表面,并在离开频道时销毁视频表面游戏对象。
【问题讨论】:
-
我也面临同样的问题,我想将我的大原始图像交换为一个较小的原始图像,分别代表远程和本地用户。如果我使用 SetForUser() 方法,原始图像会冻结并且 tmpi 总是返回 -1
标签: c# visual-studio unity3d video-streaming agora.io