A Windows PowerShell library to automate Blackmagic ATEM video switcher products.
This library uses the official BMD SDK, not the unsupported UDP implementation. You must have the ATEM software control v7.1 or higher installed (older versions of this library are available for 6.4 and up).
Requires .Net 4.5 and works on Windows 7 8.1 & 10
Can be used with PowerShell 32 or 64bit versions.
Supports most ATEM functionality but known to be missing camera control (I’m just lacking the equipment with this capability to test).
It is licensed under the MIT License but source code is not available. The media pool and media upload functionality are based on this project (Also MIT licensed) which is available here

The latest switcherlib.dll can be downloaded from OneDrive Remember to right click on the zip file after downloading and un-block it from the properties window.

Or run this snippet to download and unblock for you

$storageDir = "$($pwd)\Documents\WindowsPowerShell"
if(!(Test-Path -Path $storageDir )){

New-Item -ItemType directory -Path $storageDir

$webclient = New-Object System.Net.WebClient
$url = "!ApGpqMMpRLhikJVpf1M_JytL0tI7vQ"
$file = "$($storageDir)\SwitcherLib.dll"
Unblock-File -Path $file

20 Dec 2017 Fix to Aux settings and added HyperDeck media clip collection
20 Sep 2016 version 2.9 (added Hyperdeck support – Requires 6.8 or higher ATEM Software Control)
19 Sep 2016 version 2.8 (added Multiview support)
Version 2.7 (fixed transition status bool values)
Version 2.6 (added enum values for ME transition type properties)
Version 2.5 (added DSK and USK functionality)

Example use:

Raw commands

add-type -path 'C:\Users\[UserName]\Documents\WindowsPowerShell\SwitcherLib.dll'
$Global:atem = New-Object SwitcherLib.Switcher("")
# view all methods and properties of ATEM object
$atem | get-member
$MEs = $atem.getmes()
$me1 = $MEs[0]
# view all methods and properties of MixerEffectsBloc (you can do the same for other object collections)
$me1 | get-member
$inputs = $atem.getinputs()
$DSKs = $atem.getdsks()
$USKs = $atem.getKeys()


Not yet available.


$ME = $atem.GetMEs()
#view all methods and properties
$me | Get-Member

$me[0].Preview = 1
$me[0].Program = 2

#if you want to have ME object matching logical number


#get number of supported macros
# display details of Macro id 0
#Run Macro id 0
#Display all defined macros
do {
$macro = $atem.GetMacro($i)
If($macro[2] -eq 'true')
 Write-host "ID: $($i) Title: $($macro[0]), Description: $($macro[1])"
$i +=1
until($i -eq $atem.GetMacroCount()-1)


12 thoughts on “ATEM

  1. Thanks for spotting that, updated now.
    On any object like $MEs or $ME1 try adding | get-member after it to see all the methods and properties you can do with it.

  2. Hello, great work. Can you share on how to make this counter work (time spent on program input)??
    Can we count for some more documentation or manual how to quick start with tthis?

  3. Hi Ian,
    Thanks for your great work. 🙂
    Is it possible to select a clip or a still in the Media Pool and send it to one of the Media Players? I don’t understand how to access the Media Pool in your lib.

      1. :O And I guess I can do the same with MediaClip. Can’t wait to try that.
        Thanks again for your work and that quick answer. I’m not an IT person but have been able to bulld a PHP/Ajax GUI to drive out ATEM. Very excited about all the doors this opens.
        Greetings from Réunion island! 😉

  4. Could you make a video demostrating the setup? I’m trying the best I can to follow your instructions but I can’t make the scripts work because of e.g. “BadImageFormatException” … I really hope to make this work 🙂 Thank your for your time

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.