The audience for this post is a bit more specialized than usual. This post is for teachers who will be engaged in remote learning, use macOS, and have similar requirements for streaming and recording online lessons as I.
[Updated 12aug2020: I decided to purchase Loopback. It made the audio configuration so much easier. I’ve updated these instructions to tag Loopback and Soundflower-specific information.]
Here are my requirements:
- online lessons are useful both synchronously and asynchronously, as not every student will be able to attend lessons in real-time
- online lessons are recorded with high quality and later uploaded to my YouTube channel
- online lessons are streamed via Google Meet and Zoom (not sure which we will use this fall)
- during online lessons my audio is only heard via AirPods so as not to disturb my partner who is also working from home
- multiple video sources; specifically, the FaceTime camera on my MacBook, a screen being shared (to show slides and code), and my iPhone as an external camera to capture demonstrations and drawing on paper or a whiteboard; these can be combined (for example, when displaying my screen also display a small image of me in the corner)
- multiple audio sources; specifically, the audio from the playing videos and the audio from my mic
- all of this works on macOS Mojave 10.14.6 (it may or may not work on Catalina)
While this solution focuses on the hardware that I already have, various substitutions should work fine. For example, any earbud/mic device could be used instead of AirPods and an external web camera could be used instead of the iPhone. You could also do all of this on Windows, except for the iPhone hardwired as a video source. From what the kids tell me, the audio configuration is a lot easier and an alternate virtual camera is available.
At the heart of the solution for these requirements is the streaming software OBS. I first learned of OBS when students on our FIRST Robotics team used it when streaming the FIRST LEGO League Qualifying Tournament that we host.
Meeting these requirements was significantly harder than expected. After much iteration, here are the condensed steps to configure a system that meets my requirements:
- download and install OBS
- download and install obs-mac-virtualcam
- In order to stream via Google Meet or Zoom the composite video produced via OBS, you need to configure the video source in Meet or Zoom as the output from OBS instead of any actual camera. The obs-mac-virtualcam creates a virtual camera that displays the output from OBS.
- [Soundflower] download and install Soundflower
- By default, OBS cannot record the audio when playing a YouTube video in a browser, music from iTunes, or a video in QuickTime Player. This is a common challenge for those who use OBS to stream themselves playing video games and want to stream the audio from the game.
- I’ve had Soundflower installed for a while. I don’t remember why anymore. It solves the above challenge in that it allows you to route audio from one application to another. I’ll show below how to use it.
- Another option is Loopback from Rouge Amoeba. It looks much more powerful and Rogue Amoeba has awesome support. It is $99. If I have audio issues this fall, I’ll probably invest in Loopback.
- create a new Multi-Output Device
- The Audio MIDI Setup application is in the Utilities folder.
- Click on the “+” icon and select “Create Multi-Output Device”.
- Configure the new Multi-Output Device to use Soundflower (2ch) and AirPods.
- Configure AirPods as the Master Device for the new Multi-Output Device.
- This multi-output device routes the audio from macOS (from video, music, etc.) to the AirPods and Soundflower. We will use this multi-output device shortly.
- configure an Aggregate Device in Audio MIDI Setup
- Click on the “+” icon and select “Create Aggregate Device”.
- Configure the new Aggregate Device to use AirPods (the input one) and Soundflower (2ch).
- Configure AirPods as the Master Device for the new Aggregate Device.
- This aggregate device combines the audio from the mic on the AirPods (i.e., me speaking) and the audio from Soundflower (to which we routed the macOS audio from videos). We will use this Aggregate Device shortly.
- Configure the Sound Output and Input in the Sound System Preference
- Select the Multi-Output Device as the Output device. At this point, the macOS audio (e.g., from videos) will be sent to the AirPods and Soundflower.
- Select the AirPods as the Input device.
- [Loopback] install Loopback
- create a Loopback virtual device
- add Safari, iTunes, and AirPods as input devices
- add AirPods as a monitor
- configure the audio and video devices in Google Meet or Zoom
- [Soundflower] select the Aggregate Device as the microphone
- This results in the macOS audio (e.g., from videos) and the audio from the AirPod mic to be combined and streamed.
- [Loopback] select the Loopback device as the microphone
- This results in the macOS audio (e.g., from videos) and the audio from the AirPod mic to be combined and streamed.
- select the AirPods as the speaker
- This allows me to hear the macOS audio as well as the audio from others in the Google Meet or Zoom meeting.
- select the OBS Virtual Camera as the video camera
- increase the send resolution to 720p to make it easier to read code
- your video will look mirrored, but it won’t be for others in the meeting
- [Soundflower] select the Aggregate Device as the microphone
- configure an iPhone as an external video camera
- I bought this handy Square Jellyfish Metal Spring Tripod Mount to hold my phone and attach to a mini tripod that I already had.
- Connect the iPhone to the MacBook via a lightening-USB cable. The iPhone is now a video source in all applications in that whatever is on the iPhone screen is the output sent to the Mac. The quality and latency are both excellent when hardwired.
- The hardest part here was finding an iOS app that supported landscape orientation and didn’t have any controls on the screen. I finally found True Visage, which works great.
- configure the audio settings in OBS
- [Soundflower]
- select Soundflower (2ch) as the Desktop Audio
- select AirPods as Mic/Auxiliary Audio
- This combination of audio sources is what is used when recording in OBS. Please note that it is not the same as what is being streamed via Google Meet, which is the Aggregate Device. Selecting the Aggregate Device as the only audio source in OBS doesn’t appear to work, which was a surprise.
- [Soundflower]
- [Loopback] select Loopback as Mic/Auxiliary Audio
- configure the video settings in OBS
- I specified 1920×1080 as both the Base (Canvas) Resolution and the Output (Scaled) Resolution. This resolution has a 16:9 aspect ratio and looks good in Meet and Zoom. I first tried a 16:10 aspect ratio that matched that of my display, but Meet and Zoom both cropped the video output.
- create Scenes and configure Sources in OBS
- refer to the OBS documentation for details
- I created four scenes:
- present: my laptop display (to show code, slides, videos, etc.) with my face from the FaceTime camera in the lower-right corner
- whiteboard: my iPhone connected as a video source
- practice: a black screen with the text “time to practice” for when I don’t need or want to stream any video
- just me: me fullscreen from the FaceTime camera
- A couple points of clarification, I record from OBS by clicking on the “Start Recording” button. I stream via Google Meet or Zoom, not from OBS. I haven’t configured streaming via OBS and won’t click on the “Start Streaming” button.
- I configured a few hotkeys in OBS Settings to make it easy for me to switch scenes. I’ll probably configure a bunch more once I determine what I need in practice.
- Whew; that’s it!
I tested the audio and video quality when streaming using Google Meet and it was reasonable. The audio and video quality of the recorded video from OBS is excellent. I plan to use this setup for the upcoming semester and will update this document as I learn more and improve. If you are planning or have done something similar, please share. Best wishes to everyone this fall!