背景
最近项目需要接入直播系统,在调研了多家平台后,发现部分公司的针对electron的sdk存在一些问题,如适配的electron版本较低或sdk本身存在问题,所以使用了web的sdk,然而web的sdk在进行屏幕分享时存在一个权限问题,直接上教程:
在electron中使用屏幕分享
1.使用electron提供的接口获取桌面窗口信息
import { desktopCapturer
} from 'electron'
desktopCapturer
.getSources({ types
: ['window', 'screen'] }).then(
sources
=>{
consolo
.log(sources
)
})
2.获取需要的媒体流
2.1 获取指定窗口的媒体流
const source
= sources
.find(item
=> item
.name
=== 'QQ音乐')
navigator
.mediaDevices
.getUserMedia({
audio
: false,
video
: {
mandatory
: {
chromeMediaSource
: 'desktop',
chromeMediaSourceId
: source
.id
}
}
}).then(stream
=> {
console
.log(stream
)
})
2.2 从整个桌面同时捕获音频和视频
navigator
.mediaDevices
.getUserMedia({
audio
: {
mandatory
: {
chromeMediaSource
: 'desktop'
}
},
video
: {
mandatory
: {
chromeMediaSource
: 'desktop'
}
}
}).then(stream
=> {
console
.log(stream
)
})
2.3 本地预览
function previewStream (stream
) {
const video
= document
.querySelector('video')
video
.srcObject
= stream
video
.onloadedmetadata = (e
) => video
.play()
}
3.获取当前媒体流的音视频轨信息
第三方提供的sdk一般存在两种方式获取媒体流信息,这里主要分享第二种方式
第一种 sdk的api,针对这种情况,如果你使用的是electron的sdk,并且它的sdk可以在你的应用上正常使用(怨念颇深!),那么这种方式是最好的第二种 在使用第三方的创建媒体流函数时传递的参数换成音视频轨信息(调研了市面上的8,9家平台,在这一步都是支持使用音视频轨信息的),直接上代码,这里以腾讯的sdk举例!
this.shareStream
= TRTC.createStream({
audioSource
: stream
.getAudioTracks()[0],
videoSource
: stream
.getVideoTracks()[0]
})
完整代码
import { desktopCapturer
} from 'electron'
function getScreens() {
desktopCapturer
.getSources({ types
: ['window', 'screen'] }).then(
sources
=> {
const source
= sources
.find(item
=> item
.name
=== 'QQ音乐')
getInitStream(source
)
})
}
function getInitStream(source
) {
navigator
.mediaDevices
.getUserMedia({
audio
: false,
video
: {
mandatory
: {
chromeMediaSource
: 'desktop',
chromeMediaSourceId
: source
.id
}
}
}).then(stream
=> {
getSdkStream(stream
)
})
}
function getSdkStream(stream
) {
this.shareStream
= TRTC.createStream({
audioSource
: stream
.getAudioTracks()[0],
videoSource
: stream
.getVideoTracks()[0]
})
}