【m】修改渲染顺序

This commit is contained in:
2026-04-11 19:05:19 +08:00
parent f4ab50b73e
commit cb32582c98
3 changed files with 75 additions and 54 deletions

View File

@@ -157,7 +157,7 @@ window.addEventListener('DOMContentLoaded', async () => {
//await store.init(); //await store.init();
// 初始化渲染器 // 初始化渲染器
new UIRenderer(store); const renderer = new UIRenderer(store);
// 加入通话 // 加入通话
await store.joinCall(connectionId); await store.joinCall(connectionId);
@@ -165,6 +165,8 @@ window.addEventListener('DOMContentLoaded', async () => {
// 设置WebRTC连接 // 设置WebRTC连接
await store.setUp(connectionId); await store.setUp(connectionId);
renderer.renderHeaderTitle();
// 绑定DOM事件 // 绑定DOM事件
bindDomEvents(); bindDomEvents();

View File

@@ -5,6 +5,7 @@
import { formatTime, formatTimestamp, toggleElement, toggleButtonState } from './utils.js'; import { formatTime, formatTimestamp, toggleElement, toggleButtonState } from './utils.js';
import { mockCallSession } from './models.js'; import { mockCallSession } from './models.js';
import chatMessage from './chatmessage.js'; import chatMessage from './chatmessage.js';
import store from './store.js';
class UIRenderer { class UIRenderer {
constructor(stateManager) { constructor(stateManager) {
this.stateManager = stateManager; this.stateManager = stateManager;
@@ -103,60 +104,74 @@ class UIRenderer {
} }
// 渲染状态变化 /**
* 渲染方法 - 根据状态变化更新UI
* @param {Object} state - 当前应用状态
* @param {Object} changes - 状态变化对象
*/
render(state, changes) { render(state, changes) {
// 根据变化类型执行不同的渲染操作
switch (changes.type) { switch (changes.type) {
case 'INIT': case 'INIT':
this.renderHeader(state.session); // 初始化渲染 - 渲染所有UI元素
this.renderRemoteVideo(state.session.remoteUser); this.renderRemoteVideo(state.session.remoteUser); // 渲染远程视频
this.renderLocalVideo(state.session.localUser, state.localStream); this.renderLocalVideo(state.session.localUser, state.localStream); // 渲染本地视频
this.renderControlButtons(state.session.localUser.mediaState); this.renderControlButtons(state.session.localUser.mediaState); // 渲染控制按钮
this.renderChatMessages(chatMessage.getMessageState().messages); this.renderChatMessages(chatMessage.getMessageState().messages); // 渲染聊天消息
this.renderUserList(state.session.localUser, state.session.remoteUser); this.renderUserList(state.session.localUser, state.session.remoteUser); // 渲染用户列表
this.renderHeader(state.session); // 渲染头部信息
// 初始化时检查远程流状态,显示或隐藏占位背景 // 初始化时检查远程流状态,显示或隐藏占位背景
if (this.elements.remoteVideoPlaceholder) { if (this.elements.remoteVideoPlaceholder) {
if (state.remoteStream) { if (state.remoteStream) {
this.elements.remoteVideoPlaceholder.classList.add('hidden'); this.elements.remoteVideoPlaceholder.classList.add('hidden'); // 有远程流时隐藏占位背景
} else { } else {
this.elements.remoteVideoPlaceholder.classList.remove('hidden'); this.elements.remoteVideoPlaceholder.classList.remove('hidden'); // 无远程流时显示占位背景
} }
} }
break; break;
case 'DURATION_UPDATE': case 'DURATION_UPDATE':
// 通话时长更新 - 渲染通话时长
this.renderCallDuration(changes.duration); this.renderCallDuration(changes.duration);
break; break;
case 'LOCAL_MEDIA_CHANGE': case 'LOCAL_MEDIA_CHANGE':
this.renderControlButtons(state.session.localUser.mediaState); // 本地媒体状态变化 - 更新相关UI
this.renderLocalVideo(state.session.localUser, state.localStream); this.renderControlButtons(state.session.localUser.mediaState); // 渲染控制按钮
this.renderLocalUserStatus(state.session.localUser); this.renderLocalVideo(state.session.localUser, state.localStream); // 渲染本地视频
this.renderUserList(state.session.localUser, state.session.remoteUser); this.renderLocalUserStatus(state.session.localUser); // 渲染本地用户状态
this.renderUserList(state.session.localUser, state.session.remoteUser); // 渲染用户列表
break; break;
case 'LOCAL_STREAM_OBTAINED': case 'LOCAL_STREAM_OBTAINED':
this.renderLocalStream(state.localStream); // 本地流获取成功 - 更新本地视频显示
this.renderLocalVideo(state.session.localUser, state.localStream); this.renderLocalStream(state.localStream); // 渲染本地流
this.renderLocalVideo(state.session.localUser, state.localStream); // 渲染本地视频
break; break;
case 'REMOTE_STREAM_OBTAINED': case 'REMOTE_STREAM_OBTAINED':
this.renderRemoteStream(state.remoteStream); // 远程流获取成功 - 更新远程视频显示
this.renderRemoteStream(state.remoteStream); // 渲染远程流
// 当获取到远程流时,隐藏连接中提示 // 当获取到远程流时,隐藏连接中提示
if (this.elements.connectingOverlay) { if (this.elements.connectingOverlay) {
this.elements.connectingOverlay.classList.add('hidden'); this.elements.connectingOverlay.classList.add('hidden');
} }
break; break;
case 'REMOTE_MEDIA_CHANGE': case 'REMOTE_MEDIA_CHANGE':
this.renderRemoteVideo(state.session.remoteUser); // 远程媒体状态变化 - 更新远程视频和用户列表
this.renderUserList(state.session.localUser, state.session.remoteUser); this.renderRemoteVideo(state.session.remoteUser); // 渲染远程视频
this.renderUserList(state.session.localUser, state.session.remoteUser); // 渲染用户列表
break; break;
case 'USER_LIST_UPDATE': case 'USER_LIST_UPDATE':
// 用户列表更新 - 重新渲染用户列表
this.renderUserList(changes.localUser, changes.remoteUser); this.renderUserList(changes.localUser, changes.remoteUser);
break; break;
case 'NETWORK_CHANGE': case 'NETWORK_CHANGE':
// 网络状态变化 - 渲染网络状态
this.renderNetworkStatus(changes.quality); this.renderNetworkStatus(changes.quality);
break; break;
case 'CALL_STATUS_CHANGE': case 'CALL_STATUS_CHANGE':
// 通话状态变化 - 渲染通话状态
this.renderCallStatus(changes.status); this.renderCallStatus(changes.status);
break; break;
case 'CALL_ENDED': case 'CALL_ENDED':
// 通话结束 - 渲染通话结束界面
this.renderCallEnded(); this.renderCallEnded();
break; break;
} }
@@ -175,15 +190,8 @@ class UIRenderer {
// 渲染头部 // 渲染头部
renderHeader(session) { renderHeader(session) {
if (this.elements.headerTitle) {
// 未连接时不显示红框部分
if (session.status === 'idle' || session.status === 'connecting') {
this.elements.headerTitle.textContent = '通话';
} else {
this.elements.headerTitle.textContent = `${session.remoteUser.name} 的通话`;
}
}
this.renderHeaderTitle();
if (this.elements.encryptionBadge) { if (this.elements.encryptionBadge) {
toggleElement(this.elements.encryptionBadge, session.isEncrypted); toggleElement(this.elements.encryptionBadge, session.isEncrypted);
} }
@@ -198,6 +206,14 @@ class UIRenderer {
this.renderCallDuration(session.duration); this.renderCallDuration(session.duration);
} }
renderHeaderTitle() {
if (this.elements.headerTitle) {
const connectionId = store.getConnectionId() || '';
// 未连接时不显示红框部分
this.elements.headerTitle.textContent = `通话 (${connectionId})`;
}
}
// 渲染通话时长 // 渲染通话时长
renderCallDuration(duration) { renderCallDuration(duration) {

View File

@@ -182,33 +182,6 @@ class CallStateManager {
const audioTracks = this.state.localStream.getAudioTracks(); const audioTracks = this.state.localStream.getAudioTracks();
console.log('New audio tracks:', audioTracks); console.log('New audio tracks:', audioTracks);
// 更新视频轨道
if (videoTracks.length > 0) {
const newVideoTrack = videoTracks[0];
console.log('Using new video track:', newVideoTrack);
if (videoTransceivers.length > 0) {
// 替换现有的视频轨道
for (const transceiver of videoTransceivers) {
try {
console.log('Replacing video track in transceiver:', transceiver);
await transceiver.sender.replaceTrack(newVideoTrack);
console.log('Successfully replaced video track');
} catch (error) {
console.error('Error replacing video track:', error);
}
}
} else {
// 添加新的视频收发器
try {
console.log('Adding new video transceiver');
const transceiver = this.renderstreaming.addTransceiver(newVideoTrack, { direction: 'sendonly' });
console.log('Added new video transceiver:', transceiver);
} catch (error) {
console.error('Error adding new video transceiver:', error);
}
}
}
// 更新音频轨道 // 更新音频轨道
if (audioTracks.length > 0) { if (audioTracks.length > 0) {
@@ -237,6 +210,35 @@ class CallStateManager {
} }
} }
} }
// 更新视频轨道
if (videoTracks.length > 0) {
const newVideoTrack = videoTracks[0];
console.log('Using new video track:', newVideoTrack);
if (videoTransceivers.length > 0) {
// 替换现有的视频轨道
for (const transceiver of videoTransceivers) {
try {
console.log('Replacing video track in transceiver:', transceiver);
await transceiver.sender.replaceTrack(newVideoTrack);
console.log('Successfully replaced video track');
} catch (error) {
console.error('Error replacing video track:', error);
}
}
} else {
// 添加新的视频收发器
try {
console.log('Adding new video transceiver');
const transceiver = this.renderstreaming.addTransceiver(newVideoTrack, { direction: 'sendonly' });
console.log('Added new video transceiver:', transceiver);
} catch (error) {
console.error('Error adding new video transceiver:', error);
}
}
}
// 延迟设置编解码器偏好,确保收发器已完全创建 // 延迟设置编解码器偏好,确保收发器已完全创建
setTimeout(() => { setTimeout(() => {
@@ -294,6 +296,7 @@ class CallStateManager {
// 设置状态为连接中 // 设置状态为连接中
this.state.session.status = 'connecting'; this.state.session.status = 'connecting';
this.notify({ type: 'CALL_STATUS_CHANGE', status: 'connecting' }); this.notify({ type: 'CALL_STATUS_CHANGE', status: 'connecting' });
// 确保本地流已经初始化 // 确保本地流已经初始化
if (!this.state.localStream) { if (!this.state.localStream) {
console.log('Local stream not available, waiting for initialization...'); console.log('Local stream not available, waiting for initialization...');