From c3dc6788b0f0017004950fce27451e2945ce17b9 Mon Sep 17 00:00:00 2001 From: acgist <289547414@qq.com> Date: Thu, 25 May 2023 07:51:42 +0800 Subject: [PATCH] =?UTF-8?q?[*]=20=E6=AF=8F=E6=97=A5=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../acgist/taoyao/client/MediaService.java | 1 + .../acgist/taoyao/client/signal/Taoyao.java | 4 +- .../taoyao/media/client/RemoteClient.java | 20 ++++++- .../taoyao/media/client/SessionClient.java | 53 +++++++++++-------- 4 files changed, 52 insertions(+), 26 deletions(-) diff --git a/taoyao-client-android/taoyao/client/src/main/java/com/acgist/taoyao/client/MediaService.java b/taoyao-client-android/taoyao/client/src/main/java/com/acgist/taoyao/client/MediaService.java index 46a5df2..35d4e98 100644 --- a/taoyao-client-android/taoyao/client/src/main/java/com/acgist/taoyao/client/MediaService.java +++ b/taoyao-client-android/taoyao/client/src/main/java/com/acgist/taoyao/client/MediaService.java @@ -280,6 +280,7 @@ public class MediaService extends Service { final AudioManager audioManager = this.getApplicationContext().getSystemService(AudioManager.class); Log.d(MediaService.class.getSimpleName(), "当前音频模式:" + audioManager.getMode()); Log.d(MediaService.class.getSimpleName(), "当前音频音量:" + audioManager.getStreamVolume(audioManager.getMode())); + Log.d(MediaService.class.getSimpleName(), "当前最大音频音量:" + audioManager.getStreamMaxVolume(audioManager.getMode())); // Log.d(MediaService.class.getSimpleName(), "当前蓝牙是否打开:" + audioManager.isBluetoothScoOn()); // Log.d(MediaService.class.getSimpleName(), "当前耳机是否打开:" + audioManager.isWiredHeadsetOn()); // Log.d(MediaService.class.getSimpleName(), "当前电话扬声器是否打开:" + audioManager.isSpeakerphoneOn()); diff --git a/taoyao-client-android/taoyao/client/src/main/java/com/acgist/taoyao/client/signal/Taoyao.java b/taoyao-client-android/taoyao/client/src/main/java/com/acgist/taoyao/client/signal/Taoyao.java index e2a87b0..6da66f9 100644 --- a/taoyao-client-android/taoyao/client/src/main/java/com/acgist/taoyao/client/signal/Taoyao.java +++ b/taoyao-client-android/taoyao/client/src/main/java/com/acgist/taoyao/client/signal/Taoyao.java @@ -1224,7 +1224,7 @@ public final class Taoyao implements ITaoyao { return; } final String type = MapUtils.get(body, "type"); - sessionClient.pause(type); + sessionClient.pauseLocal(type); } /** @@ -1241,7 +1241,7 @@ public final class Taoyao implements ITaoyao { return; } final String type = MapUtils.get(body, "type"); - sessionClient.resume(type); + sessionClient.resumeLocal(type); } /** diff --git a/taoyao-client-android/taoyao/media/src/main/java/com/acgist/taoyao/media/client/RemoteClient.java b/taoyao-client-android/taoyao/media/src/main/java/com/acgist/taoyao/media/client/RemoteClient.java index ffcbdcb..c3c77c1 100644 --- a/taoyao-client-android/taoyao/media/src/main/java/com/acgist/taoyao/media/client/RemoteClient.java +++ b/taoyao-client-android/taoyao/media/src/main/java/com/acgist/taoyao/media/client/RemoteClient.java @@ -15,6 +15,7 @@ import java.util.concurrent.ConcurrentHashMap; /** * 房间远程终端 + * * 注意:这里媒体MediaStreamTrack使用Mediasoup方法释放不要直接调用MediaStreamTrack.dispose()释放 * * @author acgist @@ -24,12 +25,25 @@ public class RemoteClient extends RoomClient { /** * 媒体流Track * 消费者ID = 媒体流Track + * * 注意:track由mediasoup的consumer释放 */ protected final Map tracks; + /** + * 音频消费者指针 + */ protected long audioConsumerPointer; + /** + * 视频消费指针 + */ protected long videoConsumerPointer; + /** + * @param name 终端名称 + * @param clientId 终端ID + * @param taoyao 信令 + * @param mainHandler MainHandler + */ public RemoteClient(String name, String clientId, ITaoyao taoyao, Handler mainHandler) { super(name, clientId, taoyao, mainHandler); this.tracks = new ConcurrentHashMap<>(); @@ -120,12 +134,14 @@ public class RemoteClient extends RoomClient { * 关闭消费者 * * @param consumerId 消费者ID + * + * @return MediaStreamTrack */ - public void close(String consumerId) { + public MediaStreamTrack close(String consumerId) { Log.i(RemoteClient.class.getSimpleName(), "关闭远程终端消费者:" + this.clientId + " - " + consumerId); synchronized (this.tracks) { // 注意:使用nativeMediaConsumerClose释放资源 - this.tracks.remove(consumerId); + return this.tracks.remove(consumerId); } } diff --git a/taoyao-client-android/taoyao/media/src/main/java/com/acgist/taoyao/media/client/SessionClient.java b/taoyao-client-android/taoyao/media/src/main/java/com/acgist/taoyao/media/client/SessionClient.java index 1a51a06..c353bc2 100644 --- a/taoyao-client-android/taoyao/media/src/main/java/com/acgist/taoyao/media/client/SessionClient.java +++ b/taoyao-client-android/taoyao/media/src/main/java/com/acgist/taoyao/media/client/SessionClient.java @@ -19,6 +19,7 @@ import org.webrtc.PeerConnection; import org.webrtc.PeerConnectionFactory; import org.webrtc.SdpObserver; import org.webrtc.SessionDescription; +import org.webrtc.SurfaceViewRenderer; import java.util.HashMap; import java.util.List; @@ -54,6 +55,7 @@ public class SessionClient extends Client { private final boolean videoProduce; private final MediaProperties mediaProperties; private final WebrtcProperties webrtcProperties; + private SurfaceViewRenderer localSurfaceViewRenderer; /** * 本地媒体 */ @@ -136,7 +138,7 @@ public class SessionClient extends Client { this.peerConnection = this.peerConnectionFactory.createPeerConnection(configuration, this.observer); this.peerConnection.addStream(this.mediaStream); if(this.preview) { - // 实现预览 + this.previewLocal(); } // 设置streamId同步 // final List streamIds = new ArrayList<>(); @@ -243,7 +245,6 @@ public class SessionClient extends Client { return; } this.remoteMediaStream.audioTracks.forEach(audioTrack -> { - audioTrack.setVolume(0); audioTrack.setEnabled(false); }); } @@ -255,7 +256,6 @@ public class SessionClient extends Client { return; } this.remoteMediaStream.audioTracks.forEach(audioTrack -> { - audioTrack.setVolume(Config.DEFAULT_VOLUME); audioTrack.setEnabled(true); }); } @@ -280,10 +280,6 @@ public class SessionClient extends Client { if(this.remoteMediaStream == null) { return; } - if(this.surfaceViewRenderer != null) { - // TODO:测试 - this.surfaceViewRenderer.pauseVideo(); - } this.remoteMediaStream.videoTracks.forEach(videoTrack -> { videoTrack.setEnabled(false); }); @@ -295,19 +291,14 @@ public class SessionClient extends Client { if(this.remoteMediaStream == null) { return; } - if(this.surfaceViewRenderer != null) { - // TODO:测试 - this.surfaceViewRenderer.disableFpsReduction(); - } this.remoteMediaStream.videoTracks.forEach(videoTrack -> { videoTrack.setEnabled(true); }); } - public void pause(String type) { + public void pauseLocal(String type) { if(MediaStreamTrack.AUDIO_TRACK_KIND.equals(type)) { this.mediaStream.audioTracks.forEach(audioTrack -> { - audioTrack.setVolume(0); audioTrack.setEnabled(false); }); } else if(MediaStreamTrack.VIDEO_TRACK_KIND.equals(type)) { @@ -318,10 +309,9 @@ public class SessionClient extends Client { } } - public void resume(String type) { + public void resumeLocal(String type) { if(MediaStreamTrack.AUDIO_TRACK_KIND.equals(type)) { this.mediaStream.audioTracks.forEach(audioTrack -> { - audioTrack.setVolume(Config.DEFAULT_VOLUME); audioTrack.setEnabled(true); }); } else if(MediaStreamTrack.VIDEO_TRACK_KIND.equals(type)) { @@ -332,6 +322,30 @@ public class SessionClient extends Client { } } + private void previewLocal() { + if(this.mediaStream == null) { + return; + } + this.mediaStream.videoTracks.forEach(videoTrack -> { + videoTrack.setEnabled(true); + if(this.localSurfaceViewRenderer == null) { + this.localSurfaceViewRenderer = this.mediaManager.buildSurfaceViewRenderer(Config.WHAT_NEW_LOCAL_VIDEO, videoTrack); + } + }); + } + + private void releaseLocal() { + // 释放本地视频资源 + if(this.localSurfaceViewRenderer != null) { + // 释放资源 + this.localSurfaceViewRenderer.release(); + // 移除资源:注意先释放再移除避免报错 + this.mainHandler.obtainMessage(Config.WHAT_REMOVE_VIDEO, this.localSurfaceViewRenderer).sendToTarget(); + // 设置为空 + this.localSurfaceViewRenderer = null; + } + } + @Override public void close() { synchronized (this) { @@ -339,14 +353,9 @@ public class SessionClient extends Client { return; } super.close(); + this.releaseLocal(); try { - // PeerConnection自动释放 -// if(this.mediaStream != null) { -// this.mediaStream.dispose(); -// } -// if(this.remoteMediaStream != null) { -// this.remoteMediaStream.dispose(); -// } + // PeerConnection自动释放:mediaStream、remoteMediaStream if(this.peerConnection != null) { this.peerConnection.dispose(); }