<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Paul Czarkowski</title>
    <description>The latest articles on DEV Community by Paul Czarkowski (@paulczar).</description>
    <link>https://dev.to/paulczar</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F386813%2F5ffa8a20-c9ab-4577-8ced-78f4c461c45d.jpeg</url>
      <title>DEV Community: Paul Czarkowski</title>
      <link>https://dev.to/paulczar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/paulczar"/>
    <language>en</language>
    <item>
      <title>Deploying and accessing a GCP SQL database via Kubernetes</title>
      <dc:creator>Paul Czarkowski</dc:creator>
      <pubDate>Mon, 08 Jun 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/paulczar/deploying-and-accessing-a-gcp-sql-database-via-kubernetes-3mc6</link>
      <guid>https://dev.to/paulczar/deploying-and-accessing-a-gcp-sql-database-via-kubernetes-3mc6</guid>
      <description>&lt;p&gt;&lt;em&gt;Sorry for the long preamble, feel free to just skip straight to the technical details.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Two years ago, faced with the challenge of wanting to reduce the tooling required to deploy infrastructure to Google Cloud I started working on a &lt;a href="https://github.com/paulczar/gcp-cloud-compute-operator"&gt;Google Cloud Operator&lt;/a&gt;. The goal of this project was to be able to stand up networks, images, and Virtual Machines for installing Pivotal’s &lt;a href="https://docs.pivotal.io/pks"&gt;PKS&lt;/a&gt; (now Tanzu Kubernetes Grid Integrated).&lt;/p&gt;

&lt;p&gt;This worked out pretty well for me and I was able to create/destroy environments at will seeded from a single node GKE cluster running the operator.&lt;/p&gt;

&lt;p&gt;Thankfully later some folks at Google started working on an Operator of their own which they named &lt;a href="https://cloud.google.com/config-connector/docs/overview"&gt;Google Config Connector&lt;/a&gt; which sought to solve roughly the same problem. Although their original intent was more around backing services for Kubernetes workloads such as databases.&lt;/p&gt;

&lt;p&gt;As they brought in additional features I was able to start offloading some of the work my own &lt;a href="https://www.youtube.com/watch?v=XL-icNS-IEg&amp;amp;t=38s"&gt;operator was doing to GCC&lt;/a&gt;, however only recently did they support the full set of services that I require.&lt;/p&gt;

&lt;p&gt;Recently I’ve been doing some work around running applications on Kubernetes and been thinking about how I want to handle databases in Dev vs Prod. Using a tool like &lt;a href="https://helm.sh"&gt;Helm&lt;/a&gt; or &lt;a href="https://get-ytt.io/"&gt;ytt&lt;/a&gt; I could in theory have a flag that determines whether it should create a Postgres deployment in Kubernetes, or a &lt;a href="https://cloud.google.com/sql"&gt;CloudSQL&lt;/a&gt; instance.&lt;/p&gt;

&lt;p&gt;I hadn’t actually used the Google Config Connector operator to stand up a Database to be accessed from inside a GKE cluster, so I figured that would be the natural place to start.&lt;/p&gt;

&lt;p&gt;Unfortunately I found &lt;a href="https://github.com/GoogleCloudPlatform/k8s-config-connector/issues/201"&gt;gaps&lt;/a&gt; in both the &lt;a href="https://github.com/GoogleCloudPlatform/k8s-config-connector/tree/master/samples/resources/sqlinstance/private-ip-instance"&gt;GCC examples&lt;/a&gt; and the &lt;a href="https://cloud.google.com/sql/docs/mysql/connect-kubernetes-engine"&gt;CloudSQL documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I could get the database running easily enough but I just could not get applications running on GKE to access it over the Private IP. Finally I found this statement &lt;code&gt;For connecting using private IP, the GKE cluster must be VPC-native and in the same VPC network as the Cloud SQL instance.&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Doing some digging it became apparent that GKE clusters are not &lt;a href="https://cloud.google.com/kubernetes-engine/docs/how-to/alias-ips"&gt;VPC-native&lt;/a&gt; by default. I also found that SQL Instances actually never live in your VPC and you need to allocate an IP Range to peering in that network and set up a &lt;a href="https://cloud.google.com/vpc/docs/configure-private-services-access#creating-connection"&gt;Service Network Connection&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With that figured out I was able to successfully create a new GKE cluster, install GCC, and deploy and use a Cloud SQL instance over its private IP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploying a CloudSQL instance via GCC
&lt;/h2&gt;

