def test_video_file(self): player = MediaPlayer(path=self.video_path) # read all frames player.play() for i in range(20): frame = run(player.video.recv()) self.assertEqual(len(frame.data), 460800) self.assertEqual(frame.width, 640) self.assertEqual(frame.height, 480) player.stop()
def test_audio_file(self): player = MediaPlayer(path=self.audio_path) # read all frames player.play() for i in range(50): frame = run(player.audio.recv()) self.assertEqual(frame.channels, 1) self.assertEqual(len(frame.data), 320) self.assertEqual(frame.sample_rate, 8000) self.assertEqual(frame.sample_width, 2) player.stop()
def test_audio_file_8kHz(self): player = MediaPlayer(path=self.audio_path) # check tracks self.assertIsNotNone(player.audio) self.assertIsNone(player.video) # read all frames player.start() for i in range(49): frame = run(player.audio.recv()) self.assertEqual(frame.channels, 1) self.assertEqual(len(frame.data), 1920) self.assertEqual(frame.sample_rate, 48000) self.assertEqual(frame.sample_width, 2) player.stop()
async def join_room(room, play_from, record_to): # fetch room parameters async with aiohttp.ClientSession() as session: async with session.post('https://appr.tc/join/' + room) as response: # we cannot use response.json() due to: # https://github.com/webrtc/apprtc/issues/562 data = json.loads(await response.text()) assert data['result'] == 'SUCCESS' params = data['params'] # create peer conection pc = RTCPeerConnection() # setup media source if play_from: player = MediaPlayer(play_from) else: player = None if player and player.audio: pc.addTrack(player.audio) else: pc.addTrack(AudioStreamTrack()) if player and player.video: pc.addTrack(player.video) else: pc.addTrack(VideoImageTrack()) # setup media sink if record_to: recorder = MediaRecorder(record_to) else: recorder = MediaBlackhole() @pc.on('track') def on_track(track): print('Track %s received' % track.kind) recorder.addTrack(track) def on_ended(): print('Track %s ended' % track.kind) # connect to websocket and join signaling = Signaling() await signaling.connect(params) await signaling.send({ 'clientid': params['client_id'], 'cmd': 'register', 'roomid': params['room_id'], }) if params['is_initiator'] == 'true': # send offer await pc.setLocalDescription(await pc.createOffer()) await signaling.send_message(description_to_dict(pc.localDescription)) print('Please point a browser at %s' % params['room_link']) def start_media(): if player: player.start() recorder.start() # receive 60s of media try: await asyncio.wait_for(consume_signaling(signaling, pc, params, start_media), timeout=60) except asyncio.TimeoutError: pass # shutdown print('Shutting down') if player: player.stop() recorder.stop() await signaling.send_message({'type': 'bye'}) await pc.close()