Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
self.assertHasIceCandidates(pc1.localDescription)
self.assertHasDtls(pc1.localDescription, 'actpass')
# strip out candidates
desc1 = strip_ice_candidates(pc1.localDescription)
# handle offer
run(pc2.setRemoteDescription(desc1))
self.assertEqual(pc2.remoteDescription, desc1)
self.assertEqual(len(pc2.getReceivers()), 1)
self.assertEqual(len(pc2.getSenders()), 1)
self.assertEqual(len(pc2.getTransceivers()), 1)
self.assertEqual(mids(pc2), ['0'])
# create answer
pc2.addTrack(AudioStreamTrack())
answer = run(pc2.createAnswer())
self.assertEqual(answer.type, 'answer')
self.assertTrue('m=audio ' in answer.sdp)
self.assertFalse('a=candidate:' in answer.sdp)
self.assertFalse('a=end-of-candidates' in answer.sdp)
run(pc2.setLocalDescription(answer))
self.assertEqual(pc2.iceConnectionState, 'checking')
self.assertEqual(pc2.iceGatheringState, 'complete')
self.assertEqual(mids(pc2), ['0'])
self.assertTrue('m=audio ' in pc2.localDescription.sdp)
self.assertTrue('a=sendrecv' in pc2.localDescription.sdp)
self.assertHasIceCandidates(pc2.localDescription)
self.assertHasDtls(pc2.localDescription, 'active')
# strip out candidates
self.assertEqual(mids(pc1), ['0', '1', '2'])
# close one side
pc1_description = pc1.localDescription
run(pc1.close())
# handle offer
run(pc2.setRemoteDescription(pc1_description))
self.assertEqual(pc2.remoteDescription, pc1_description)
self.assertEqual(len(pc2.getReceivers()), 2)
self.assertEqual(len(pc2.getSenders()), 2)
self.assertEqual(len(pc2.getTransceivers()), 2)
self.assertEqual(mids(pc2), ['0', '1', '2'])
# create answer
pc2.addTrack(AudioStreamTrack())
pc2.addTrack(VideoStreamTrack())
answer = run(pc2.createAnswer())
self.assertEqual(answer.type, 'answer')
self.assertTrue('m=audio ' in answer.sdp)
self.assertTrue('m=video ' in answer.sdp)
self.assertTrue('m=application ' in answer.sdp)
run(pc2.setLocalDescription(answer))
self.assertEqual(pc2.iceConnectionState, 'checking')
self.assertEqual(pc2.iceGatheringState, 'complete')
self.assertTrue('m=audio ' in pc2.localDescription.sdp)
self.assertTrue('m=video ' in pc2.localDescription.sdp)
self.assertTrue('m=application ' in pc2.localDescription.sdp)
# check outcome
done = asyncio.Event()
a=rtpmap:8 PCMA/8000
""") in pc1.localDescription.sdp)
self.assertTrue('a=sendrecv' in pc1.localDescription.sdp)
self.assertHasIceCandidates(pc1.localDescription)
self.assertHasDtls(pc1.localDescription, 'actpass')
# handle offer
run(pc2.setRemoteDescription(pc1.localDescription))
self.assertEqual(pc2.remoteDescription, pc1.localDescription)
self.assertEqual(len(pc2.getReceivers()), 1)
self.assertEqual(len(pc2.getSenders()), 1)
self.assertEqual(len(pc2.getTransceivers()), 1)
self.assertEqual(mids(pc2), ['0'])
# create answer
pc2.addTrack(AudioStreamTrack())
answer = run(pc2.createAnswer())
self.assertEqual(answer.type, 'answer')
self.assertTrue('m=audio ' in answer.sdp)
self.assertFalse('a=candidate:' in answer.sdp)
self.assertFalse('a=end-of-candidates' in answer.sdp)
run(pc2.setLocalDescription(answer))
self.assertEqual(pc2.iceConnectionState, 'checking')
self.assertEqual(pc2.iceGatheringState, 'complete')
self.assertEqual(mids(pc2), ['0'])
self.assertTrue('m=audio ' in pc2.localDescription.sdp)
self.assertTrue(lf2crlf("""a=rtpmap:96 opus/48000/2
a=rtpmap:0 PCMU/8000
a=rtpmap:8 PCMA/8000
""") in pc2.localDescription.sdp)
self.assertTrue('a=sendrecv' in pc2.localDescription.sdp)
def test_audio_wav(self):
path = self.temporary_path("test.wav")
recorder = MediaRecorder(path)
recorder.addTrack(AudioStreamTrack())
run(recorder.start())
run(asyncio.sleep(2))
run(recorder.stop())
# check output media
container = av.open(path, "r")
self.assertEqual(len(container.streams), 1)
self.assertEqual(container.streams[0].codec.name, "pcm_s16le")
self.assertGreater(
float(container.streams[0].duration * container.streams[0].time_base), 0
)
def test_addTransceiver_audio_inactive(self):
pc = RTCPeerConnection()
# add transceiver
transceiver = pc.addTransceiver('audio', direction='inactive')
self.assertIsNotNone(transceiver)
self.assertEqual(transceiver.currentDirection, None)
self.assertEqual(transceiver.direction, 'inactive')
self.assertEqual(transceiver.sender.track, None)
self.assertEqual(transceiver.stopped, False)
self.assertEqual(pc.getSenders(), [transceiver.sender])
self.assertEqual(len(pc.getTransceivers()), 1)
# add track
track = AudioStreamTrack()
pc.addTrack(track)
self.assertEqual(transceiver.currentDirection, None)
self.assertEqual(transceiver.direction, 'sendonly')
self.assertEqual(transceiver.sender.track, track)
self.assertEqual(transceiver.stopped, False)
self.assertEqual(len(pc.getTransceivers()), 1)
# stop transceiver
run(transceiver.stop())
self.assertEqual(transceiver.currentDirection, None)
self.assertEqual(transceiver.direction, 'sendonly')
self.assertEqual(transceiver.sender.track, track)
self.assertEqual(transceiver.stopped, True)
def test_audio_ended(self):
track = AudioStreamTrack()
recorder = MediaBlackhole()
recorder.addTrack(track)
run(recorder.start())
run(asyncio.sleep(1))
track.stop()
run(asyncio.sleep(1))
run(recorder.stop())
a=rtpmap:0 PCMU/8000
""") in pc1.localDescription.sdp)
self.assertTrue('a=sendrecv' in pc1.localDescription.sdp)
self.assertHasIceCandidates(pc1.localDescription)
self.assertHasDtls(pc1.localDescription, 'actpass')
# handle offer
run(pc2.setRemoteDescription(pc1.localDescription))
self.assertEqual(pc2.remoteDescription, pc1.localDescription)
self.assertEqual(len(pc2.getReceivers()), 1)
self.assertEqual(len(pc2.getSenders()), 1)
self.assertEqual(len(pc2.getTransceivers()), 1)
self.assertEqual(mids(pc2), ['0'])
# create answer
pc2.addTrack(AudioStreamTrack())
answer = run(pc2.createAnswer())
self.assertEqual(answer.type, 'answer')
self.assertTrue('m=audio ' in answer.sdp)
self.assertFalse('a=candidate:' in answer.sdp)
self.assertFalse('a=end-of-candidates' in answer.sdp)
run(pc2.setLocalDescription(answer))
self.assertEqual(pc2.iceConnectionState, 'checking')
self.assertEqual(pc2.iceGatheringState, 'complete')
self.assertEqual(mids(pc2), ['0'])
self.assertTrue('m=audio ' in pc2.localDescription.sdp)
self.assertTrue(lf2crlf("""a=rtpmap:8 PCMA/8000
a=rtpmap:0 PCMU/8000
""") in pc2.localDescription.sdp)
self.assertTrue('a=sendrecv' in pc2.localDescription.sdp)
self.assertHasIceCandidates(pc2.localDescription)
run(pc1.setLocalDescription(offer))
self.assertEqual(pc1.iceConnectionState, 'new')
self.assertEqual(pc1.iceGatheringState, 'complete')
self.assertEqual(mids(pc1), ['0', '1'])
# handle offer
run(pc2.setRemoteDescription(pc1.localDescription))
self.assertEqual(pc2.remoteDescription, pc1.localDescription)
self.assertEqual(len(pc2.getReceivers()), 2)
self.assertEqual(len(pc2.getSenders()), 2)
self.assertEqual(len(pc2.getTransceivers()), 2)
self.assertEqual(mids(pc2), ['0', '1'])
# create answer
pc2.addTrack(AudioStreamTrack())
pc2.addTrack(VideoStreamTrack())
answer = run(pc2.createAnswer())
self.assertEqual(answer.type, 'answer')
self.assertTrue('m=audio ' in answer.sdp)
self.assertTrue('m=video ' in answer.sdp)
run(pc2.setLocalDescription(answer))
self.assertEqual(pc2.iceConnectionState, 'checking')
self.assertEqual(pc2.iceGatheringState, 'complete')
self.assertTrue('m=audio ' in pc2.localDescription.sdp)
self.assertTrue('m=video ' in pc2.localDescription.sdp)
# handle answer
run(pc1.setRemoteDescription(pc2.localDescription))
self.assertEqual(pc1.remoteDescription, pc2.localDescription)
self.assertEqual(pc1.iceConnectionState, 'checking')
def test_addTrack_audio(self):
pc = RTCPeerConnection()
# add audio track
track1 = AudioStreamTrack()
sender1 = pc.addTrack(track1)
self.assertIsNotNone(sender1)
self.assertEqual(sender1.track, track1)
self.assertEqual(pc.getSenders(), [sender1])
self.assertEqual(len(pc.getTransceivers()), 1)
# try to add same track again
with self.assertRaises(InvalidAccessError) as cm:
pc.addTrack(track1)
self.assertEqual(str(cm.exception), 'Track already has a sender')
# add another audio track
track2 = AudioStreamTrack()
sender2 = pc.addTrack(track2)
self.assertIsNotNone(sender2)
self.assertEqual(sender2.track, track2)