在iOS设备上的WebRTC上使用当前的AVCaptureSession

时间:2015-02-01 17:57:22

标签: ios avfoundation webrtc avcapturesession

我将解释我当前的项目以及我想做的事情。

当前项目: 我有一个iOS应用程序,正在录制视频并将其保存到磁盘。我正在使用Apple的Avfoundation库来记录并显示设备上的捕获屏幕。

我想这样做:

我想保留当前功能添加webrtc。问题是webrtc项目已经在使用AVCaptureSession,你不能在同一个应用程序上有两个会话。

我在问这个问题,但似乎很复杂。有人告诉我写一个cricket :: VideoCapturer的子类但是我不确定我是否需要在C ++中重写这个背后的每个类。另外我看到AvCapturesession是在rtc_video_capturer_ios.h中写的,但是我不明白如何从我当前的项目中将AVCaptureSession传递给这个类。

有没有人有这方面的例子?我需要一个方向。

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

如果你正在使用Google WebRTC库,有一种方法可以做到这一点,但我还没有一个完全稳定的解决方案。我在https://groups.google.com/forum/?fromgroups=&hl=sv#!topic/discuss-webrtc/8TgRy9YWvVc找到了这些信息,并且能够在我的代码中实现类似的功能。

查看RTCAVFoundationVideoSource,它包含一个可以使用的captureSession,它代表AVCaptureSession。

即使你没有使用谷歌的代码(我看到你参考板球?),你应该可以做类似的事情。

然后你可以尝试这样的事情:

<a href="http://bad/song/references"> <font size=10> getName(song)</font></a>

找到输出,保存对videoBufferDelegate的引用(即WebRTC发送videoBuffers的位置),然后添加自己的引用。

当您实现AVCaptureVideoDataOutputSampleBufferDelegate来处理(写入)缓冲区时,您需要实现以下内容:

    for output in sourceAVFoundation.captureSession.outputs {
        if let videoOutput = output as? AVCaptureVideoDataOutput {

            self.videoOutput = videoOutput
            NSLog("+++ FOUND A VIDEO OUTPUT: \(videoOutput) -> \(videoOutput.sampleBufferDelegate)")
            externalVideoBufferDelegate = videoOutput.sampleBufferDelegate
            videoOutput.setSampleBufferDelegate(self, queue: videoBufferDelegateQueue)
        }
    }

对缓冲区做任何你想做的事情,但重要的是将缓冲区转发到你之前保留引用的externalVideoBufferDelegate - 这使得WebRTC可以继续处理和转发视频帧。