Giving a Talk Over Zoom

I finally worked out how to overlay slides and stand up while giving a talk online

April 5, 2022

Screenshot of pragdave giving a remote talk

When the pandemic lockdowns started, I was in the middle of teaching a semester-long class on programming languages. I had to start giving my content online. I hated it. I hated that I couldn’t interact with the class. I hated having to juggle different views, switching from slides, to me, to an editor. But most of all, I hated talking while sitting down. Just the act of sitting seemed to drain all the energy out of it.

Since then I’ve been experimenting with different ways of organizing my online speaking environment, and yesterday I think I’ve come close to nailing it.


My video solution is to create slides with a pure black background. I then combine my camera video and the window capture from the slide presentation inside OBS.

I then set up a video filter for the slide channel which basically masks out anything that is black: only the slide foreground appears in the final video. I tried using the green screen filter with a custom color, but I ended up getting better results with a luma key:

Luma key setting to remove black

The next problem was that the slide content was hard to read on the video background. So I added a gray box around the content on the slide, and added a color key filter to OBS to match it and then reduce its opacity. The result (shown at the top of this post) is a semi-transparent gray background for the slide content.

Color key setting to fade background

And that’s it. I create slides with the black background and the content enclosed in the gray box. When merged with the camera video, the black disappears and the gray becomes semitransparent. When I don’t want any slide content on the feed, I simply include a blank black slide in the deck.

To start a talk, I bring up the slide presentation on a screen, make sure OBS is connected to both that screen and my camera feed, and then start the OBS virtual camera. I then configure the video source for whatever is being used to broadcast the talk (Zoom, Jitsi, or whatever) to use the OBS feed.

A Useful Side Effect

I find it hard to look at the camera when speaking, so this time I dug out an old screen I bought for some Raspberry Pi projects a while back. I spent all of 5 minutes making a plywood backer for it, to which I glued a 5/8” nut. I screwed this into an old microphone stand and positioned the screen right above my camera. I plumbed the HDMI into my Macbook, and used that screen as the place I displayed my presentation. Instant notes, instant feedback that I was on the correct slide, and somewhere to focus my eyes.

The monitor screen


I’m still struggling a little with audio. Unfortunately, OBS doesn’t send sound out through its virtual camera device. But only OBS knows the delays it is introducing to the video feed, and so only it can properly synchronize the audio and video. I’m still experimenting with this: currently I’m using VB-Cable to intercept the incoming output, feed it through some processing, and then feed the result as audio input to the video conference software. The results have not been great. The audio sounds fine, but the timing drifts. If anyone has a good way of handling this, I’d love to hear it.