Blackmagic HyperDeck Disk Recorders Developer Information
Blackmagic HyperDeck Ethernet Protocol
The Blackmagic HyperDeck Ethernet Protocol is a text based protocol accessed by connecting to TCP port 9993 on HyperDeck Studio models that have a built in Ethernet connection. If you are a software developer, you can use the protocol to construct devices that integrate with our products. Here at Blackmagic Design our approach is to open up our protocols and we eagerly look forward to seeing what you come up with!
Protocol Commands
Command | Command Description |
---|---|
help or ? | Provides help text on all commands and parameters |
commands | return commands in XML format |
device info | return device information |
disk list | query clip list on active disk |
disk list: slot id: {n} | query clip list on disk in slot {n} |
quit | disconnect ethernet control |
ping | check device is responding |
preview: enable: {true/false} | switch to preview or output |
play | play from current timecode |
play: speed: {-5000 to 5000} | play at specific speed |
play: loop: {true/false} | play in loops or stop-at-end |
play: single clip: {true/false} | play current clip or all clips |
playrange | query playrange setting |
playrange set: clip id: {n} | set play range to play clip {n} only |
playrange set: clip id: {n} count: {m} | set play range to {m} clips starting from clip {n} |
playrange set: in: {inT} out: {outT} | set play range to play between: - timecode {inT} and timecode {outT} |
playrange set: timeline in: {in} timeline out: {out} | set play range in units of frames between: - timeline position {in} and position {out} clear/reset play range setting |
playrange clear | clear/reset play range setting |
play on startup | query unit play on startup state |
play on startup: enable: {true/false} | enable or disable play on startup |
play on startup: single clip: {true/false} | play single clip or all clips on startup |
play option | query play options |
play option: stop mode: {lastframe/nextframe/black} | set output frame when playback stops |
record | record from current input |
record: name: {name} | record named clip |
record spill | spill current recording to next slot |
record: spill: slot id: {n} | spill current recording to specified slot use current id to spill to same slot |
stop | stop playback or recording |
clips count | query number of clips on timeline |
clips get | query all timeline clips |
clips get: clip id: {n} | query a timeline clip info |
clips get: clip id: {n} count: {m} | query m clips starting from n |
clips get: version: {1/2} | query clip info using specified output version: version 1: is: name startT duration version 2: id: startT duration inT outT name |
clips add: name: {name} | append a clip to timeline |
clips add: clip id: {n} name: {name} | insert clip before existing clip {n} |
clips add: in: {inT} out: {outT} name: {name} | append the {inT} to {outT} portion of clip |
clips remove: clip id: {n} | remove clip {n} from the timeline (invalidates clip ids following clip {n}) |
clips clear | empty timeline clip list |
transport info | query current activity |
slot info | query active slot |
slot info: slot id: {n} | query slot {n} |
slot select: slot id: {n} | switch to specified slot |
slot select: video format: {format} | load clips of specified format |
slot unblock | unblock active slot |
slot unblock: slot id: {n} | unblock slot {n} |
cache info | query cache status |
dynamic range | query dynamic range settings |
dynamic range: playback override: {off/Rec709/Rec2020_SDR/HLG/ ST2084_300/ST2084_500/ ST2084_800/ST2084_1000/ ST2084_2000/ST2084_4000/ST2084 | set playback dynamic range override |
dynamic range: record override: {off/Rec709/Rec2020_SDR/HLG/ ST2084_300/ST2084_500/ ST2084_800/ST2084_1000/ ST2084_2000/ST2084_4000/ST2048} | set record dynamic range override |
notify | query notification status |
notify: remote: {true/false} | set remote notifications |
notify: transport: {true/false} | set transport notifications |
notify: slot: {true/false} | set slot notifications |
notify: configuration: {true/false} | set configuration notifications |
notify: dropped frames: {true/false} | set dropped frames notifications |
notify: display timecode: {true/false} | set display timecode notifications |
notify: timeline position: {true/false} | set playback timeline position notifications |
notify: playrange: {true/false} | set playrange notifications |
notify: cache: {true/false} | set cache notifications |
notify: dynamic range: {true/false} | set dynamic range settings notifications |
notify: slate: {true/false} | set digital slate notifications |
goto: clip id: {start/end} | goto first clip or last clip |
goto: clip id: {n} | goto clip id {n} |
goto: clip id: +{n} | go forward {n} clips |
goto: clip id: -{n} | go backward {n} clips |
goto: clip: {n} | goto frame position {n} within current clip |
goto: clip: +{n} | go forward {n} frames within current clip |
goto: clip: -{n} | go backward {n} frames within current clip |
goto: clip: {start/end} | goto start or end of clip |
goto: timeline: {n} | goto frame position {n} within timeline |
goto: timeline: +{n} | o forward {n} frames within timeline |
goto: timeline: -{n} | go backward {n} frames within timeline |
goto: timeline: {start/end} | goto start or end of timeline |
goto: timecode: {timecode} | goto specified timecode |
goto: timecode: +{timecode} | go forward {timecode} duration |
goto: timecode: -{timecode} | go backward {timecode} duration |
goto: slot id: {n} | goto slot id {n} |
jog: timecode: {timecode} | jog to timecode |
jog: timecode: +{timecode} | jog forward {timecode} duration |
jog: timecode: -{timecode} | jog backward {timecode} duration |
shuttle: speed: {-5000 to 5000} | shuttle with speed |
remote | query unit remote control state |
remote: enable: {true/false} | enable or disable remote control |
remote: override: {true/false} | session override remote control |
configuration | query configuration settings |
configuration: video input: SDI | switch to SDI input |
configuration: video input: HDMI | switch to HDMI input |
configuration: video input: component | switch to component input |
configuration: audio input: embedded | capture embedded audio |
configuration: audio input: XLR | capture XLR audio |
configuration: audio input: RCA | capture RCA audio |
configuration: file format: {format} | switch to specific file format |
configuration: audio codec: PCM | switch to PCM audio |
configuration: audio codec: AAC | switch to AAC audio |
configuration: timecode input: {external/embedded/preset/clip} | change the timecode input |
configuration: timecode output: {clip/timeline/internal} | change the timecode output |
configuration: timecode preference: {default/dropframe/nondropframe} | whether or not to use drop frame timecodes when not otherwise specified |
configuration: timecode preset: {timecode} | set the timecode preset |
configuration: audio input channels: {n} | set the number of audio channels recorded to {n} |
configuration: record trigger: {none/recordbit/timecoderun} | change the record trigger |
configuration: record prefix: {name} | set the record prefix name (supports UTF-8 name) |
configuration: append timestamp: {true/false} | append timestamp to recorded filename |
configuration: xlr input id: {n} xlr type: {line/mic} | configure xlr input type multiple xlr inputs can be configured in a single command |
configuration: genlock input resync: {true/false} | enable or disable genlock input resync |
uptime | return time since last boot |
format: prepare: {format} | prepare a disk formatting operation to filesystem {format} |
format: confirm: {token} | perform a pre-prepared formatting operation using token |
identify: enable: {true/false} | identify the device |
watchdog: period: {period in seconds} | client connection timeout |
reboot | reboot device |
slate clips | slate clips information |
slate project | slate project information |
slate project:↵ camera: {index}↵ | set camera index e.g. A |
Command Combinations
You can combine the parameters into a single command, for example:
play: speed: 200 loop: true single clip: true
Or for configuration:
configuration: video input: SDI audio input: XLR
Or to switch to the second disk, but only play NTSC clips:
slot select: slot id: 2 video format: NTSC
Using XML
While you can use the Terminal to talk to HyperDeck, if you are writing software, you can use XML to confirm the existence of a specific command based on the firmware of the HyperDeck you are communicating with. This helps your software user interface adjust to the capabilities of the specific HyperDeck model and software version.
Protocol Details
Connection
The HyperDeck Ethernet server listens on TCP port 9993.
Basic syntax
The HyperDeck protocol is a line oriented text protocol. Lines from the server will be separated by an ascii CR LF sequence. Messages from the client may be separated by LF or CR LF.
New lines are represented in this document as a "↵" symbol.
Single line command syntax
Command parameters are usually optional. A command with no parameters is terminated with a new line:
{Command name}↵
If parameters are specified, the command name is followed by a colon, then pairs of parameter names and values. Each parameter name is terminated with a colon character:
{Command name}: {Parameter}: {Value} {Parameter}: {Value} ...↵
Multiline command syntax
The HyperDeck protocol also supports an equivalent multiline syntax where each parameter-value pair is entered on a new line. E.g.
{Command name}:↵
{Parameter}: {Value}↵
{Parameter}: {Value}↵
↵
Response syntax
Simple responses from the server consist of a three digit response code and descriptive text terminated by a new line:
{Response code} {Response text}↵
If a response carries parameters, the response text is terminated with a colon, and parameter name and value pairs follow on subsequent lines until a blank line is returned:
{Response code} {Response text}:↵
{Parameter}: {Value}↵
{Parameter}: {Value}↵
...
↵
Successful response codes
A simple acknowledgement of a command is indicated with a response code of 200:
200 ok↵
Other successful responses carry parameters and are indicated with response codes in the range of 201 to 299.
Failure response codes
Failure responses to commands are indicated with response codes in the range of 100 to 199:
100 syntax error
101 unsupported parameter
102 invalid value
103 unsupported
104 disk full
105 no disk
106 disk error
107 timeline empty
108 internal error
109 out of range
110 no input
111 remote control disabled
112 clip not found
120 connection rejected
150 invalid state
151 invalid codec
160 invalid format
161 invalid token
162 format not prepared
163 parameterized single line command not supported
Asynchronous response codes
The server may return asynchronous messages at any time. These responses are indicated with response codes in the range of 500 to 599:
5xx {Response Text}:↵
{Parameter}: {Value}↵
{Parameter}: {Value}↵
↵
Connection response
On connection, an asynchronous message will be delivered:
500 connection info:↵
protocol version: {Version}↵
model: {Model Name}↵
↵
Connection rejection
Only one client may connect to the server at a time. If other clients attempt to connect concurrently, they will receive an error and be disconnected:
120 connection rejected↵
Timecode syntax
Timecodes are expressed as non-drop-frame timecode in the format:
HH:MM:SS:FF
Handling of deck "remote" state
The “remote” command may be used to enable or disable the remote control of the deck. Any attempt to change the deck state over ethernet while remote access is disabled will generate an error:
111 remote control disabled↵
To enable or disable remote control:
remote: enable: {“true”, “false”} ↵
The current remote control state may be overridden allowing remote access over ethernet irrespective of the current remote control state:
remote: override: {“true”, “false”} ↵
The override state is only valid for the currently connected ethernet client and only while the connection remains open.
The “remote” command may be used to query the remote control state of the deck by specifying no parameters:
remote↵
The deck will return the current remote control state:
210 remote info:↵
enable: {“true”, “false”} ↵
override: {“true”, “false”} ↵
↵
Asynchronous remote control information change notification is disabled by default and may be configured with the “notify” command. When enabled, changes in remote state will generate a “510 remote info:”asynchronous message with the same parameters as the “210 remote info:” message.
Closing connection
The "quit" command instructs the server to cleanly shut down the connection:
quit↵
Checking connection status
The "ping" command has no function other than to determine if the server is responding:
ping↵
Getting help
The "help" or "?" commands return human readable help text describing all available commands and parameters:
help↵
Or:
?↵
The server will respond with a list of all supported commands:
201 help:↵
{Help Text}↵
{Help Text}↵
↵
Switching to preview mode
The "preview" command instructs the deck to switch between preview mode and output mode:
preview: enable: {"true", "false"}↵
Playback will be stopped when the deck is switched to preview mode. Capturing will be stopped when the deck is switched to output mode.
Controlling device playback
The “play” command instructs the deck to start playing:
play↵
The play command accepts a number of parameters which may be used together in most combinations.
By default, the deck will play all remaining clips on the timeline then stop.
The “single clip” parameter may be used to override this behavior:
play: single clip: {"true", "false"}↵
By default, the deck will play at normal (100%) speed. An alternate speed may be specified in percentage between -1600 and 1600:
play: speed: {% normal speed}↵
By default, the deck will stop playing when it reaches to the end of the timeline. The “loop” parameter may be used to override this behavior:
play: loop: {“true”, “false”}↵
The “playrange” command instructs the deck to play all the clips. To override this behavior: and select a particular clip:
playrange set: clip id: {Clip ID}↵
To only play a certain timecode range:
playrange set: in: {in timecode} out: {out timecode}↵
To clear a set playrange and return to the default value:
playrange clear↵
The “play on startup command” instructs the deck on what action to take on startup. By default, the deck will not play. Use the “enable” command to start playback after each power up.
play on startup: enable {“true”, “false”}↵
By default, the unit will play back all clips on startup. Use the “single clip” command to override. play on startup: single clip: {“true”, “false”}↵
Stopping deck operation
The "stop" command instructs the deck to stop the current playback or capture:
stop↵
Changing timeline position
The "goto" command instructs the deck to switch to playback mode and change its position within the timeline.
To go to the start of a specific clip:
goto: clip id: {Clip ID}↵
To move forward/back {count} clips from the current clip on the current timeline:
goto: clip id: +/-{count}↵
Note that if the resultant clip id goes beyond the first or last clip on timeline, it will be clamp at the first or last clip.
To go to the start or end of the current clip:
goto: clip: {“start”, “end”}↵
To go to the start of the first clip or the end of the last clip:
goto: timeline: {“start”, “end”}↵
To go to a specified timecode:
goto: timecode: {timecode}↵
To move forward or back a specified duration in timecode:
goto: timecode: {“+”, “-”}{duration in timecode}↵
To specify between slot 1 and slot 2:
goto: slot id: {Slot ID}↵
Note that only one parameter/value pair is allowed for each goto command.
Enumerating supported commands and parameters
The "commands" command returns the supported commands:
commands↵
The command list is returned in a computer readable XML format:
212 commands:
<commands>↵
<command name="…"><parameter name="…"/>…</command>↵
<command name="…"><parameter name="…"/>…</command>↵
…
</commands>↵
↵
More XML tokens and parameters may be added in later releases.
Controlling asynchronous notifications
The “notify” command may be used to enable or disable asynchronous notifications from the server. To enable or disable transport notifications:
notify: transport: {“true”, “false”}↵
To enable or disable slot notifications:
notify: slot: {“true”, “false”}↵
To enable or disable remote notifications:
notify: remote: {“true”, “false”}↵
To enable or disable configuration notifications:
notify: configuration: {“true”, “false”}↵
Multiple parameters may be specified. If no parameters are specified, the server returns the current state of all notifications:
209 notify:↵
transport: {“true”, “false”}↵
slot: {“true”, “false”}↵
remote: {“true”, “false”}↵
configuration: {“true”, “false”}↵
dropped frames: {“true”, “false”}↵
display timecode: {“true”, “false”}↵
timeline position: {“true”, “false”}↵
playrange: {“true”, “false”}↵
cache: {“true”, “false”}↵
dynamic range: {“true”, “false”}↵
slate: {“true”, “false”}↵
↵
Retrieving device information
The "device info" command returns information about the connected deck device:
device info↵
The server will respond with:
204 device info:↵
protocol version: {Version}↵
model: {Model Name}↵
unique id: {unique alphanumeric identifier}↵
slot count: {number of storage slots}↵
software version: {software version}↵
↵
Retrieving slot information
The "slot info" command returns information about a slot. Without parameters, the command returns information for the currently selected slot:
slot info↵
If a slot id is specified, that slot will be queried:
slot info: slot id: {Slot ID}↵
The server will respond with slot specific information:
202 slot info:↵
slot id: {Slot ID}↵
status: {"empty", "mounting", "error", "mounted"}↵
volume name: {Volume name}↵
recording time: {recording time available in seconds}↵
video format: {disk's default video format}↵
blocked: {“true”, “false”}↵
↵
Asynchronous slot information change notification is disabled by default and may be configured with the "notify" command. When enabled, changes in slot state will generate a "502 slot info:" asynchronous message with the same parameters as the "202 slot info:" message.
Retrieving clip information
The “disk list” command returns the information for each playable clip on a given disk. Without parameters, the command returns information for the current active disk:
disk list↵
If a slot id is specified, the disk in that slot will be queried:
disk list: slot id: {Slot ID}↵
The server responds with the list of all playable clips on the disk in the format of: Index, name, formats, and duration in timecode:
206 disk list↵
slot id: {Slot ID}↵
{clip index}: {name} {file format} {video format} {Duration timecode}↵
{clip index}: {name} {file format} {video format} {Duration timecode}↵
…
↵
Note that the clip index starts from 1.
Retrieving clip count
The "clips count" command returns the number of clips on the current timeline:
clips count ↵
The server responds with the number of clips:
214 clips count: ↵
clip count: {Count}↵
Retrieving timeline information
The "clips get" command returns information for each available clip on the current timeline. Without parameters, the command returns information for all clips on timeline:
clips get ↵
The server responds with a list of clip IDs, names and timecodes:
205 clips info:↵
clip count: {Count}↵
{Clip ID}: {Name} {Start timecode} {Duration timecode}↵
{Clip ID}: {Name} {Start timecode} {Duration timecode}↵
…
↵
Retrieving transport information
The “transport info” command returns the state of the transport:
transport info ↵
The server responds with transport specific information:
208 transport info:
status: {“preview”, “stopped”, “play”, “forward”, “rewind”, “jog”, “shuttle”,”record”}↵
speed: {Play speed between -5000 and 5000 %}↵
slot id: {Slot ID or “none”}↵
clip id: {Clip ID or “none”}↵
single clip: {“true”, “false”}↵
display timecode: {timecode}↵
timecode: {timecode}↵
video format: {Video format}↵
loop: {“true”, “false”}↵
timeline: {n}↵
input video format: {Video format”}↵
dynamic range: {“off”, “Rec709”, “Rec2020_SDR”, “HLG”, “ST2084_300”, “ST2084_500”, “ST2084_800”, “ST2084_1000”, “ST2084_2000”, “ST2084_4000”, “ST2048” or “none”}↵
↵
The "timecode" value is the timecode within the current timeline for playback or the clip for record. The "display timecode" is the timecode displayed on the front of the deck. The two timecodes will differ in some deck modes.
Asynchronous transport information change notification is disabled by default and may be configured with the "notify" command. When enabled, changes in transport state will generate a "508 transport info:" asynchronous message with the same parameters as the "208 transport info:" message.
Video Formats
The following video formats are currently supported on HyperDeck Studio:
NTSC, PAL, NTSCp, PALp
720p50, 720p5994, 720p60
1080p23976, 1080p24, 1080p25, 1080p2997, 1080p30, 1080p60
1080i50, 1080i5994, 1080i60
HyperDeck Studio Pro and Plus models support these 4k formats:
4Kp23976, 4Kp24, 4Kp25, 4Kp2997, 4Kp30
HyperDeck Studio 4K Pro adds support for the following 4k formats:
4Kp50, 4Kp5994, 4Kp60
Video format support may vary between models and software releases.
File Formats
All HyperDeck models currently support the following file formats:
H.264High
H.264Medium
H.264Low
QuickTimeProResHQ
QuickTimeProRes
QuickTimeProResLT
QuickTimeProResProxy
QuickTimeDNxHD220x
DNxHD220x
QuickTimeDNxHD145
DNxHD145
QuickTimeDNxHD45
DNxHD45
HyperDeck Pro Plus and Pro models also support the following formats:
H.264High_SDI
HyperDeck Studio 4K Pro also supports the following file formats:
H.265High_SDI
H.265High
H.265Medium
H.265Low
QuickTimeDNxHR_HQX
DNxHR_HQX 4Kp60
QuickTimeDNxHR_SQ
DNxHR_SQ
QuickTimeDNxHR_LB
DNxHR_LB
Supported file formats may vary between models and software releases.
Querying and updating configuration information
The "configuration" command may be used to query the current configuration of the deck:
configuration↵
The server returns the configuration of the deck:
211 configuration:↵
audio input: {“embedded”, “XLR”, “RCA”}↵
audio mapping: {n}↵
video input: {“SDI”, “HDMI”, “component”, “composite”}↵
file format: {format}↵
audio codec: {“PCM”, “AAC”}↵
timecode input: {“external”, “embedded”, “preset”, “clip”}↵
timecode output: {“clip”, “timeline”}↵
timecode preference: {“default”, “dropframe”, “nondropframe”}↵
timecode preset: {timecode}↵
audio input channels: {n}↵
record trigger: {“none”, “recordbit”, “timecoderun”}↵
record prefix: {name}↵
append timestamp: {“true”, “false”}↵
↵
One or more configuration parameters may be specified to change the configuration of the deck.
To change the current video input:
configuration: video input: {“SDI”, “HDMI”, “component”}↵
Valid video inputs may vary between models. To configure the current audio input:
configuration: audio input: {“embedded”, “XLR”, “RCA”}↵
Valid audio inputs may vary between models.
To configure the current file format:
configuration: file format: {File format}↵
Note that changes to the file format may require the deck to reset, which will cause the client connection to be closed. In such case, response code 213 will be returned (instead of 200) before the client connection is closed:
“213 deck rebooting”
Asynchronous configuration information change notification is disabled by default and may be configured with the “notify” command. When enabled, changes in configuration will generate a “511 configuration:” asynchronous message with the same parameters as the “211 configuration:” message.
Selecting active slot and video format
The "slot select" command instructs the deck to switch to a specified slot, or/and to select a specified output video format.
To switch to a specified slot:
slot select: slot id: {slot ID}↵
To select the output video format:
slot select: video format: {video format}↵
Either or all slot select parameters may be specified. Note that selecting video format will result in a rescan of the disk to reconstruct the timeline with all clips of the specified video format.
Clearing the current timeline
The "clips clear" command instructs the deck to empty the current timeline:
clips clear↵
The server responds with
200 ok↵
Adding a clip to the current timeline
The "clips add:" command instructs the deck to add a clip to the current timeline: clips add: name:
{clip name}↵
The server responds with
200 ok↵
or in case of error
1xx {error description}↵
Configuring the watchdog
The “watchdog” command instructs the deck to monitor the connected client and terminate the connection if the client is inactive for at least a specified period of time.
To configure the watchdog:
watchdog: period: {period in seconds}↵
To avoid disconnection, the client must send a command to the server at least every {period} seconds. Note that if the period is set to 0 or less than 0, connection monitoring will be disabled.
Was this information helpful?