&lt;p&gt;If you want to refer to a &lt;code&gt;ytt&lt;/code&gt; templated version of the manifests created below you can find a fully working example (that also includes Google SQL Proxy) &lt;a href="https://github.com/paulczar/gcc-cloudsql"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create GKE Cluster
&lt;/h3&gt;

&lt;p&gt;Before we do anything we need to ensure a few of the Google Cloud APIs are enabled.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gcloud services enable \
  servicenetworking.googleapis.com \
  servicemanagement.googleapis.com \
  iamcredentials.googleapis.com

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Some of our commands require your Google Cloud Project ID, you can find it and save it as a variable for later use like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PROJECT_ID=$(gcloud config get-value project)

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Create a Small GKE Cluster using &lt;code&gt;--workload-pool&lt;/code&gt; to enable workload identity and &lt;code&gt;--enable-ip-alias&lt;/code&gt; to create a VPC-native cluster:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gcloud container clusters create gcc-cloudsql \
  --num-nodes=1 --zone us-central1-c \
  --cluster-version 1.16 --machine-type n1-standard-2 \
  --workload-pool=${PROJECT_ID}.svc.id.goog \
  --enable-ip-alias

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Check the cluster is accessible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl cluster-info

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;In order for Applications in GKE to access the Private IP of CloudSQL instances you need to create a VPC Peering Range and a Service Networking Connection.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This only has to be done once per Network in your account.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Create a VPC Peering range:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gcloud compute addresses create cloudsql-peer \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=16 \
    --description="peering range for CloudSQL" \
    --network=default \
    --project=$PROJECT_ID

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Peer that range with our default network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=cloudsql-peer \
    --network=default \
    --project=$PROJECT_ID

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;em&gt;If this command fails with Cannot modify allocated ranges in CreateConnection then rerun the command but replace &lt;code&gt;connect&lt;/code&gt; with &lt;code&gt;update --force&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Deploy Google Config Connector
&lt;/h3&gt;

&lt;p&gt;Create a service account for GCC:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gcloud iam service-accounts create cnrm-system

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Bind the &lt;code&gt;roles/owner&lt;/code&gt; to the service account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member="serviceAccount:cnrm-system@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/owner"

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Bind &lt;code&gt;roles/iam.workloadIdentityUser&lt;/code&gt; to the &lt;code&gt;cnrm-controller-manager&lt;/code&gt; Kubernetes Service Account in the &lt;code&gt;cnrm-system&lt;/code&gt; Namespace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gcloud iam service-accounts add-iam-policy-binding \
  --role="roles/iam.workloadIdentityUser" \
  --member="serviceAccount:${PROJECT_ID}.svc.id.goog[cnrm-system/cnrm-controller-manager]" \
cnrm-system@${PROJECT_ID}.iam.gserviceaccount.com

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Download GCC:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gsutil cp gs://cnrm/latest/release-bundle.tar.gz release-bundle.tar.gz

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Extract GCC:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tar zxvf release-bundle.tar.gz

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Update the manifest with your project id:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sed -i.bak "s/\${PROJECT_ID?}/${PROJECT_ID}/" \
  install-bundle-workload-identity/0-cnrm-system.yaml

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Apply the manifest to your cluster:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f install-bundle-workload-identity/

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Wait until GCC is fully online:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl wait -n cnrm-system --for=condition=Ready pod --all

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Deploy CloudSQL Instance
&lt;/h3&gt;

