[+] 信令断开释放媒体

This commit is contained in:
acgist
2023-04-30 11:33:06 +08:00
parent 3cbbc8f936
commit 165655c4e6
89 changed files with 343 additions and 181 deletions

View File

@@ -6,7 +6,6 @@ import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.Color;
import android.media.projection.MediaProjectionManager;
import android.os.Bundle;
import android.os.Handler;
@@ -27,7 +26,6 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import com.acgist.taoyao.client.databinding.ActivityMainBinding;
import com.acgist.taoyao.client.signal.Taoyao;
import com.acgist.taoyao.media.MediaManager;
import com.acgist.taoyao.media.VideoSourceType;
import com.acgist.taoyao.media.config.Config;
@@ -53,6 +51,8 @@ public class MainActivity extends AppCompatActivity implements Serializable {
protected void onCreate(Bundle bundle) {
Log.i(MainActivity.class.getSimpleName(), "onCreate");
super.onCreate(bundle);
// 强制横屏
// this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
this.requestPermission();
this.launchMediaService();
this.setTurnScreenOn(true);
@@ -216,7 +216,7 @@ public class MainActivity extends AppCompatActivity implements Serializable {
@Override
public void handleMessage(@NonNull Message message) {
super.handleMessage(message);
Log.d(MainHandler.class.getSimpleName(), "Handler消息" + message.what + " - " + message.obj);
Log.d(MainHandler.class.getSimpleName(), "Handler消息" + message.what);
switch (message.what) {
case Config.WHAT_SCREEN_CAPTURE -> MainActivity.this.screenCapture(message);
case Config.WHAT_RECORD -> MainActivity.this.record(message);
@@ -270,6 +270,9 @@ public class MainActivity extends AppCompatActivity implements Serializable {
final GridLayout video = this.binding.video;
final SurfaceView surfaceView = (SurfaceView) message.obj;
final int index = video.indexOfChild(surfaceView);
if(index < 0) {
return;
}
video.removeViewAt(index);
}
}

View File

@@ -184,13 +184,13 @@ public final class Taoyao implements ITaoyao {
*/
private final MediaManager mediaManager;
/**
* 房间列表
* 视频房间列表
*/
private final Map<String, Room> rooms;
/**
* 会话终端列表
* 视频会话列表
*/
private final Map<String, SessionClient> sessionClients;
private final Map<String, SessionClient> sessions;
/**
* 全局静态变量
*/
@@ -240,7 +240,7 @@ public final class Taoyao implements ITaoyao {
this.heartbeatHandler.postDelayed(this::heartbeat, 30L * 1000);
this.mediaManager = MediaManager.getInstance();
this.rooms = new ConcurrentHashMap<>();
this.sessionClients = new ConcurrentHashMap<>();
this.sessions = new ConcurrentHashMap<>();
Taoyao.taoyao = this;
}
@@ -441,6 +441,24 @@ public final class Taoyao implements ITaoyao {
this.input = null;
this.output = null;
this.socket = null;
this.closeRoomMedia();
this.closeSessionMedia();
}
private void closeRoomMedia() {
Log.i(Taoyao.class.getSimpleName(), "释放所有视频房间");
this.rooms.forEach((k, v) -> {
v.close();
});
this.rooms.clear();
}
private void closeSessionMedia() {
Log.i(Taoyao.class.getSimpleName(), "释放所有视频会话");
this.sessions.forEach((k, v) -> {
v.close();
});
this.sessions.clear();
}
/**
@@ -457,7 +475,7 @@ public final class Taoyao implements ITaoyao {
this.messageThread.quitSafely();
this.executeThread.quitSafely();
this.rooms.values().forEach(Room::close);
this.sessionClients.values().forEach(SessionClient::close);
this.sessions.values().forEach(SessionClient::close);
}
/**
@@ -624,7 +642,7 @@ public final class Taoyao implements ITaoyao {
*/
private void clientConfig(Message message, Map<String, Object> body) {
final MediaProperties mediaProperties = JSONUtils.toJava(JSONUtils.toJSON(body.get("media")), MediaProperties.class);
this.mediaManager.updateMediaConfig(mediaProperties, mediaProperties.getAudio(), mediaProperties.getVideo());
this.mediaManager.updateMediaConfig(mediaProperties);
final WebrtcProperties webrtcProperties = JSONUtils.toJava(JSONUtils.toJSON(body.get("webrtc")), WebrtcProperties.class);
this.mediaManager.updateWebrtcConfig(webrtcProperties);
}
@@ -853,7 +871,7 @@ public final class Taoyao implements ITaoyao {
this.mediaManager.getMediaProperties(),
this.mediaManager.getWebrtcProperties()
);
this.sessionClients.put(sessionId, sessionClient);
this.sessions.put(sessionId, sessionClient);
}
);
}
@@ -877,14 +895,14 @@ public final class Taoyao implements ITaoyao {
this.mediaManager.getMediaProperties(),
this.mediaManager.getWebrtcProperties()
);
this.sessionClients.put(sessionId, sessionClient);
this.sessions.put(sessionId, sessionClient);
sessionClient.init();
sessionClient.offer();
}
private void sessionClose(Message message, Map<String, Object> body) {
final String sessionId = MapUtils.get(body, "sessionId");
final SessionClient sessionClient = this.sessionClients.remove(sessionId);
final SessionClient sessionClient = this.sessions.remove(sessionId);
if(sessionClient == null) {
return;
}
@@ -893,7 +911,7 @@ public final class Taoyao implements ITaoyao {
private void sessionExchange(Message message, Map<String, Object> body) {
final String sessionId = MapUtils.get(body, "sessionId");
final SessionClient sessionClient = this.sessionClients.get(sessionId);
final SessionClient sessionClient = this.sessions.get(sessionId);
if(sessionClient == null) {
Log.w(Taoyao.class.getSimpleName(), "会话交换无效会话:" + sessionId);
return;
@@ -903,7 +921,7 @@ public final class Taoyao implements ITaoyao {
private void sessionPause(Message message, Map<String, Object> body) {
final String sessionId = MapUtils.get(body, "sessionId");
final SessionClient sessionClient = this.sessionClients.get(sessionId);
final SessionClient sessionClient = this.sessions.get(sessionId);
if(sessionClient == null) {
return;
}
@@ -913,7 +931,7 @@ public final class Taoyao implements ITaoyao {
private void sessionResume(Message message, Map<String, Object> body) {
final String sessionId = MapUtils.get(body, "sessionId");
final SessionClient sessionClient = this.sessionClients.get(sessionId);
final SessionClient sessionClient = this.sessions.get(sessionId);
if(sessionClient == null) {
return;
}