2015-02-01 1 views
4

Я расскажу о своем текущем проекте и о том, что я хочу сделать.Использовать текущий AVCaptureSession на WebRTC на устройствах iOS

Текущий проект: У меня есть приложение iOS, которое в настоящее время записывает видео и сохраняет его на диск. Я использую библиотеки Avfoundation от Apple для записи и отображения экрана захвата на устройстве.

Я хочу сделать:

Я хочу, чтобы сохранить текущую функциональность добавления WebRTC. Проблема в том, что проект webrtc уже использует AVCaptureSession, и у вас не может быть двух сеансов в одном приложении.

Я спрашивал об этом, но, похоже, сложно. Кто-то рассказал мне о написании подкласса cricket :: VideoCapturer, но я не уверен, что мне нужно переписать каждый класс за этим на C++. Также я видел, что AvCapturesession написано в файле rtc_video_capturer_ios.h, но я не понимаю, как передать свой AVCaptureSession этому классу из моего текущего проекта.

У кого-нибудь есть пример этого? Мне нужна ориентация.

Большое спасибо за помощь.

+0

не знаком с этой библиотекой. Но если он предоставит вам файл .m, вы можете просто добавить слой предварительного просмотра. – user523234

+0

Проблема заключается в том, что библиотека webrtc создает Avcaptureession внутренне, и у меня есть еще один Avcaptureession в моем проекте. Вы не можете одновременно получить доступ к камере из двух источников. –

ответ

1

Если вы используете библиотеку Google WebRTC, это способ сделать это, но я еще не получил полностью стабильное решение. Я нашел информацию здесь https://groups.google.com/forum/?fromgroups=&hl=sv#!topic/discuss-webrtc/8TgRy9YWvVc и смог реализовать что-то подобное в моем коде.

Загляните в RTCAVFoundationVideoSource, он содержит captureSession, который вы можете использовать, который представляет AVCaptureSession.

Даже если вы НЕ используете код Google (я вижу, вы ссылаетесь на крикет?), Вы должны быть способны сделать что-то подобное.

Тогда вы можете попробовать что-то вроде этого:

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) 
     } 
    } 

Найти выход, сохранить их ссылку на videoBufferDelegate (то есть, где WebRTC посылает videoBuffers), а затем добавить свои собственные.

При реализации AVCaptureVideoDataOutputSampleBufferDelegate для обработки (записи) буферов, вам нужно реализовать что-то вроде этого:

func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) { 

    externalVideoBufferDelegate?.captureOutput!(captureOutput, didOutputSampleBuffer: sampleBuffer, fromConnection: connection) 

    dispatch_async(videoQueue) { 
     if self.assetWriterVideoInput.readyForMoreMediaData { 
      self.assetWriterVideoInput.appendSampleBuffer(sampleBuffer) 
     } 
    } 
} 

делать все, что вы хотите сделать с буферами, но важная часть пересылки буфер externalVideoBufferDelegate вы сохранили ссылку на ранее - это позволяет WebRTC продолжать обрабатывать и пересылать видеокадр.

+0

Обратите внимание, что при попытке добавить делегат для аудио это очень нестабильно и мешает обработке WebRTC. –

Смежные вопросы