&lt;p&gt;Create a Namespace:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create namespace $PROJECT_ID

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Create the Cloud SQL Instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl -n $PROJECT_ID apply -f &amp;lt;(cat &amp;lt;&amp;lt; EOF
apiVersion: sql.cnrm.cloud.google.com/v1beta1
kind: SQLInstance
metadata:
  name: example
spec:
  region: us-central1
  databaseVersion: POSTGRES_9_6
  settings:
    tier: db-custom-1-3840
    ipConfiguration:
      ipv4Enabled: false
      requireSsl: false
      privateNetworkRef:
        external: default
EOF
)

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Create a Cloud SQL User:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl -n $PROJECT_ID apply -f &amp;lt;(cat &amp;lt;&amp;lt; EOF
apiVersion: sql.cnrm.cloud.google.com/v1beta1
kind: SQLUser
metadata:
  name: example
spec:
  instanceRef:
    name: example
  password:
    value: "bad-password"
EOF
)

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;After a few moments check that the SQL Instance is being created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;watch gcloud sql instances list

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Once the &lt;code&gt;STATUS&lt;/code&gt; changes from &lt;code&gt;PENDING_CREATE&lt;/code&gt; to &lt;code&gt;RUNNABLE&lt;/code&gt; hit CTRL-C to exit the &lt;code&gt;watch&lt;/code&gt; command.&lt;/p&gt;

&lt;p&gt;We should now be able to confirm that an Application running in the GKE cluster can access the database. To validate this we can use the &lt;code&gt;postgres:13-alpine&lt;/code&gt; image.&lt;/p&gt;

&lt;p&gt;Run the postgres image as a Pod with an interactive shell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl run -ti --restart=Never --image postgres:13-alpine --rm psql -- sh

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Inside that shell run &lt;code&gt;psql&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Change the IP to match the IP from the &lt;code&gt;gcloud sql instances list&lt;/code&gt; command. Enter the password &lt;code&gt;bad-password&lt;/code&gt; when prompted&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ psql -h ip.add.re.ss --username=example -d postgres
Password for user example: bad-password
psql (13beta1, server 9.6.16)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;That’s it! Super easy and powerful way to get a managed database provisioned and usable without ever leaving Kubernetes.&lt;/p&gt;

&lt;p&gt;If you want to make things even more Kubernetes friendly you can use Google’s &lt;a href="https://github.com/paulczar/gcc-cloudsql/blob/master/ytt/cloudsql/proxy.yaml"&gt;SQL Proxy&lt;/a&gt; inside your Kubernetes cluster which helps manage your SSL Connections to the databases as well as being able to use predictable names rather than hunting for IP addresses.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>gcp</category>
      <category>cloud</category>
      <category>devops</category>
    </item>
    <item>
      <title>How to broadcast to Twitch and Zoom with OBS</title>
      <dc:creator>Paul Czarkowski</dc:creator>
      <pubDate>Wed, 13 May 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/paulczar/how-to-broadcast-to-twitch-and-zoom-with-obs-4d0</link>
      <guid>https://dev.to/paulczar/how-to-broadcast-to-twitch-and-zoom-with-obs-4d0</guid>
      <description>&lt;p&gt;If you prefer a Video Tutorial, you can watch me screencast it on youtube, otherwise read on below.&lt;/p&gt;

&lt;p&gt;Recent world events (COVID-19) has completely turned the Developer Advocacy role on its head and many of us are scrambling to find new ways to effectively reach audiences remotely.&lt;/p&gt;

&lt;p&gt;Many of us have been reaching for tools like &lt;a href="https://zoom.us"&gt;Zoom&lt;/a&gt; for smaller groups such as Meetups and streaming platforms like &lt;a href="https://twitch.tv"&gt;Twitch&lt;/a&gt; / &lt;a href="https://youtube.com"&gt;YouTube Live&lt;/a&gt; for reaching larger groups.&lt;/p&gt;

&lt;p&gt;Many of us are turning to &lt;a href="https://obsproject.com/"&gt;Open Broadcaster Studio&lt;/a&gt; (OBS) to turn our PCs into virtual production studios capable of composing multiple artifacts such as windows, audio, and webcams into layered streams. The most basic use case for OBS is to provide the ability to display onscreen code or a terminal session with a webcam image overlayed in the corner&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oKqdU6Ks--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/obs-basic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oKqdU6Ks--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/obs-basic.png" alt="Example of OBS overlay scene"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OBS can record to a high definition video file on your local machine as well as broadcast it out to Twitch, YouTube, or any other &lt;a href="https://en.wikipedia.org/wiki/Real_Time_Streaming_Protocol"&gt;RTSP&lt;/a&gt; capable platform.&lt;/p&gt;

