[+] 拍照、录像控制
This commit is contained in:
@@ -4,7 +4,9 @@ import android.Manifest;
|
|||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
|
import android.content.res.ColorStateList;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
|
import android.graphics.Color;
|
||||||
import android.media.projection.MediaProjectionManager;
|
import android.media.projection.MediaProjectionManager;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
@@ -29,6 +31,7 @@ import com.acgist.taoyao.client.signal.Taoyao;
|
|||||||
import com.acgist.taoyao.media.MediaManager;
|
import com.acgist.taoyao.media.MediaManager;
|
||||||
import com.acgist.taoyao.media.VideoSourceType;
|
import com.acgist.taoyao.media.VideoSourceType;
|
||||||
import com.acgist.taoyao.media.config.Config;
|
import com.acgist.taoyao.media.config.Config;
|
||||||
|
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
@@ -180,7 +183,7 @@ public class MainActivity extends AppCompatActivity implements Serializable {
|
|||||||
}
|
}
|
||||||
this.threadHandler.post(() -> {
|
this.threadHandler.post(() -> {
|
||||||
// 进入房间
|
// 进入房间
|
||||||
Taoyao.taoyao.roomEnter("4f19f6fc-1763-499b-a352-d8c955af5a6e", null);
|
// Taoyao.taoyao.roomEnter("4f19f6fc-1763-499b-a352-d8c955af5a6e", null);
|
||||||
// Taoyao.taoyao.sessionCall("taoyao");
|
// Taoyao.taoyao.sessionCall("taoyao");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -216,6 +219,7 @@ public class MainActivity extends AppCompatActivity implements Serializable {
|
|||||||
Log.d(MainHandler.class.getSimpleName(), "Handler消息:" + message.what + " - " + message.obj);
|
Log.d(MainHandler.class.getSimpleName(), "Handler消息:" + message.what + " - " + message.obj);
|
||||||
switch (message.what) {
|
switch (message.what) {
|
||||||
case Config.WHAT_SCREEN_CAPTURE -> MainActivity.this.screenCapture(message);
|
case Config.WHAT_SCREEN_CAPTURE -> MainActivity.this.screenCapture(message);
|
||||||
|
case Config.WHAT_RECORD -> MainActivity.this.record(message);
|
||||||
case Config.WHAT_NEW_LOCAL_VIDEO,
|
case Config.WHAT_NEW_LOCAL_VIDEO,
|
||||||
Config.WHAT_NEW_REMOTE_VIDEO -> MainActivity.this.previewVideo(message);
|
Config.WHAT_NEW_REMOTE_VIDEO -> MainActivity.this.previewVideo(message);
|
||||||
case Config.WHAT_REMOVE_VIDEO -> MainActivity.this.removeVideo(message);
|
case Config.WHAT_REMOVE_VIDEO -> MainActivity.this.removeVideo(message);
|
||||||
@@ -233,6 +237,16 @@ public class MainActivity extends AppCompatActivity implements Serializable {
|
|||||||
this.activityResultLauncher.launch(this.mediaProjectionManager.createScreenCaptureIntent());
|
this.activityResultLauncher.launch(this.mediaProjectionManager.createScreenCaptureIntent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void record(Message message) {
|
||||||
|
final Resources resources = this.getResources();
|
||||||
|
final FloatingActionButton record = this.binding.record;
|
||||||
|
if(Boolean.TRUE.equals(message.obj)) {
|
||||||
|
record.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(R.color.purple_500, this.getTheme())));
|
||||||
|
} else {
|
||||||
|
record.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(R.color.teal_200, this.getTheme())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 预览用户视频
|
* 预览用户视频
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -537,6 +537,8 @@ public final class Taoyao implements ITaoyao {
|
|||||||
switch (header.getSignal()) {
|
switch (header.getSignal()) {
|
||||||
case "control::config::audio" -> this.controlConfigAudio(message, message.body());
|
case "control::config::audio" -> this.controlConfigAudio(message, message.body());
|
||||||
case "control::config::video" -> this.controlConfigVideo(message, message.body());
|
case "control::config::video" -> this.controlConfigVideo(message, message.body());
|
||||||
|
case "control::photograph" -> this.controlPhotograph(message, message.body());
|
||||||
|
case "control::record" -> this.controlRecord(message, message.body());
|
||||||
case "client::config" -> this.clientConfig(message, message.body());
|
case "client::config" -> this.clientConfig(message, message.body());
|
||||||
case "client::register" -> this.clientRegister(message, message.body());
|
case "client::register" -> this.clientRegister(message, message.body());
|
||||||
case "client::reboot" -> this.clientReboot(message, message.body());
|
case "client::reboot" -> this.clientReboot(message, message.body());
|
||||||
@@ -601,6 +603,21 @@ public final class Taoyao implements ITaoyao {
|
|||||||
this.mediaManager.updateVideoConfig(mediaVideoProperties);
|
this.mediaManager.updateVideoConfig(mediaVideoProperties);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void controlPhotograph(Message message, Map<String, Object> body) {
|
||||||
|
this.mediaManager.photograph();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void controlRecord(Message message, Map<String, Object> body) {
|
||||||
|
final Boolean enabled = MapUtils.getBoolean(body, "enabled");
|
||||||
|
if(Boolean.TRUE.equals(enabled)) {
|
||||||
|
this.mediaManager.startRecord();
|
||||||
|
} else {
|
||||||
|
this.mediaManager.stopRecord();
|
||||||
|
}
|
||||||
|
body.put("enabled", enabled);
|
||||||
|
this.push(message);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param message 消息
|
* @param message 消息
|
||||||
* @param body 消息主体
|
* @param body 消息主体
|
||||||
@@ -890,7 +907,8 @@ public final class Taoyao implements ITaoyao {
|
|||||||
if(sessionClient == null) {
|
if(sessionClient == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sessionClient.pause();
|
final String type = MapUtils.get(body, "type");
|
||||||
|
sessionClient.pause(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sessionResume(Message message, Map<String, Object> body) {
|
private void sessionResume(Message message, Map<String, Object> body) {
|
||||||
@@ -899,7 +917,8 @@ public final class Taoyao implements ITaoyao {
|
|||||||
if(sessionClient == null) {
|
if(sessionClient == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sessionClient.resume();
|
final String type = MapUtils.get(body, "type");
|
||||||
|
sessionClient.resume(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -632,6 +632,7 @@ public final class MediaManager {
|
|||||||
this.recordClient.start();
|
this.recordClient.start();
|
||||||
final VideoTrack videoTrack = this.peerConnectionFactory.createVideoTrack("TaoyaoVR", this.mainVideoSource);
|
final VideoTrack videoTrack = this.peerConnectionFactory.createVideoTrack("TaoyaoVR", this.mainVideoSource);
|
||||||
this.recordClient.source(videoTrack);
|
this.recordClient.source(videoTrack);
|
||||||
|
this.mainHandler.obtainMessage(Config.WHAT_RECORD, Boolean.TRUE).sendToTarget();
|
||||||
return this.recordClient;
|
return this.recordClient;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -643,6 +644,7 @@ public final class MediaManager {
|
|||||||
} else {
|
} else {
|
||||||
this.recordClient.close();
|
this.recordClient.close();
|
||||||
this.recordClient = null;
|
this.recordClient = null;
|
||||||
|
this.mainHandler.obtainMessage(Config.WHAT_RECORD, Boolean.FALSE).sendToTarget();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import org.webrtc.DataChannel;
|
|||||||
import org.webrtc.IceCandidate;
|
import org.webrtc.IceCandidate;
|
||||||
import org.webrtc.MediaConstraints;
|
import org.webrtc.MediaConstraints;
|
||||||
import org.webrtc.MediaStream;
|
import org.webrtc.MediaStream;
|
||||||
|
import org.webrtc.MediaStreamTrack;
|
||||||
import org.webrtc.PeerConnection;
|
import org.webrtc.PeerConnection;
|
||||||
import org.webrtc.PeerConnectionFactory;
|
import org.webrtc.PeerConnectionFactory;
|
||||||
import org.webrtc.SdpObserver;
|
import org.webrtc.SdpObserver;
|
||||||
@@ -292,6 +293,21 @@ public class SessionClient extends Client {
|
|||||||
this.pauseVideo();
|
this.pauseVideo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void pause(String type) {
|
||||||
|
if(MediaStreamTrack.AUDIO_TRACK_KIND.equals(type)) {
|
||||||
|
ListUtils.getOnlyOne(this.mediaStream.audioTracks, audioTrack -> {
|
||||||
|
audioTrack.setEnabled(false);
|
||||||
|
return audioTrack;
|
||||||
|
});
|
||||||
|
} else if(MediaStreamTrack.VIDEO_TRACK_KIND.equals(type)) {
|
||||||
|
ListUtils.getOnlyOne(this.mediaStream.videoTracks, videoTrack -> {
|
||||||
|
videoTrack.setEnabled(false);
|
||||||
|
return videoTrack;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void resume() {
|
public void resume() {
|
||||||
super.resume();
|
super.resume();
|
||||||
@@ -299,6 +315,21 @@ public class SessionClient extends Client {
|
|||||||
this.resumeVideo();
|
this.resumeVideo();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void resume(String type) {
|
||||||
|
if(MediaStreamTrack.AUDIO_TRACK_KIND.equals(type)) {
|
||||||
|
ListUtils.getOnlyOne(this.mediaStream.audioTracks, audioTrack -> {
|
||||||
|
audioTrack.setEnabled(true);
|
||||||
|
return audioTrack;
|
||||||
|
});
|
||||||
|
} else if(MediaStreamTrack.VIDEO_TRACK_KIND.equals(type)) {
|
||||||
|
ListUtils.getOnlyOne(this.mediaStream.videoTracks, videoTrack -> {
|
||||||
|
videoTrack.setEnabled(true);
|
||||||
|
return videoTrack;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void close() {
|
public void close() {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
|
|||||||
@@ -11,6 +11,10 @@ public class Config {
|
|||||||
* 屏幕捕获
|
* 屏幕捕获
|
||||||
*/
|
*/
|
||||||
public static final int WHAT_SCREEN_CAPTURE = 1000;
|
public static final int WHAT_SCREEN_CAPTURE = 1000;
|
||||||
|
/**
|
||||||
|
* 视频录制
|
||||||
|
*/
|
||||||
|
public static final int WHAT_RECORD = 1001;
|
||||||
/**
|
/**
|
||||||
* 新建本地音频
|
* 新建本地音频
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -6,11 +6,11 @@
|
|||||||
<p class="title">{{ client?.name || "" }}</p>
|
<p class="title">{{ client?.name || "" }}</p>
|
||||||
<div class="buttons" :style="{'--volume': client?.volume}">
|
<div class="buttons" :style="{'--volume': client?.volume}">
|
||||||
<el-button @click="taoyao.mediaConsumerResume(audioConsumer.id)" v-show="audioConsumer && audioConsumer.paused" type="primary" title="打开麦克风" :icon="Microphone" circle />
|
<el-button @click="taoyao.mediaConsumerResume(audioConsumer.id)" v-show="audioConsumer && audioConsumer.paused" type="primary" title="打开麦克风" :icon="Microphone" circle />
|
||||||
<el-button @click="taoyao.mediaConsumerPause(audioConsumer.id)" v-show="audioConsumer && !audioConsumer.paused" type="danger" title="关闭麦克风" :icon="Mute" circle />
|
<el-button @click="taoyao.mediaConsumerPause(audioConsumer.id)" v-show="audioConsumer && !audioConsumer.paused" type="danger" title="关闭麦克风" :icon="Mute" circle />
|
||||||
<el-button @click="taoyao.mediaConsumerResume(videoConsumer.id)" v-show="videoConsumer && videoConsumer.paused" type="primary" title="打开摄像头" :icon="VideoPlay" circle />
|
<el-button @click="taoyao.mediaConsumerResume(videoConsumer.id)" v-show="videoConsumer && videoConsumer.paused" type="primary" title="打开摄像头" :icon="VideoPlay" circle />
|
||||||
<el-button @click="taoyao.mediaConsumerPause(videoConsumer.id)" v-show="videoConsumer && !videoConsumer.paused" type="danger" title="关闭摄像头" :icon="VideoPause" circle />
|
<el-button @click="taoyao.mediaConsumerPause(videoConsumer.id)" v-show="videoConsumer && !videoConsumer.paused" type="danger" title="关闭摄像头" :icon="VideoPause" circle />
|
||||||
<el-button title="拍照" :icon="Camera" circle />
|
<el-button @click="taoyao.controlPhotograph(client.clientId)" title="拍照" :icon="Camera" circle />
|
||||||
<el-button title="录像" :icon="VideoCamera" circle />
|
<el-button @click="taoyao.controlRecord(client.clientId, (record = !record))" title="录像" :type="record ? 'danger' : ''" :icon="VideoCamera" circle />
|
||||||
<el-button title="媒体信息" :icon="InfoFilled" circle />
|
<el-button title="媒体信息" :icon="InfoFilled" circle />
|
||||||
<el-button @click="roomExpel" title="踢出" :icon="CircleClose" circle />
|
<el-button @click="roomExpel" title="踢出" :icon="CircleClose" circle />
|
||||||
</div>
|
</div>
|
||||||
@@ -48,6 +48,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
audio: null,
|
audio: null,
|
||||||
video: null,
|
video: null,
|
||||||
|
record: false,
|
||||||
audioStream: null,
|
audioStream: null,
|
||||||
videoStream: null,
|
videoStream: null,
|
||||||
dataConsumer: null,
|
dataConsumer: null,
|
||||||
|
|||||||
@@ -5,12 +5,12 @@
|
|||||||
<video ref="video"></video>
|
<video ref="video"></video>
|
||||||
<p class="title">{{ client?.name || "" }}</p>
|
<p class="title">{{ client?.name || "" }}</p>
|
||||||
<div class="buttons">
|
<div class="buttons">
|
||||||
<el-button @click="taoyao.mediaConsumerResume(audioConsumer.id)" v-show="stream" type="primary" title="打开麦克风" :icon="Microphone" circle />
|
<el-button @click="taoyao.sessionResume(client.id, 'audio')" v-show="audioStream && !client.remoteAudioEnabled" type="primary" title="打开麦克风" :icon="Microphone" circle />
|
||||||
<el-button @click="taoyao.mediaConsumerPause(audioConsumer.id)" v-show="stream" type="danger" title="关闭麦克风" :icon="Mute" circle />
|
<el-button @click="taoyao.sessionPause(client.id, 'audio')" v-show="audioStream && client.remoteAudioEnabled" type="danger" title="关闭麦克风" :icon="Mute" circle />
|
||||||
<el-button @click="taoyao.mediaConsumerResume(videoConsumer.id)" v-show="stream" type="primary" title="打开摄像头" :icon="VideoPlay" circle />
|
<el-button @click="taoyao.sessionResume(client.id, 'video')" v-show="videoStream && !client.remoteVideoEnabled" type="primary" title="打开摄像头" :icon="VideoPlay" circle />
|
||||||
<el-button @click="taoyao.mediaConsumerPause(videoConsumer.id)" v-show="stream" type="danger" title="关闭摄像头" :icon="VideoPause" circle />
|
<el-button @click="taoyao.sessionPause(client.id, 'video')" v-show="videoStream && client.remoteVideoEnabled" type="danger" title="关闭摄像头" :icon="VideoPause" circle />
|
||||||
<el-button title="拍照" :icon="Camera" circle />
|
<el-button @click="taoyao.controlPhotograph(client.clientId)" title="拍照" :icon="Camera" circle />
|
||||||
<el-button title="录像" :icon="VideoCamera" circle />
|
<el-button @click="taoyao.controlRecord(client.clientId, (record = !record))" title="录像" :type="record ? 'danger' : ''" :icon="VideoCamera" circle />
|
||||||
<el-button @click="close" title="踢出" :icon="CircleClose" circle />
|
<el-button @click="close" title="踢出" :icon="CircleClose" circle />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -47,7 +47,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
audio: null,
|
audio: null,
|
||||||
video: null,
|
video: null,
|
||||||
stream: null,
|
record: false,
|
||||||
audioStream: null,
|
audioStream: null,
|
||||||
videoStream: null,
|
videoStream: null,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -177,6 +177,8 @@ const signalChannel = {
|
|||||||
},
|
},
|
||||||
/**
|
/**
|
||||||
* 重连
|
* 重连
|
||||||
|
* TODO:重连重建会话、房间
|
||||||
|
* TODO:断开释放所有资源
|
||||||
*/
|
*/
|
||||||
reconnect() {
|
reconnect() {
|
||||||
const me = this;
|
const me = this;
|
||||||
@@ -245,12 +247,16 @@ class Session {
|
|||||||
localStream;
|
localStream;
|
||||||
// 本地音频
|
// 本地音频
|
||||||
localAudioTrack;
|
localAudioTrack;
|
||||||
|
localAudioEnabled;
|
||||||
// 本地视频
|
// 本地视频
|
||||||
localVideoTrack;
|
localVideoTrack;
|
||||||
|
localVideoEnabled;
|
||||||
// 远程音频
|
// 远程音频
|
||||||
remoteAudioTrack;
|
remoteAudioTrack;
|
||||||
|
remoteAudioEnabled;
|
||||||
// 远程视频
|
// 远程视频
|
||||||
remoteVideoTrack;
|
remoteVideoTrack;
|
||||||
|
remoteVideoEnabled;
|
||||||
// PeerConnection
|
// PeerConnection
|
||||||
peerConnection;
|
peerConnection;
|
||||||
|
|
||||||
@@ -266,18 +272,56 @@ class Session {
|
|||||||
this.sessionId = sessionId;
|
this.sessionId = sessionId;
|
||||||
}
|
}
|
||||||
|
|
||||||
async pause() {
|
async pause(type) {
|
||||||
this.localAudioTrack.enabled = false;
|
if(type === 'audio') {
|
||||||
this.localVideoTrack.enabled = false;
|
this.localAudioEnabled = false;
|
||||||
|
this.localAudioTrack.enabled = false;
|
||||||
|
}
|
||||||
|
if(type === 'video') {
|
||||||
|
this.localVideoEnabled = false;
|
||||||
|
this.localVideoTrack.enabled = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async resume() {
|
async resume(type) {
|
||||||
this.localAudioTrack.enabled = true;
|
if(type === 'audio') {
|
||||||
this.localVideoTrack.enabled = true;
|
this.localAudioEnabled = true;
|
||||||
|
this.localAudioTrack.enabled = true;
|
||||||
|
}
|
||||||
|
if(type === 'video') {
|
||||||
|
this.localVideoEnabled = true;
|
||||||
|
this.localVideoTrack.enabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async pauseRemote(type) {
|
||||||
|
if(type === 'audio') {
|
||||||
|
this.remoteAudioEnabled = false;
|
||||||
|
this.remoteAudioTrack.enabled = false;
|
||||||
|
}
|
||||||
|
if(type === 'video') {
|
||||||
|
this.remoteVideoEnabled = false;
|
||||||
|
this.remoteVideoTrack.enabled = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async resumeRemote(type) {
|
||||||
|
if(type === 'audio') {
|
||||||
|
this.remoteAudioEnabled = true;
|
||||||
|
this.remoteAudioTrack.enabled = true;
|
||||||
|
}
|
||||||
|
if(type === 'video') {
|
||||||
|
this.remoteVideoEnabled = true;
|
||||||
|
this.remoteVideoTrack.enabled = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async close() {
|
async close() {
|
||||||
this.closed = true;
|
this.closed = true;
|
||||||
|
this.localAudioEnabled = false;
|
||||||
|
this.localVideoEnabled = false;
|
||||||
|
this.remoteAudioEnabled = false;
|
||||||
|
this.remoteVideoEnabled = false;
|
||||||
this.localAudioTrack.stop();
|
this.localAudioTrack.stop();
|
||||||
this.localVideoTrack.stop();
|
this.localVideoTrack.stop();
|
||||||
this.remoteAudioTrack.stop();
|
this.remoteAudioTrack.stop();
|
||||||
@@ -830,6 +874,34 @@ class Taoyao extends RemoteClient {
|
|||||||
console.info("关闭终端");
|
console.info("关闭终端");
|
||||||
window.close();
|
window.close();
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* 拍照
|
||||||
|
*
|
||||||
|
* @param {*} clientId
|
||||||
|
*/
|
||||||
|
controlPhotograph(clientId) {
|
||||||
|
const me = this;
|
||||||
|
me.push(
|
||||||
|
protocol.buildMessage("control::photograph", {
|
||||||
|
to: clientId
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 录像
|
||||||
|
*
|
||||||
|
* @param {*} clientId
|
||||||
|
* @param {*} enabled
|
||||||
|
*/
|
||||||
|
controlRecord(clientId, enabled) {
|
||||||
|
const me = this;
|
||||||
|
me.push(
|
||||||
|
protocol.buildMessage("control::record", {
|
||||||
|
to: clientId,
|
||||||
|
enabled: enabled
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* 终端音量信令
|
* 终端音量信令
|
||||||
*
|
*
|
||||||
@@ -2210,22 +2282,48 @@ class Taoyao extends RemoteClient {
|
|||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
async sessionPause(sessionId, type) {
|
||||||
|
const me = this;
|
||||||
|
const session = me.sessionClients.get(sessionId);
|
||||||
|
if(!session) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
me.push(protocol.buildMessage("session::pause", {
|
||||||
|
type,
|
||||||
|
sessionId
|
||||||
|
}));
|
||||||
|
session.pauseRemote(type);
|
||||||
|
}
|
||||||
|
|
||||||
async defaultSessionPause(message) {
|
async defaultSessionPause(message) {
|
||||||
const me = this;
|
const me = this;
|
||||||
const { sessionId } = message.body;
|
const { type, sessionId } = message.body;
|
||||||
const session = me.sessionClients.get(sessionId);
|
const session = me.sessionClients.get(sessionId);
|
||||||
if(session) {
|
if(session) {
|
||||||
session.pause();
|
session.pause(type);
|
||||||
|
} else {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async sessionResume(sessionId, type) {
|
||||||
|
const me = this;
|
||||||
|
const session = me.sessionClients.get(sessionId);
|
||||||
|
if(!session) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
me.push(protocol.buildMessage("session::resume", {
|
||||||
|
type,
|
||||||
|
sessionId
|
||||||
|
}));
|
||||||
|
session.resumeRemote(type);
|
||||||
|
}
|
||||||
|
|
||||||
async defaultSessionResume(message) {
|
async defaultSessionResume(message) {
|
||||||
const me = this;
|
const me = this;
|
||||||
const { sessionId } = message.body;
|
const { type, sessionId } = message.body;
|
||||||
const session = me.sessionClients.get(sessionId);
|
const session = me.sessionClients.get(sessionId);
|
||||||
if(session) {
|
if(session) {
|
||||||
session.resume();
|
session.resume(type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2240,8 +2338,10 @@ class Taoyao extends RemoteClient {
|
|||||||
const track = event.track;
|
const track = event.track;
|
||||||
if(track.kind === 'audio') {
|
if(track.kind === 'audio') {
|
||||||
session.remoteAudioTrack = track;
|
session.remoteAudioTrack = track;
|
||||||
|
session.remoteAudioEnabled = true;
|
||||||
} else if(track.kind === 'video') {
|
} else if(track.kind === 'video') {
|
||||||
session.remoteVideoTrack = track;
|
session.remoteVideoTrack = track;
|
||||||
|
session.remoteVideoEnabled = true;
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
if(session.proxy && session.proxy.media) {
|
if(session.proxy && session.proxy.media) {
|
||||||
@@ -2268,7 +2368,9 @@ class Taoyao extends RemoteClient {
|
|||||||
session.localStream = localStream;
|
session.localStream = localStream;
|
||||||
session.peerConnection = peerConnection;
|
session.peerConnection = peerConnection;
|
||||||
session.localAudioTrack = localStream.getAudioTracks()[0];
|
session.localAudioTrack = localStream.getAudioTracks()[0];
|
||||||
|
session.localAudioEnabled = true;
|
||||||
session.localVideoTrack = localStream.getVideoTracks()[0];
|
session.localVideoTrack = localStream.getVideoTracks()[0];
|
||||||
|
session.localVideoEnabled = true;
|
||||||
await session.peerConnection.addTrack(session.localAudioTrack, localStream);
|
await session.peerConnection.addTrack(session.localAudioTrack, localStream);
|
||||||
await session.peerConnection.addTrack(session.localVideoTrack, localStream);
|
await session.peerConnection.addTrack(session.localVideoTrack, localStream);
|
||||||
return peerConnection;
|
return peerConnection;
|
||||||
|
|||||||
@@ -92,13 +92,13 @@ public abstract class ClientAdapter<T extends AutoCloseable> implements Client {
|
|||||||
try {
|
try {
|
||||||
request.wait(this.timeout);
|
request.wait(this.timeout);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
log.error("媒体服务等待响应异常:{}", request, e);
|
log.error("终端等待响应异常:{}", request, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
final Message response = this.requestMessage.remove(id);
|
final Message response = this.requestMessage.remove(id);
|
||||||
if (response == null || request.equals(response)) {
|
if (response == null || request.equals(response)) {
|
||||||
log.warn("媒体服务没有响应:{}", request);
|
log.warn("终端没有响应:{}", request);
|
||||||
throw MessageCodeException.of(MessageCode.CODE_2001, "媒体服务没有响应");
|
throw MessageCodeException.of(MessageCode.CODE_2001, "终端没有响应");
|
||||||
}
|
}
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user