- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现允许在 Android 应用程序的视频 session 中间切换屏幕共享捕获和相机的功能。我使用适用于 Android 的 OpenTok SDK 2.5。
我研究了 OpenTok 示例 (OpenTok samples) 并认为它们仅显示每个程序示例的一个功能。
问题:代码是否应该提供两个发布者(一个配备相机,一个配备屏幕共享捕获器)并切换它们,例如
session.unpublish();
if (currentIsCamera) {
session.publish(screenSharingPublisher);
}
else {
session.publish(cameraPublisher);
}
mPublisher.setPublishVideo(false);
BaseVideoCapturer bvc = mPublisher.getCapturer();
if(bvc != null){
bvc.destroy();
}
//intent to start picture capture (Ex. ACTION_IMAGE_CAPTURE)
BaseVideoCapturer bvc = mPublisher.getCapturer();
if(bvc != null){
if(bvc.isCaptureStarted() == false){
bvc.init();
bvc.startCapture();
mPublisher.setPublishVideo(true);
}
}
最佳答案
在文档就绪时调用视频发布方法
var apiKey = '<APP_KEY>';
var sessionId = '<Session ID >';//Server Side Values
var token = '<Token >';//Server Side Values
var isModerator = <Yes/No>;//Handle it on server Side
var publisher;
var screenPublisher;
var streamMode = "camera";
session = OT.initSession(apiKey, sessionId);
publishVideo();
sessionEvents(publisher);
connectSession();
<div id="subscribers" class="container-fluid show-controls">
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div classs="live-stream">
<div class="caller-list">
<ul>
<li class="">
<div id="publisher" class="draggable user-camscreen">
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="controls" id="">
<div>
<button id="btnShareScreen" data-screen="0" class="">
<img src="~/Content/img/Student/screenshare.svg" class="screenshare" />
</button>
<p class="mb-none mt-xs text-sm line-height-xs text-white">Screen</p>
</div>
</div>
/*
Switching between camera and screen
*/
$("#btnShareScreen").on("click", function () {
el = $(this);
if (el.data('screen') == 0) {
//Publish Screen
publishScreen();
connectSession();
el.data('screen', '1');
el.find('img').attr('src', '/Content/img/Student/video-icon.svg');
el.parent().find('p').html("Camera");
}
else {
publishVideo();
connectSession();
el.data('screen', '0');
el.find('img').attr('src', '/Content/img/Student/screenshare.svg');
el.parent().find('p').html("Screen");
}
});
function publishVideo() {
console.log(screenPublisher);
if (screenPublisher != undefined) {
endStream(screenPublisher);
}
createPublisherDiv();
publisher = OT.initPublisher('publisher', function (error) {
if (error) {
// Look at error.message to see what went wrong.
} else {
session.publish(publisher, function (error) {
if (error) {
// Look error.message to see what went wrong.
} else {
streamMode = "camera";
}
});
}
});
}
function publishScreen() {
OT.checkScreenSharingCapability(function (response) {
if (!response.supported || response.extensionRegistered === false) {
// This browser does not support screen sharing.
$.alert({
title: 'Alert!',
content: 'Your Browser Does Not Support Screen Sharing',
});
} else if (response.extensionInstalled === false) {
// Prompt to install the extension.
} else {
//Screen sharing available
endStream(publisher);
createPublisherDiv();
const publish = Promise.all([
OT.getUserMedia({
videoSource: 'screen'
}),
OT.getUserMedia({
videoSource: null
})
]).then(([screenStream, micStream]) => {
return screenPublisher = OT.initPublisher('publisher', {
videoSource: screenStream.getVideoTracks()[0],
audioSource: micStream.getAudioTracks()[0],
fitMode: "contain"
});
});
publish.then(screenPublisher => {
session.publish(screenPublisher, function (error) {
if (error) {
// Look error.message to see what went wrong.
} else {
streamMode = "screen";
}
});
}).catch(handleError);
}
});
}
function endStream(streamPublisher) {
session.unpublish(streamPublisher, function () {
//Call back
});
}
function connectSession() {
session.connect(token, function (error) {
if (error) {
console.error('Failed to connect', error);
}
});
}
function sessionEvents(streamPublisher) {
session.on({
sessionConnected: function (event) {
// Publish the publisher we initialzed earlier (this will trigger 'streamCreated' on other
// clients)
session.publish(streamPublisher, function (error) {
if (error) {
console.error('Failed to publish', error);
} else {
console.log("Publish success");
}
});
},
// This function runs when another client publishes a stream (eg. session.publish())
streamCreated: function (event) {
// Create a container for a new Subscriber, assign it an id using the streamId, put it inside
// the element with id="subscribers"
console.log(event.stream);
var subOptions = {
width: '100%', height: '100%'
};
var subContainer = document.createElement('div');
subContainer.id = 'stream-' + event.stream.streamId;
document.getElementById('subscribers').appendChild(subContainer);
// Subscribe to the stream that caused this event, put it inside the container we just made
subscriber = session.subscribe(event.stream, subContainer, subOptions, function (error) {
if (error) {
console.error('Failed to subscribe', error);
}
});
}
});
}
/*
OpenTok Unpublish Methods removes publisher div.That's why dynamically creating div
*/
function createPublisherDiv() {
$('.caller-list').find('li').empty();
var html = '<div id="publisher" class="draggable user-camscreen"></div>';
$('.caller-list').find('li').append(html);
}
function handleError(err) {
if (err) console.log(err.message);
}
关于android - OpenTok,如何将发布者源从屏幕捕获器切换到相机,反之亦然?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30958708/
因此,我使用 OpenTok 在我的社区网站上创建了一个流媒体应用程序。这真的很棒,但有一些用例,我的一些社区目前通过 YouTube 进行流式传输,并且有一个使用 RTMP 的设置。他们不一定想使用
我是第一次尝试使用 OpenTok。我正在做的只是尝试运行 Open-Tok 提供的示例 Hello-World 项目。 我正在使用 Xcode 5,我已将我的项目 Target 设置为 7。我还检查
您的 tokbox maven 有问题吗?因为从今天早上开始我无法编译我的项目,我有这个错误: 找不到 com.opentok.android:opentok-android-sdk:2.8.+ 的任
有没有人使用过(或贡献过)opentok-react-native 和 react-native-opentok?寻找通用视频 session 应用更好维护或更好选择的一些观点。 两者似乎都是最近才更
我一直在尝试获取 OpenTok Android hello world工作,但它在启动时不断崩溃。导入Hello world项目后,我将opentok android sdk复制到项目中,在ecli
我正在使用THIS opentok 演示应用程序,具有聊天、存档、屏幕共享等功能,但我一直停留在屏幕共享上。 对于屏幕共享,它需要一个 chrome 扩展,并且我成功构建了该扩展并将该 Extensi
我正在使用 opentok 库 compile 'com.opentok.android:opentok-android-sdk:2.9.+' 并在我的 build.gradle 文件中添加了
我正在使用 OpenTok 的 js 库为我的 Web 应用程序实现网络测试。 为此,我创建了一个发布者,连接到 session ,然后让订阅者连接到发布者的流。 该测试适用于其他浏览器(我已经测试过
我之前问过一个相关的问题 OpenTok - How to publish/unpublish manually? 现在我正在努力手动取消订阅。 http://www.tokbox.com/opent
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 9 年前。 Improve
是否可以知道有多少人连接到一个 session ?我希望实现一种只允许两个人连接的机制,如果超过两个人,将显示一个警报。 最佳答案 当您获得 sessionConnected 事件时,您将获得一组连接
我尝试使用 opentok JS 客户端创建一个屏幕共享应用程序,该客户端也共享发布者的音频。 屏幕共享工作正常。但音频永远不会共享。 现在,我注意到控制台 (Firefox) 中有一条警告说 Inv
我正在使用 OpenTok 构建视频聊天网站。我有视频和文本聊天功能,(仍在进行屏幕共享),但我想知道是否有人可以为我指出关于文件共享的正确方向? 我希望双方能够相互发送文件,但不确定如何去做。可以使
我使用 opentok 创建了在线教育视频门户。学生人数请看老师视频。老师也会看到所有已连接学生的视频。使用以下代码我可以阻止自己订阅:- function subscribeToStreams(st
我目前正在开发一个使用 OpenTok text-chat signal api 的聊天应用程序。我面临的问题是,当网络中断时,如果 api 无法在短时间内重新连接,则 api 会尝试在很短的时间内重
我正在使用 OpenTok 为 iPad/iPhone 开发应用程序。当设备处于纵向时,user.stream.videoDimensions.width 给出640 和user.stream.vid
我面临着存档成本的问题,因为录音非常重要,那么有什么方法可以在不使用 opentok startArchive 方法的情况下将视频流存储到服务器上 问候, 最佳答案 答案 1 是准确的;或者,您可以开
我正在使用 opentok(tokbox) 作为视频聊天应用程序。我尝试了开发人员提供的快速代码。当我在设备中运行代码时,发布者和订阅者都只显示设备的摄像头输入。我尝试使用具有相同 session 和
我想知道如何获取订阅者视频源的屏幕截图。我看到表示视频流的 Stream 对象被传递到订阅者的构造函数中,但我不知道如何利用它来将当前帧转换为位图。和想法? 提前致谢! 最佳答案 要获取订阅者图像的
我正在尝试使用 opentok 为网站上的用户生成 session ID。 我正在使用 opentok 网站上的教程来创建 session ID (https://github.com/opentok
我是一名优秀的程序员,十分优秀!