&lt;p&gt;It should come as no surprise that streaming high quality video from multiple sources can be quite taxing and it often makes sense to have &lt;strong&gt;OBS running on a separate computer&lt;/strong&gt; (refurbished Dell desktops are perfect for this) with a video capture device (like an Elgato HD60) capturing video from your primary machine.&lt;/p&gt;

&lt;p&gt;Using OBS its fairly simple to record and broadcast a presentation, or live coding session. However it feels more like a webinar than it does a meetup or conference presentation as the interaction is very one way.&lt;/p&gt;

&lt;p&gt;By hooking up Zoom and OBS bidirectionally you can have the reach of a streaming platform at the same time as the more interative nature of having real live people in the (virtual) room with you. Having even just a few people acting as an audience and being able to talk to them and have them talk back and see their body language and reactions makes all the difference.&lt;/p&gt;

&lt;p&gt;Unfortunately trying to share a screen and audio through multiple systems is complicated and isn’t possible straight out of the box and we need to solve a few problems:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Rebroadcast video from Zoom through to your stream&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rebroadcast video from OBS through to Zoom&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mix audio from multiple inputs through to multiple outputs (without causing feedback loops)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. Rebroadcast video from Zoom through to your stream
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UKkQUoJG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/video-zoom-obs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UKkQUoJG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/video-zoom-obs.png" alt="diagram showing zoom video in obs"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Multiple Monitors
&lt;/h3&gt;

&lt;p&gt;If you have multiple monitors you can dedicate one of them to Zoom and add a &lt;strong&gt;Display Capture&lt;/strong&gt; source in OBS for that whole display and set zoom to fullscreen on that monitor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5J75MJAx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/obs-display.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5J75MJAx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/obs-display.png" alt="OBS sharing a whole display"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: I was on a Zoom between two machines and only one camera, so pretend &lt;code&gt;Not Paul&lt;/code&gt; is a very handsome gentleman.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I’m not a fan of the layout of fullscreen zoom calls, and I prefer the flexibility of capturing it as a window, which also makes it possible to do this with a single monitor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Single Monitor / Window Capture
&lt;/h3&gt;

&lt;p&gt;In OBS you can add a &lt;strong&gt;Window Capture&lt;/strong&gt; and select your Zoom meeting. This will capture just the Zoom window itself. You can adjust the window size to suit the resolution that you’re outputting to.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rQB9lY2u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/obs-window.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rQB9lY2u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/obs-window.png" alt="OBS sharing just the zoom window"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: The window capture settings are OS dependent, on Windows it would display the name and executable file for the window you want to share.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One Caveat is that Zoom likes to switch to fullscreen when somebody shares their screen. Make sure to deselect the &lt;strong&gt;Enter full screen when a participant shares screen&lt;/strong&gt; in the &lt;strong&gt;Share Screen&lt;/strong&gt; Settings to disable this behavior.&lt;/p&gt;

&lt;p&gt;You might be tempted to try and share your screen to Zoom, however Zoom behaves painfully when you do that and you’ll most likely lose your capture of the Zoom window. Instead you should add the OBS virtual camera (see below) which lets you use the contents of your OBS scene as a camera in Zoom.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Rebroadcast video from OBS through to Zoom
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--60n-KCNI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/video-zoom-obs-zoom.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--60n-KCNI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/video-zoom-obs-zoom.png" alt="diagram showing zoom video in obs and back"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OBS has a plugin that lets you create a virtual camera which you can use as your Zoom camera. The people in your Zoom call will see exactly the same video that you’re streaming without having to share your screen.&lt;/p&gt;

