Ejemplo n.º 1
0
    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()
Ejemplo n.º 2
0
    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()
Ejemplo n.º 3
0
    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()
Ejemplo n.º 4
0
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()