如何在CoreVideo直播流会话中添加交互式UIView(例如倒数计时器)

时间:2018-03-27 16:18:09

标签: swift core-video

我正在关注从iPhone启动Facebook直播会话的示例快速代码:

override func viewDidLoad() {
    super.viewDidLoad()

    liveButton.layer.cornerRadius = 15

    session = VCSimpleSession(videoSize: CGSize(width: 1280, height: 720), frameRate: 30, bitrate: 4000000, useInterfaceOrientation: false)
    contentView.addSubview(session.previewView)
    session.previewView.frame = contentView.bounds
    session.delegate = self
}

func startFBLive() {
    if FBSDKAccessToken.current() != nil {
        FBLiveAPI.shared.startLive(privacy: livePrivacy) { result in
            guard let streamUrlString = (result as? NSDictionary)?.value(forKey: "stream_url") as? String else {
                return
            }
            let streamUrl = URL(string: streamUrlString)

            guard let lastPathComponent = streamUrl?.lastPathComponent,
                let query = streamUrl?.query else {
                    return
            }

            self.session.startRtmpSession(
                withURL: "rtmp://rtmp-api.facebook.com:80/rtmp/",
                andStreamKey: "\(lastPathComponent)?\(query)"
            )

            self.livePrivacyControl.isUserInteractionEnabled = false
        }
    } else {
        fbLogin()
    }
}

此代码会正确地将相机视频输入到Facebook。

但是,我应该如何覆盖UIView,例如倒计时文本在摄像机输入上面?我并不是说在手机上本地显示UIView,我的意思是将UIView叠加到视频源中,以便UIView流入Facebook Live流,并且其他设备上的其他直播观看者也可以看到。

我可以看到VCSimpleSession有这个方法:

addPixelBufferSource: (UIImage*) image
                     withRect: (CGRect) rect;

但这可能不是我想要的,因为我需要添加一个倒计时文本......任何想法?

2 个答案:

答案 0 :(得分:1)

如果没有VCSimpleSession或FBAPI(您可以链接到教程?或示例项目),这并不容易

从某些研究来看,VCSimpleSession似乎有来自相机Feed的previewLayer。

因此,您可以创建标签,将其添加到相机预览图层并以某个间隔(此处为每秒)更新一次。请参阅以下代码:

private var elapsedTime : TimeInterval = 0.0
private var timer: Timer?
private var timerLabel: UILabel!


private func startTimer() {
    guard timer == nil else { return }
    session.previewLayer.layer.addSublayer(timerLabel.layer)
    timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
}

@objc private func updateTimer() {
    elapsedTime += 1
    let minutes = Int(elapsedTime / 60)
    let seconds = Int(elapsedTime.truncatingRemainder(dividingBy: 60))

    timerLabel.text = String.init(format:"%02d:%02d", minutes, seconds)

}

private func stopTimer(){
    timer?.invalidate()
    timer = nil
}

答案 1 :(得分:-1)

当开始直播会话时

  • 在父视图上添加UILabel的UIView(倒计时视图)。
  • 使用计时器更改UILabel文本。
  • 必须是具有透明背景的UIView(倒计时视图)。

可能是你的问题将得到解决。

enter image description here