&lt;p&gt;You can download the virtual camera plugin from &lt;a href="https://obsproject.com/forum/resources/obs-virtualcam.949/"&gt;here&lt;/a&gt; however it currently only supports Windows. (There’s a &lt;a href="https://github.com/CatxFish/obs-v4l2sink"&gt;video4linux&lt;/a&gt; you can use if you’re on Linux) for the same effect.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Dflx9YH6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/obs-camera-settings.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Dflx9YH6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/obs-camera-settings.png" alt="OBS Virtual Camera"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the Virtual Camera plugin installed and enabled you can the select it as a camera in Zoom.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bRtK98Lu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/obs-virtualcam-in-zoom.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bRtK98Lu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/obs-virtualcam-in-zoom.png" alt="OBS virtual camera in zoom"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You can see the remote camera now showing the host’s OBS scene of their webcam nested with their screen share.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  3. Mix audio from multiple inputs through to multiple outputs
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Without causing feedback loops.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Setting up the video was relatively straight forward. Audio is the complicated beast. So far I have only solved this on Windows, but am quite certain you could solve it in Linux using the &lt;a href="https://jackaudio.org/"&gt;JACK Audio Connection Kit&lt;/a&gt; (JACK).&lt;/p&gt;

&lt;p&gt;If you’re running a Mac you should be able to use &lt;a href="https://rogueamoeba.com/loopback/"&gt;Rogue Amoeba’s Loopback app&lt;/a&gt; to perform similar (and maybe even more advanced) audio filtering. Thanks &lt;a href="https://twitter.com/mattstratton"&gt;Matty Stratton&lt;/a&gt; for the tip.&lt;/p&gt;

&lt;p&gt;Basically we need to be able to selectively route certain inputs to certain outputs. For instance we want zoom audio to go into OBS, and we want OBS audio to go into Zoom, but we don’t want them to loop eachothers audio back and create a feedback loop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NWdkYC9I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/zoom-obs-audio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NWdkYC9I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/zoom-obs-audio.png" alt="diagram showing audio wiring"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In order to solve this, you need a Mixer that can mix three discreet inputs (Zoom, Desktop, Mic) to three discreet outputs (Speakers, Zoom, OBS).&lt;/p&gt;

&lt;p&gt;You also need virtual audio devices that can act as patch cables.&lt;/p&gt;

&lt;p&gt;There’s likely a number of different audio solutions out there to solve this, I’ll show you what I found works really well and while not free, is extremely affordable.&lt;/p&gt;

&lt;p&gt;This is where &lt;a href="https://www.vb-audio.com/"&gt;VB Audio&lt;/a&gt; comes in. It’s a website with an interesting assortment of audio software for Windows, most of which is either Free or Donationware (read the licenses carefully before using it in a commercial setting).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.vb-audio.com/"&gt;VB Audio&lt;/a&gt; offers &lt;a href="https://www.vb-audio.com/Cable/index.htm"&gt;virtual cables&lt;/a&gt; that we can use to patch the sound correctly. They have up to 5 cables that you can purchase via Donation. In order to wire up our sound we’ll use &lt;strong&gt;VB-CABLE A+B&lt;/strong&gt; and &lt;strong&gt;VB-CABLE C+D&lt;/strong&gt; which gives us 4 virtual cables.&lt;/p&gt;

&lt;p&gt;All audio sent to VB-CABLE inputs is sent to the corresponding VB_CABLE output.&lt;/p&gt;

&lt;p&gt;Pay for, download, and install both bundles.&lt;/p&gt;

&lt;p&gt;You will still need a Mixer capable of mixing the inputs correctly. Thankfully &lt;a href="https://www.vb-audio.com/"&gt;VB Audio&lt;/a&gt; also provides &lt;a href="https://www.vb-audio.com/Voicemeeter/index.htm"&gt;VoiceMeeter&lt;/a&gt;. It comes in three flavors, &lt;a href="https://www.vb-audio.com/Voicemeeter/index.htm"&gt;VoiceMeeter&lt;/a&gt;, &lt;a href="https://www.vb-audio.com/Voicemeeter/banana.htm"&gt;VoiceMeeter Banana&lt;/a&gt;, and &lt;a href="https://www.vb-audio.com/Voicemeeter/potato.htm"&gt;VoiceMeeter Potato&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The regular VoiceMeeter does not have enough inputs and outputs, so you’ll want to use either Banana or Potato. I used Banana as it has exactly the right number of inputs.&lt;/p&gt;

