Использование WebRTC для отправки снимка экрана устройства iOS с помощью ReplayKit

Мы хотели бы использовать WebRTC для отправки снимков экрана устройств iOS с помощью ReplayKit. ReplayKit имеет обратный вызов processSampleBuffer, который дает CMSampleBuffer.

Но вот где мы застряли, мы не можем отправить CMSampleBuffer на подключенный одноранговый узел. Мы попытались создать pixelBuffer из sampleBuffer, а затем создать RTCVideoFrame.

мы также извлекли RTCVideoSource из RTCPeerConnectionFactory, а затем использовали RTCVideoCapturer и передали его в localVideoSource.

Есть идеи, что мы делаем не так?

var peerConnectionFactory: RTCPeerConnectionFactory?

override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) {
 switch sampleBufferType {
           case RPSampleBufferType.video:

        // create the CVPixelBuffer
        let pixelBuffer:CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!;

        // create the RTCVideoFrame
        var videoFrame:RTCVideoFrame?;
        let timestamp = NSDate().timeIntervalSince1970 * 1000
        videoFrame = RTCVideoFrame(pixelBuffer: pixelBuffer, rotation: RTCVideoRotation._0, timeStampNs: Int64(timestamp))

        // connect the video frames to the WebRTC
        let localVideoSource = self.peerConnectionFactory!.videoSource()
        let videoCapturer = RTCVideoCapturer()
        localVideoSource.capturer(videoCapturer, didCapture: videoFrame!)

        let videoTrack : RTCVideoTrack =   self.peerConnectionFactory!.videoTrack(with: localVideoSource, trackId: "100”)

        let mediaStream: RTCMediaStream = (self.peerConnectionFactory?.mediaStream(withStreamId: “1"))!
        mediaStream.addVideoTrack(videoTrack)
        self.newPeerConnection!.add(mediaStream)

        break
    }
}

person Niro    schedule 10.05.2018    source источник
comment
Вы нашли какое-нибудь решение?   -  person MacDeveloper    schedule 29.05.2018


Ответы (1)


Это отличная идея для реализации, вам просто нужно отобразить RTCVideoFrame в методе, который вы использовали во фрагменте, а все остальные объекты будут инициализировать метод в больших размерах, наилучшим образом. для лучшего понимания даю вам отрывок.

    var peerConnectionFactory: RTCPeerConnectionFactory?
    var localVideoSource: RTCVideoSource?
    var videoCapturer: RTCVideoCapturer?
    func setupVideoCapturer(){
          // localVideoSource and videoCapturer will use 
            localVideoSource = self.peerConnectionFactory!.videoSource() 
            videoCapturer = RTCVideoCapturer()
    //      localVideoSource.capturer(videoCapturer, didCapture: videoFrame!)

            let videoTrack : RTCVideoTrack =   self.peerConnectionFactory!.videoTrack(with: localVideoSource, trackId: "100”)

            let mediaStream: RTCMediaStream = (self.peerConnectionFactory?.mediaStream(withStreamId: “1"))!
            mediaStream.addVideoTrack(videoTrack)
            self.newPeerConnection!.add(mediaStream)
        }


 override func processSampleBuffer(_ sampleBuffer: CMSampleBuffer, with sampleBufferType: RPSampleBufferType) {
     switch sampleBufferType {
               case RPSampleBufferType.video:

            // create the CVPixelBuffer
            let pixelBuffer:CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!;

            // create the RTCVideoFrame
            var videoFrame:RTCVideoFrame?;
            let timestamp = NSDate().timeIntervalSince1970 * 1000
            videoFrame = RTCVideoFrame(pixelBuffer: pixelBuffer, rotation: RTCVideoRotation._0, timeStampNs: Int64(timestamp))
            // connect the video frames to the WebRTC
            localVideoSource.capturer(videoCapturer, didCapture: videoFrame!)

            break
        }
    }

Надеюсь, что это поможет вам.

person Sumit Meena    schedule 20.06.2018
comment
А как насчет звука? RTCVideoTrack предназначен только для образцов видео. Может ли кто-нибудь помочь мне с аудио фрагментом? - person user2801184; 01.02.2019
comment
Я пробовал, но, как я проверяю, мы не можем этого сделать с существующим фреймворком. мы можем добиться этого, настроив SDK с исходным кодом. Я сделал это так. - person Sumit Meena; 03.02.2019
comment
Не могли бы вы подсказать мне пошаговые инструкции? Если бы вы могли просто поделиться webrtc.framework и фрагментом аудио, как указано выше, это было бы большим подспорьем! Могу ответить на мой вопрос stackoverflow.com/questions/54470143/ - person user2801184; 04.02.2019
comment
Привет, Сумит, не могли бы вы ответить, если возможно? - person user2801184; 06.02.2019
comment
Я попробовал сделать то же самое, но не получил видео в Интернете. Не могли бы вы поделиться своим подходом @sumitmeena @replies? Большое спасибо - person Aboulfouz; 09.02.2019
comment
привет @Aboulfouz, вы не можете получать видео в Интернете или на любом удаленном устройстве ?? вы можете проверить это в локальном представлении, если видео работает в локальном представлении, чем оно будет работать на удаленном. - person Sumit Meena; 09.02.2019
comment
Привет @sumitmeena, Большое спасибо за ответ. Я не получил видео в сети. Веб-страница получает событие ontrack, но никогда не показывает видео :(. - person Aboulfouz; 10.02.2019
comment
Привет @ user2801184 Я могу попробовать, но когда у меня будет время. - person Sumit Meena; 10.02.2019
comment
Привет, @Aboulfouz, не могли бы вы поделиться фрагментом, чтобы я мог его проверить. - person Sumit Meena; 11.02.2019
comment
Привет, @sumitmeena: Я могу работать с тобой, если ты поможешь мне. В противном случае я буду ждать вашего ответа. @ Aboulfouz: Если вы запустите этот github.com/Mobcrush/ReplayKitDemo с последним демонстрационным приложением apprtc от Google. Это сработало для меня. - person user2801184; 11.02.2019
comment
конечно, я с нетерпением жду этого. - person Sumit Meena; 13.02.2019
comment
Привет @sumitmeena, я использовал тот же самый код, что и выше, и для создания peerConnect self.newPeerConnection = self.peerConnectionFactory? .PeerConnection (с: rtcConfig, ограничения: RTCMediaConstraints (обязательныеConstraints: [OfferToRecieveVideo: true], optionalConnection), optionalConnection себя) - person Aboulfouz; 13.02.2019
comment
вы проверили внутренний webrtc в хроме? - person Sumit Meena; 14.02.2019
comment
Я добавил идентификатор дорожки со 100, но в хроме, когда я проверил объект потока, он содержит дорожку с автоматически сгенерированным идентификатором, а не со 100. Может ли это вызвать проблему? @sumitmeena большое спасибо за ваше время - person Aboulfouz; 14.02.2019
comment
получение этого типа ошибки при рендеринге приведенного выше фрагмента для просмотра в localView Завершение приложения из-за неперехваченного исключения 'NSInvalidArgumentException', причина: '- [__ NSCFType width]: нераспознанный селектор отправлен в экземпляр 0x2829c6300' - person Rajesh.k; 20.02.2019
comment
Привет @sumitmeena Проблема была с отметкой времени. Когда я изменил метку времени, чтобы позволить ctm = CMSampleBufferGetPresentationTimeStamp (sampleBuffer) ctm.value. Это сработало, но видео зависает через 10 секунд :( Вы сталкивались с той же проблемой? - person Aboulfouz; 25.02.2019
comment
@ sumitmeena @ Aboulfouz .. я получаю буферы при переносе с iOS на Android, но не с iOS на iOS через WebRTC ... .. есть ли проблемы с кодеком, если да, как я могу изменить конфигурацию ... Не могли бы вы мне помочь? - person Rajesh.k; 29.03.2019
comment
@ sumitmeena @ Aboulfouz: Привет, ребята, у меня ошибка с последними библиотеками webrtc. Не могли бы вы помочь и ответить на мой вопрос? stackoverflow.com/questions/61190672/ - person user2801184; 13.04.2020