Alcance

Estoy usando RTCCameraPreviewView para mostrar la transmisión de la cámara local

    let videoSource = self.pcFactory.avFoundationVideoSource(with: nil)
    let videoTrack = self.pcFactory.videoTrack(with: sVideoSource, trackId: "video0")

    //setting the capture session to my RTCCameraPreviewView:
    (self.previewView as! RTCCameraPreviewView).captureSession = (videoTrack.source as! RTCAVFoundationVideoSource).captureSession

    stream = self.pcFactory.mediaStream(withStreamId: "unique_label")
    audioTrack = self.pcFactory.audioTrack(withTrackId: "audio0")
    stream.addAudioTrack(audioTrack)

    var device: AVCaptureDevice?
    for captureDevice in AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) {
        if (captureDevice as AnyObject).position == AVCaptureDevicePosition.front {
            device = captureDevice as? AVCaptureDevice
            break
        }
    }
    if device != nil && videoTrack != nil {
        stream.addVideoTrack(videoTrack)
    }

    configuration = RTCConfiguration()

    configuration.iceServers = iceServers
    peerConnection = self.pcFactory.peerConnection(with: configuration, constraints: RTCMediaConstraints(mandatoryConstraints: nil, optionalConstraints: ["DtlsSrtpKeyAgreement": "true"]), delegate: self)
    peerConnection.add(stream)

Las cosas están funcionando bien como se esperaba.

Problema

Ahora quiero tomar los fotogramas de la cámara y preprocesarlos para agregar algunos filtros (sepia, b / n, etc.) y luego transmitir los fotogramas a WebRTC. Después de luchar con los documentos webrtc, sigo sin saber por dónde empezar y qué hacer.

¡Cualquier tipo de aviso será muy apreciado!

4
gaurav414u 8 dic. 2016 a las 14:25
¿Te refieres a zombocam?
 – 
jib
9 dic. 2016 a las 03:14

1 respuesta

La mejor respuesta

Encontré una salida. Entonces, básicamente, necesita construir su propio pod WebRTC y luego puede agregar un gancho para usar un AVCaptureVideoDataOutputSampleBufferDelegate personalizado en el objeto videoOutput. Luego maneje sampleBuffer, modifique el búfer y luego pase a webrtc.

Implementación

Abra el archivo webrtc / sdk / objc / Frameworks / Classes / RTCAVFoundationVideoCapturerInternal.mm

Y en la linea:

[videoDataOutput setSampleBufferDelegate:self queue:self.frameQueue];

Utilizar un delegado personalizado en lugar de uno mismo .

En ese delegado

  class YourDelegate : AVCaptureVideoDataOutputSampleBufferDelegate {
 func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) {
        let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)

        //modify the pixelBuffer
        //get the modifiedSampleBuffer from modified pixelBuffer
        DispatchQueue.main.async {
            //show the modified buffer to the user
        }

        //To pass the modified buffer to webrtc (warning: [this is objc code]):
        //(_capturer object is found in RTCAVFoundationVideoCapturerInternal.mm)
        _capturer->CaptureSampleBuffer(modifiedSampleBuffer, _rotation);

    }
}
2
gaurav414u 9 dic. 2016 a las 16:21
Hola, ¿puedes crear un pod para descargar? me resulta difícil crear un pod para webrtc
 – 
famfamfam
17 abr. 2021 a las 20:15
Lo siento mucho, hombre. No puedo. Ya no tengo la configuración de desarrollo de iOS en mi máquina.
 – 
gaurav414u
30 jun. 2021 a las 14:07