Core features

The Video SDK for macOS lets you control user video during a session: check video status, start video, stop video, and render a user's video. For per-device camera operations (switching, mirroring, rotating, pan/tilt/zoom), see Camera controls.

Prior to using video controls, you must request permission to use the camera. For details, see Requesting Authorization for Media Capture on macOS.

Start video

If the user's video is not already enabled, start video using startVideo, provided by the ZMVideoSDKVideoHelper.

// Get the ZMVideoSDKVideoHelper to perform video actions.
if let videoHelper = ZMVideoSDK.shared()?.getVideoHelper() {
    // Start local user's video.
    videoHelper.startVideo()
}
// Get the ZMVideoSDKVideoHelper to perform video actions.
ZMVideoSDKVideoHelper *videoHelper = [[ZMVideoSDK sharedVideoSDK] getVideoHelper];
if (videoHelper) {
    // Start local user's video.
    [videoHelper startVideo];
}

Stop video

To stop displaying the video of the user, use stopVideo.

// Get the ZMVideoSDKVideoHelper to perform video actions.
if let videoHelper = ZMVideoSDK.shared()?.getVideoHelper() {
    // Stop local user's video.
    videoHelper.stopVideo()
}
// Get the ZMVideoSDKVideoHelper to perform video actions.
ZMVideoSDKVideoHelper *videoHelper = [[ZMVideoSDK sharedVideoSDK] getVideoHelper];
if (videoHelper) {
    // Stop local user's video.
    [videoHelper stopVideo];
}

Render a user's video

To display a user's video, get their ZMVideoSDKVideoCanvas and subscribe an NSView to it. Retrieve each ZMVideoSDKUser as they join the session, then subscribe a view to render their stream.

Retrieve user

The ZMVideoSDKUserHelper helps with retrieval of user information. For more details on user management, see Sessions.

To be notified when users join a session, use onUserJoin within ZMVideoSDKDelegate.

func onUserJoin(_ userHelper: ZMVideoSDKUserHelper!, userList userArray: [ZMVideoSDKUser]!) {
    // userArray contains the new users.
    // Use helper to perform actions on a user.
    if let userArray = userArray {
        for user in userArray {
            print(user)
        }
    }
}
- (void)onUserJoin:(ZMVideoSDKUserHelper*)userHelper userList:(NSArray<ZMVideoSDKUser >)userArray {
    // userArray contains the new users.
    // Use helper to perform actions on a user.
    for (int i = 0; i < userArray.count; i++) {
        NSLog(@"%@", userArray[i]);
    }
}

Render a user's video into a view

Get the user's ZMVideoSDKVideoCanvas and subscribe an NSView to it with subscribeWithView, passing an aspect mode and resolution.

if let canvas = user.getVideoCanvas() {
    canvas.subscribe(with: yourView, aspectMode: .panAndScan, resolution: .auto)
}
ZMVideoSDKVideoCanvas *canvas = [user getVideoCanvas];
[canvas subscribeWithView:yourView aspectMode:ZMVideoSDKVideoAspect_PanAndScan resolution:ZMVideoSDKResolution_Auto];

The aspect mode controls how Zoom fits the video into the view.

TypeDescription
ZMVideoSDKVideoAspect_OriginalDisplay the video without any modifications.
ZMVideoSDKVideoAspect_Full_FilledStretch the video to fill the view.
ZMVideoSDKVideoAspect_LetterBoxAdd bars (top/bottom or left/right) so the full frame is visible without cropping.
ZMVideoSDKVideoAspect_PanAndScanCrop the frame to fill the view without bars.

To render multiple users at once (gallery view), subscribe a view for each user in onUserJoin and unsubscribe in onUserLeave.

Remove a user's video from a view

When a user leaves the session, or when you recycle a view for a different user, unsubscribe with unSubscribeWithView.

user.getVideoCanvas()?.unSubscribe(with: yourView)
[[user getVideoCanvas] unSubscribeWithView:yourView];

For custom rendering from raw YUV frames instead of an NSView, see Receive raw video data to subscribe to the user's video pipe. For sending or pre-processing video, see Send raw data.

Check the video status of a user

You can control video on a per-user basis. First check the current video status of the user.

// Get videoStatus for user.
let videoStatus = user.videoStatus()
// Check if user's video is on.
let isVideoOn = user.getVideoPipe().getVideoStatus().isOn()
// Get videoStatus for user.
ZMVideoSDKVideoStatus *videoStatus = [user videoStatus];
// Check if user's video is on.
BOOL isVideoOn = [[[user getVideoPipe] getVideoStatus] isOn];

To react to video status changes for all users, implement onUserVideoStatusChanged.