Summary

  • We depend on Zoom to process recorded meetings in a timely manner, but have no fallback when it doesn't

  • Zoom has functionality to live stream RTMP push while meetings are happening.

  • AWS Elemental allows for capturing and encoding of RTMP streams to S3

  • Opencast can ingest from S3

  • Jay, Kenny & Gabe (Russell) ran a successful proof of concept

  • All of this can be done programmatically

Per Meeting Requirements

  • AWS MediaLive Channel Input (type: RTMP_PUSH)
    • provides the rtmp endpoint URL
    • defines the "Stream Key" value
    • allows standard AWS Security Group restrictions
  • AWS MediaLive Channel
    • channels connect inputs <-> outputs
    • start/stop via an API or preset schedules
  • AWS MediaLive Channel Output (to S3)
    • aac/h264, various a/v encoding options
  • Zoom Meeting Custom Livestream Settings
    • rtmp Stream URL + Stream Key

rtmp://3.225.222.157:1935/rtmp-test

zoom

https://example.edu (???)

Initial Setup

  • MediaLive Channel plus all inputs/outputs created via one-time scripted process
  • Zoom meeting livestream settings updated via one-time scripted process
  • Channels, inputs, outputs, S3 object paths named according to meeting/series metadata (crn, meeting id, series id, etc)
  • Stream URL and stream key obfuscated
    • potentially our only safeguard as AWS security group configuration is ??
  • All necessary URLS & attributes stored in a database

Livestream Capture Process

  1. Start the MediaLive Channel
    • via preset schedule
    • could also be triggered by a Zoom Webhook event
  2. Start the Zoom meeting
  3. Meeting start sends a Zoom Webhook event to an endpoint service (Lambda or Gather)
  4. Endpoint service sends livestream start to Zoom API
  5. Livestream feed is captured and encoded by the MediaLive Channel to S3
  6. Ingest to Opencast would be manual based on need
  7. Encoded files stay in S3 for 7 (?) days
client = ZoomClient(api_key, api_secret)

livestream_status_endpoint = 'meetings/98522241042/livestream/status'

r = client.patch_request(
  livestream_status_endpoint, 
  data={ 'action': 'start' }
)

Live Stream indicator comes on

Livestream Start via API

Optional: if you create an additional MediaLive channel output to AWS MediaPackage you get a stream preview

Cost Estimate

WARNING: first pass, not double-checked

 

MediaLive: $400/month *

S3: $15/month **

 

* ~120 Single-pipe channels, HD, <10Mbps, 250 hours of "uptime", channels on for +/- 15m scheduled meeting time

 

** 2.5GB per hour of video, 250 hours per week, bucket policy to only keep objects <= 7 days old

Zoom livestream capture to S3

By James Luker

Zoom livestream capture to S3

  • 426