&lt;p&gt;Pay for (Donate), download and install &lt;a href="https://www.vb-audio.com/Voicemeeter/banana.htm"&gt;VoiceMeeter Banana&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now you have the Mixer and the Virtual Cables we can hook everything up together.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure VoiceMeeter Banana
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JfyQhdBD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/voicemeeter-banana.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JfyQhdBD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/voicemeeter-banana.png" alt="screenshot of voicemeeter banana"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First open up VoiceMeeter Banana. You’ll see there are Three Hardware Inputs and Three Hardware outputs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hardware Inputs:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You can rename the Inputs by right clicking on their names, and you can select their devices underneath.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Rename &lt;strong&gt;Hardware input 1&lt;/strong&gt; to &lt;strong&gt;Zoom&lt;/strong&gt; and set it to &lt;strong&gt;WDB: CABLE-B Output&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rename &lt;strong&gt;Hardware input 2&lt;/strong&gt; to &lt;strong&gt;Mic&lt;/strong&gt; and set it to your microphone device. Mine is &lt;strong&gt;Microphone (Yeti)&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rename &lt;strong&gt;Hardware input 3&lt;/strong&gt; to &lt;strong&gt;Desktop&lt;/strong&gt; and set it to &lt;strong&gt;WDB: CABLE-D Output&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hardware Outputs:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;*Set the outputs by clicking the A1, A2, A3 dropdowns next to where it says &lt;strong&gt;HARDWARE OUT&lt;/strong&gt; *&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A1 -&amp;gt; &lt;strong&gt;Speakers / Headphones&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A2 -&amp;gt; &lt;strong&gt;WDM: Cable-A Input&lt;/strong&gt; (Zoom)&lt;/li&gt;
&lt;li&gt;A3 -&amp;gt; &lt;strong&gt;WDM: Cable-C Input&lt;/strong&gt; (OBS)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Mixing:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Under the Hardware Inputs you can see a Volume selector and a sound activity bar. Beside that you can see options, the outputs to send to as well as Mute.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zoom -&amp;gt; A1 (Speakers), A3 (OBS)&lt;/li&gt;
&lt;li&gt;Mic -&amp;gt; A1 (Speakers), A2 (Zoom), A3 (OBS)&lt;/li&gt;
&lt;li&gt;Desktop -&amp;gt; A1 (Speakers), A2 (Zoom), A3 (OBS)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;*I usually set the &lt;strong&gt;Desktop&lt;/strong&gt; audio volume to about &lt;code&gt;-33&lt;/code&gt; so that random noises don’t drown out people speaking.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure Desktop Audio
&lt;/h3&gt;

&lt;p&gt;In your status bar select the &lt;strong&gt;Speaker&lt;/strong&gt; Icon and configure it to output to &lt;strong&gt;Cable-D Input&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l7Ckz5Yd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/desktop-audio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l7Ckz5Yd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/desktop-audio.png" alt="screenshot of desktop audio"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure Zoom audio
&lt;/h3&gt;

&lt;p&gt;In Zoom, go to &lt;strong&gt;Audio Settings&lt;/strong&gt;. Set &lt;strong&gt;Speaker&lt;/strong&gt; to &lt;strong&gt;Cable-B Input&lt;/strong&gt; and set &lt;strong&gt;Microphone&lt;/strong&gt; to &lt;strong&gt;Cable-A Output&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5nQX9M5P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/zoom-audio-settings.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5nQX9M5P--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/zoom-audio-settings.png" alt="screenshot of zoom audio settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure OBS settings
&lt;/h3&gt;

