Agora SwiftUI OpenLive集成问题

时间:2020-07-30 00:16:55

标签: swift xcode swiftui agora.io

我正在尝试在现有的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)
        }
    }
}

谢谢。

1 个答案:

答案 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视图。