ipywebrtc

ipywebrtc stellt WebRTC- und die MediaStream-API in Jupyter Notebooks zur Verfügung. Damit lassen sich z.B. Screenshots aus einem MediaStream erstellen und mit skimage weiter analysieren. Ihr könnt mit ipywebrtc jedoch nicht nur Video-, Bild-, Audio- und Widget-Daten lesen sondern auch Stream-Objekte aufzeichnen. Es stellt sogar eine einfache Chat-Funktion zur Verfügung.

Installation

ipywebrtc wird sowohl im Kernel- wie auch im Jupyter-Environment installiert mit

$ pipenv install ipywebrtc

Beispiele

Beispiel VideoStream

[1]:
from ipywebrtc import VideoStream, VideoRecorder
[2]:
!cd ../../../../data/
!dvc  import-url https://github.com/maartenbreddels/ipywebrtc/raw/master/docs/source/Big.Buck.Bunny.mp4
Importing 'https://github.com/maartenbreddels/ipywebrtc/raw/master/docs/source/Big.Buck.Bunny.mp4' -> 'Big.Buck.Bunny.mp4'
Saving information to 'Big.Buck.Bunny.mp4.dvc'.

To track the changes with git, run:

        git add Big.Buck.Bunny.mp4.dvc

[3]:
video = VideoStream.from_url("../../../../data/Big.Buck.Bunny.mp4")
video

Aufnehmen

Eine Aufnahmetaste lässt sich mit MediaRecorder.record erstellen, für Videos mit:

[4]:
recorder = VideoRecorder(stream=video)
recorder

Speichern

Der Stream kann entweder über die Download-Taste erfolgen oder programmatisch, z.B. mit:

[5]:
recorder.save("../../../../data/example.webm")

Beispiel WidgetStream

Ein WidgetStream erstellt einen MediaStream aus einem beliebigen Widget.

[6]:
from ipywebrtc import VideoStream, WidgetStream
[7]:
from pythreejs import (
    AmbientLight,
    DirectionalLight,
    Mesh,
    MeshLambertMaterial,
    OrbitControls,
    PerspectiveCamera,
    Renderer,
    Scene,
    SphereGeometry,
)


ball = Mesh(
    geometry=SphereGeometry(radius=1),
    material=MeshLambertMaterial(color="red"),
    position=[2, 1, 0],
)

c = PerspectiveCamera(
    position=[0, 5, 5],
    up=[0, 1, 0],
    children=[
        DirectionalLight(color="white", position=[3, 5, 1], intensity=0.5)
    ],
)

scene = Scene(children=[ball, c, AmbientLight(color="#777777")])

renderer = Renderer(
    camera=c,
    scene=scene,
    controls=[OrbitControls(controlling=c)]
)

renderer

Der folgende webgl_stream wird aktualisiert, nachdem sich in der obigen Szene etwas ändert. Dies könnt ihr erreichen indem ihr den Ball mit der Maus verschiebt.

[8]:
webgl_stream = WidgetStream(widget=renderer)
webgl_stream

Alternativ könnt ihr auch einen Slider verwenden:

[9]:
from ipywidgets import FloatSlider


slider = FloatSlider(
    value=7.5,
    step=0.1,
    description="Test:",
    disabled=False,
    continuous_update=False,
    orientation="horizontal",
    readout=True,
    readout_format=".1f",
)

slider