&lt;p&gt;in OBS under &lt;strong&gt;Settings&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Audio&lt;/strong&gt; Disable all Audio devices. Then set &lt;strong&gt;Mic/Auxillary Input&lt;/strong&gt; to &lt;strong&gt;CABLE-C Output&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R3iQM2Pk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/obs-audio-settings.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R3iQM2Pk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/obs-audio-settings.png" alt="screenshot of OBS audio settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then in the OBS &lt;strong&gt;Audio Mixer&lt;/strong&gt; rename the &lt;strong&gt;Mic/Auxillary Input&lt;/strong&gt; to &lt;strong&gt;VoiceMeeter&lt;/strong&gt; and mute all other devices such as webcams.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GyyJxZWg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/obs-audio-mixer.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GyyJxZWg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/obs-broadcast-to-zoom-and-twitch/obs-audio-mixer.png" alt="screenshot of OBS mixer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Test it out
&lt;/h3&gt;

&lt;p&gt;You should now have everything wired up correctly and just need to test it out.&lt;/p&gt;

&lt;p&gt;When you configured the Mic input in VoiceMeeter you chose to send it to all three outputs. This means that you should hear your Mic input through your speakers/headphones.&lt;/p&gt;

&lt;p&gt;If you don’t like to listen to yourself you can deselect &lt;strong&gt;A1&lt;/strong&gt; for the &lt;strong&gt;Mic&lt;/strong&gt; input. This is an easy toggle to see if the audio is working.&lt;/p&gt;

&lt;p&gt;You can also use the volume meters in the various apps to confirm they match. For instance when you speak in the Microphone you should see the &lt;strong&gt;Mic&lt;/strong&gt; meter, and the &lt;strong&gt;A1&lt;/strong&gt; , &lt;strong&gt;A2&lt;/strong&gt; , &lt;strong&gt;A3&lt;/strong&gt; meter move at the same time. You should also see activity in the OBS mixer and Zoom.&lt;/p&gt;

&lt;p&gt;You should hit &lt;strong&gt;Start Recording&lt;/strong&gt; in OBS and get on a zoom with a friend (or a second computer) and verify sound is working in both directions, and that all of the audio ends up in the OBS recording.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Assuming you didn’t hit any issues following this guide you now have your system configured to Stream to both Twitch (or YouTube) and Zoom at the same time, mixing their audio and video appropriately.&lt;/p&gt;

&lt;p&gt;This gives you a powerful way to not just record content, but to stream it and share it with both intimate groups on Zoom and Larger audiences on Twitch.&lt;/p&gt;

&lt;p&gt;One of the best parts of this setup is how I can easily host someone else on my twitch stream and have them share their desktop and do demos, live coding etc.&lt;/p&gt;

&lt;p&gt;I can also run workshops through zoom and people on my twitch stream can also follow along.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Streaming from Zoom to Twitch (or YouTube)</title>
      <dc:creator>Paul Czarkowski</dc:creator>
      <pubDate>Wed, 01 Apr 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/paulczar/streaming-from-zoom-to-twitch-or-youtube-1da9</link>
      <guid>https://dev.to/paulczar/streaming-from-zoom-to-twitch-or-youtube-1da9</guid>
      <description>&lt;p&gt;Zoom meetings are great for a small number of people, and if you’re willing to buy a Webinar license you can also use it for a full on webinar (although there are some interesting restrictions to webinars, like you can’t have breakout rooms).&lt;/p&gt;

&lt;p&gt;Twitch is a great streaming platform, originally used for streaming video games, its now more commonly being used to stream live coding and another technology related things that involve sharing your screen.&lt;/p&gt;

&lt;p&gt;Traditionally you’d use software called &lt;a href="https://obsproject.com/"&gt;Open Broadcaster Software (OBS)&lt;/a&gt; which you can compose multiple video/audio inputs into a single video that can be streamed to Twitch. This is how folks will compose their xbox, a chat screen and a webcam together in their stream.&lt;/p&gt;

&lt;p&gt;However OBS is quite CPU hungry (I think a GPU might help) and by the time you run OBS on a standard machine its tough to run anything else without starving OBS of resources and causing stuttering on the stream.&lt;/p&gt;

&lt;p&gt;Its made worse if you want to have multiple people on the stream and you end up running something like Zoom which allows you all to chat, and one or more of you to share your screen via zoom, then you just push Zoom itself through OBS.&lt;/p&gt;

&lt;p&gt;But if you’re already streaming video via Zoom, wouldn’t it be great if you could just use Zoom to stream directly to Twitch and cutout the middle man? Turns out you can!&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up Zoom to stream to Twitch
&lt;/h2&gt;

