def test_capabilities(self): # audio capabilities = RTCRtpSender.getCapabilities('audio') self.assertTrue(isinstance(capabilities, RTCRtpCapabilities)) self.assertEqual(capabilities.codecs, [ RTCRtpCodecCapability( mimeType='audio/opus', clockRate=48000, channels=2), RTCRtpCodecCapability( mimeType='audio/PCMU', clockRate=8000, channels=1), RTCRtpCodecCapability( mimeType='audio/PCMA', clockRate=8000, channels=1), ]) self.assertEqual(capabilities.headerExtensions, [ RTCRtpHeaderExtensionCapability( uri='urn:ietf:params:rtp-hdrext:sdes:mid'), ]) # video capabilities = RTCRtpSender.getCapabilities('video') self.assertTrue(isinstance(capabilities, RTCRtpCapabilities)) self.assertEqual(capabilities.codecs, [ RTCRtpCodecCapability(mimeType='video/VP8', clockRate=90000), RTCRtpCodecCapability(mimeType='video/rtx', clockRate=90000), RTCRtpCodecCapability(mimeType='video/H264', clockRate=90000, parameters=OrderedDict( [('packetization-mode', '1'), ('level-asymmetry-allowed', '1'), ('profile-level-id', '42001f')])), RTCRtpCodecCapability(mimeType='video/H264', clockRate=90000, parameters=OrderedDict( [('packetization-mode', '1'), ('level-asymmetry-allowed', '1'), ('profile-level-id', '42e01f')])), ]) self.assertEqual( capabilities.headerExtensions, [ RTCRtpHeaderExtensionCapability( uri='urn:ietf:params:rtp-hdrext:sdes:mid'), RTCRtpHeaderExtensionCapability( uri= 'http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time' ), # noqa ]) # bogus capabilities = RTCRtpSender.getCapabilities('bogus') self.assertIsNone(capabilities)
async def __offer(self, request): """ Generates JSON Response with a WebRTC Peer Connection of Video Server. """ # get offer from params params = await request.json() offer = RTCSessionDescription(sdp=params["sdp"], type=params["type"]) # initiate stream if not (self.__default_rtc_server is None) and not (self.__default_rtc_server.is_launched): if self.__logging: logger.debug("Initiating Video Streaming.") self.__default_rtc_server.launch() # setup RTC peer connection - interface represents a WebRTC connection # between the local computer and a remote peer. pc = RTCPeerConnection() self.__pcs.add(pc) if self.__logging: logger.info("Created WebRTC Peer Connection.") # track ICE connection state changes @pc.on("iceconnectionstatechange") async def on_iceconnectionstatechange(): logger.debug("ICE connection state is %s" % pc.iceConnectionState) if pc.iceConnectionState == "failed": logger.error("ICE connection state failed.") # check if Live Broadcasting is enabled if self.__relay is None: # if not, close connection. await pc.close() self.__pcs.discard(pc) # Change the remote description associated with the connection. await pc.setRemoteDescription(offer) # retrieve list of RTCRtpTransceiver objects that are currently attached to the connection for t in pc.getTransceivers(): # Increments performance significantly, IDK why this works as H265 codec is not even supported :D capabilities = RTCRtpSender.getCapabilities("video") preferences = list( filter(lambda x: x.name == "H265", capabilities.codecs)) t.setCodecPreferences(preferences) # add video server to peer track if t.kind == "video": pc.addTrack( self.__relay.subscribe(self.config["server"]) if not ( self.__relay is None) else self.config["server"]) # Create an SDP answer to an offer received from a remote peer answer = await pc.createAnswer() # Change the local description for the answer await pc.setLocalDescription(answer) # return Starlette json response return JSONResponse({ "sdp": pc.localDescription.sdp, "type": pc.localDescription.type })
def test_capabilities(self): # audio capabilities = RTCRtpSender.getCapabilities("audio") self.assertTrue(isinstance(capabilities, RTCRtpCapabilities)) self.assertEqual( capabilities.codecs, [ RTCRtpCodecCapability( mimeType="audio/opus", clockRate=48000, channels=2), RTCRtpCodecCapability( mimeType="audio/PCMU", clockRate=8000, channels=1), RTCRtpCodecCapability( mimeType="audio/PCMA", clockRate=8000, channels=1), ], ) self.assertEqual( capabilities.headerExtensions, [ RTCRtpHeaderExtensionCapability( uri="urn:ietf:params:rtp-hdrext:sdes:mid") ], ) # video capabilities = RTCRtpSender.getCapabilities("video") self.assertTrue(isinstance(capabilities, RTCRtpCapabilities)) self.assertEqual( capabilities.codecs, [ RTCRtpCodecCapability(mimeType="video/VP8", clockRate=90000), RTCRtpCodecCapability(mimeType="video/rtx", clockRate=90000), RTCRtpCodecCapability( mimeType="video/H264", clockRate=90000, parameters=OrderedDict([ ("packetization-mode", "1"), ("level-asymmetry-allowed", "1"), ("profile-level-id", "42001f"), ]), ), RTCRtpCodecCapability( mimeType="video/H264", clockRate=90000, parameters=OrderedDict([ ("packetization-mode", "1"), ("level-asymmetry-allowed", "1"), ("profile-level-id", "42e01f"), ]), ), ], ) self.assertEqual( capabilities.headerExtensions, [ RTCRtpHeaderExtensionCapability( uri="urn:ietf:params:rtp-hdrext:sdes:mid"), RTCRtpHeaderExtensionCapability( uri= "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time" ), ], ) # bogus with self.assertRaises(ValueError): RTCRtpSender.getCapabilities("bogus")