我正在尝试在现有的SwiftUI应用中实现Agora,我使用了本教程来实现它https://github.com/AgoraIO/Basic-Video-Call/tree/master/One-to-One-Video/Agora-iOS-Tutorial-SwiftUI-1to1 我的意图是进行OpenLive视频通话,在这里我只有一个广播员和很多观众可以观看它(类似于Instagram Live)。不幸的是,我只找到了有关如何进行1-1视频通话的文档,但无法让观众加入频道并预览实时视频流。
这是我的代码:
import SwiftUI
import AgoraRtcKit
var isCurrentStreamer = true
struct AgoraView : View {
@EnvironmentObject var userDefaultData: UserDefaultDetails
@State var isLocalInSession = true
@State var isLocalAudioMuted = false
@State var isRemoteInSession = true
@State var isRemoteVideoMuted = false
let localCanvas = VideoCanvas()
let remoteCanvas = VideoCanvas()
private let videoEngine = VideoEngine()
private var rtcEngine: AgoraRtcEngineKit {
get {
return videoEngine.agoraEngine
}
}
var body: some View {
ZStack() {
VideoSessionView(
backColor: Color("c2"),
backImage: Image("big_logo"),
hideCanvas: false,
canvas: isCurrentStreamer ? localCanvas:remoteCanvas
).edgesIgnoringSafeArea(.all)
}.onAppear {
self.agoraLive(role: self.userDefaultData.AgoraRole, channelID: self.userDefaultData.currentAuctionId)
}
}
}
fileprivate extension AgoraView {
func agoraLive(role: AgoraClientRole, channelID: String){
// init AgoraRtcEngineKit
videoEngine.AgoraView = self
rtcEngine.enableDualStreamMode(false)
rtcEngine.setVideoEncoderConfiguration(
AgoraVideoEncoderConfiguration(
size: AgoraVideoDimension640x360,
frameRate: .fps15,
bitrate: AgoraVideoBitrateStandard,
orientationMode: .adaptative
)
)
if role == .broadcaster {
rtcEngine.enableVideo()
addLocalSession()
rtcEngine.startPreview()
}else{
addLocalSession()
rtcEngine.startPreview()
}
rtcEngine.joinChannel(byToken: Token, channelId: channelID, info: nil, uid: 0, joinSuccess: nil)
// Step 6, set speaker audio route
rtcEngine.setEnableSpeakerphone(true)
}
func addLocalSession() {
let videoCanvas = AgoraRtcVideoCanvas()
if self.userDefaultData.AgoraRole == .broadcaster {
videoCanvas.view = localCanvas.rendererView
}else {
videoCanvas.view = remoteCanvas.rendererView
}
videoCanvas.renderMode = .hidden
if isCurrentStreamer {
rtcEngine.setupLocalVideo(videoCanvas)
}else{
rtcEngine.setupRemoteVideo(videoCanvas)
}
}
}
谢谢。
答案 0 :(得分:0)
您似乎没有正确连接远程视频视图。为了观看远程用户的视频,您需要使用该远程用户的UID创建一个AgoraRtcVideoCanvas
,然后将其传递到setupRemoteVideo
中。您正在做的是尝试在加入通话之前建立远程视图,并且不知道其中有谁。
您需要在AgoraRtcEngineDelegate
上实现remoteVideoStateChangedOfUid回调,以获取远程用户的UID并将其正确连接到画布上。
类似这样的东西:
extension AgoraView: AgoraRtcEngineDelegate {
func rtcEngine(_ engine: AgoraRtcEngineKit, remoteVideoStateChangedOfUid uid: UInt, state: AgoraVideoRemoteState, reason: AgoraVideoRemoteStateReason, elapsed: Int) {
if state == .starting {
let videoCanvas = AgoraRtcVideoCanvas()
videoCanvas.view = remoteCanvas.rendererView
videoCanvas.uid = uid
videoCanvas.renderMode = .hidden
rtcEngine.setupRemoteVideo(videoCanvas)
}
}
}
如果您按照上面的说明进行了上述操作,则还必须在初始化时将AgoraView设置为rtcEngine的委托。
如果您使用的是提供的演示应用程序,则当前将VideoEngine
设置为代理,并在firstRemoteVideoDecodedOfUid
(现已弃用)中进行此操作。此代码可能未正确连接到您的SwiftUI视图。