&lt;p&gt;Preamble aside, its fairly easy, but completely unintuitive to stream Zoom to Twitch. So lets talk it through. First of all you do need a paid [Pro, Business, Education, or Enterprise] account, hopefully you have that through your workplace.&lt;/p&gt;

&lt;p&gt;Log into your organization’s Zoom, and hit the &lt;strong&gt;Settings&lt;/strong&gt; button on the left hand menu. Scroll down to &lt;strong&gt;Advanced settings&lt;/strong&gt; and turn &lt;strong&gt;Allow live streaming meetings&lt;/strong&gt; on. Check either the &lt;strong&gt;YouTube&lt;/strong&gt; or the &lt;strong&gt;Custom Live Streaming Service&lt;/strong&gt; , the latter which we’ll configure for Twitch.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g_6waqbm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/streaming-from-zoom-to-twitch/zoom-settings.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g_6waqbm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/streaming-from-zoom-to-twitch/zoom-settings.png" alt="Zoom Settings Page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since I’m bad at remembering things, I throw the following in the instructions text box so I remember when setting up the meeting how to do it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stream url: rtmp://live.twitch.tv/app
stream key: &amp;lt;your twitch account stream key&amp;gt;
live streaming url: https://twitch.tv/accountname

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Then just hit Save. You’re now ready to stream. You can either set up the actual stream live in a Zoom meeting, or you can Schedule a meeting and configure it there. Let’s take a look at the latter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Schedule a Zoom meeting with Twitch Streaming
&lt;/h2&gt;

&lt;p&gt;In your Zoom account on the zoom website click &lt;strong&gt;Schedule a meeting&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Set a name, the start time, duration etc and click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This will drop you to the settings page for the meeting you just scheduled and on the bottom of that page is the &lt;strong&gt;Live Streaming&lt;/strong&gt; configuration setting. Click &lt;strong&gt;configure live stream settings&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rcpNfeaM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/streaming-from-zoom-to-twitch/schedule-a-meeting.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rcpNfeaM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/streaming-from-zoom-to-twitch/schedule-a-meeting.png" alt="schedule a meeting"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here you enter the details following the instructions you conveniently placed in the Stream settings:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;You can find the twitch key at the following URL &lt;a href="https://dashboard.twitch.tv/u/"&gt;https://dashboard.twitch.tv/u/&lt;/a&gt;/settings/channel&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NhQeckac--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/streaming-from-zoom-to-twitch/configure-live-stream.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NhQeckac--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/streaming-from-zoom-to-twitch/configure-live-stream.png" alt="configure live stream"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hit Save. Now when you join the Meeting it will automatically configure the Live Stream, but you’ll still need to start the Stream by clicking the &lt;strong&gt;… More&lt;/strong&gt; button and select the streaming option from there.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you didn’t configure live streaming for the meeting, you can actually configure it here as long as you’ve enabled streaming in Settings&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RlvFRVAs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/streaming-from-zoom-to-twitch/from-in-zoom-meeting.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RlvFRVAs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/streaming-from-zoom-to-twitch/from-in-zoom-meeting.png" alt="configure live stream in meeting"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zoom will redirect you to a browser and configure the stream before redirecting it to your twitch streaming page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4P4RJUEL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/streaming-from-zoom-to-twitch/start-stream.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4P4RJUEL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/streaming-from-zoom-to-twitch/start-stream.png" alt="starting stream"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can close this twitch streaming window once its started or leave it open. If you leave it open turn off its sound or you’ll create some fun echo loopbacks.&lt;/p&gt;

&lt;p&gt;Here’s the Twitch view:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yqhEVavP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/streaming-from-zoom-to-twitch/twitch-streaming.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yqhEVavP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/streaming-from-zoom-to-twitch/twitch-streaming.png" alt="twitch stream"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s the Zoom View:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YX4ikEbq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/streaming-from-zoom-to-twitch/zoom-streaming.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YX4ikEbq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://tech.paulcz.net/blog/streaming-from-zoom-to-twitch/zoom-streaming.png" alt="zoom stream"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
