The Blackmagic Camera iOS app lets you add custom streaming services by importing an XML configuration file. This is the complete XML schema reference with all valid elements, attributes, and values.
Quick Start
Minimal working example for RTMP streaming to a local OBS instance:
<?xml version="1.0" encoding="UTF-8" ?>
<streaming>
<service>
<name>My OBS</name>
<servers>
<server>
<name>Default</name>
<url>rtmp://192.168.1.100:1935/live</url>
</server>
</servers>
<profiles>
<profile>
<name>Streaming High</name>
<config resolution="HD">
<bitrate>6000000</bitrate>
<audio-bitrate>128000</audio-bitrate>
<keyframe-interval>2</keyframe-interval>
</config>
</profile>
</profiles>
</service>
</streaming>
Save as a .xml file, AirDrop or share to your iPhone, and open with the Blackmagic Camera app.
Full Schema
<?xml version="1.0" encoding="UTF-8" ?>
<streaming>
<service>
<name>{service-name}</name>
<servers>
<server>
<name>{server-name}</name>
<url>{protocol://host:port/path}</url>
</server>
<!-- multiple <server> elements allowed -->
</servers>
<profiles>
<profile>
<name>{profile-name}</name>
<low-latency/> <!-- optional, self-closing -->
<credentials> <!-- optional -->
<username>{username}</username>
<password>{password}</password>
</credentials>
<config resolution="{resolution}">
<bitrate>{video-bps}</bitrate>
<audio-bitrate>{audio-bps}</audio-bitrate>
<keyframe-interval>{seconds}</keyframe-interval>
</config>
<!-- multiple <config> elements per profile allowed -->
</profile>
<!-- multiple <profile> elements allowed -->
</profiles>
</service>
</streaming>
Element Reference
<streaming> (root)
The root element. Required. The parser validates this with Expected <streaming> if missing or incorrect.
<service>
Container for one streaming service definition. Direct child of <streaming>.
Required children: <name>, <servers>, <profiles>
<service> / <name>
Display name for the streaming service. Shown in the app’s live stream platform list.
<servers>
Container for one or more server endpoints.
<server>
A single streaming endpoint.
Required children:
| Element | Description |
|---|---|
<name> | Display name for this server (e.g., “Primary”, “Backup”) |
<url> | Full URL including protocol, host, port, and path |
URL format:
Only two protocols are supported. The app validates with: “No supported server protocol found. Use RTMP or SRT.”
| Protocol | URL Format | Notes |
|---|---|---|
| RTMP | rtmp://host:port/path | Default port 1935. Stream key appended to path or set in app UI. |
| SRT | srt://host:port | Supports ?mode=listener query parameter for listener mode. |
Built-in service URLs (for reference):
| Service | Protocol | URL |
|---|---|---|
| YouTube | RTMP | rtmp://a.rtmp.youtube.com/live2 |
| YouTube (backup) | RTMP | rtmp://b.rtmp.youtube.com/live2?backup=1 |
| Twitch | RTMP | rtmp://live.twitch.tv/app |
| Vimeo | RTMP | rtmp://rtmp-global.cloud.vimeo.com/live |
| Vimeo | SRT | srt://srt-global.cloud.vimeo.com:9999 |
<profiles>
Container for one or more quality profiles.
<profile>
A streaming quality profile. The user selects between profiles in the app.
Required children: <name>, at least one <config>
Optional children: <low-latency/>, <credentials>
<profile> / <name>
Display name for this profile. The app has three built-in quality names that map to default bitrate tables:
| Profile Name | Bitrate (<=30 fps) | Bitrate (>30 fps) |
|---|---|---|
| Streaming Low | 3000000 (3 Mbps) | 4000000 (4 Mbps) |
| Streaming Medium | 4500000 (4.5 Mbps) | 7000000 (7 Mbps) |
| Streaming High | 6000000 (6 Mbps) | 9000000 (9 Mbps) |
You can use any name. Custom names use the bitrate values you specify in <config>.
<low-latency/>
Self-closing element. When present, enables low-latency streaming mode. Used internally by the app for remote camera control preview over SRT.
<credentials>
Optional authentication credentials, primarily for SRT passphrase-based authentication.
| Child Element | Description |
|---|---|
<username> | Username for the streaming service |
<password> | Password or SRT passphrase |
For RTMP, the stream key is typically set through the app’s UI dialog (“Set RTMP stream service key”) rather than in the XML.
<config>
Encoding configuration for a specific resolution. Multiple <config> elements per profile allow different bitrate settings per resolution.
Attributes:
| Attribute | Required | Values |
|---|---|---|
resolution | Yes | See resolution values below |
Resolution values:
The resolution attribute accepts the following values:
| Value | Dimensions | Notes |
|---|---|---|
4K | 3840 x 2160 | Requires iPhone 15 Pro or later |
HD | 1920 x 1080 | Most common for streaming |
720p | 1280 x 720 | Lower bandwidth option |
Open Gate | Device-dependent | Full sensor, non-standard aspect ratio |
Children:
| Element | Unit | Description |
|---|---|---|
<bitrate> | bps | Video bitrate in bits per second. Example: 6000000 for 6 Mbps. See bitrate table above for defaults. |
<audio-bitrate> | bps | Audio bitrate in bits per second. Typical value: 128000 (128 kbps). |
<keyframe-interval> | seconds | Interval between keyframes. Typical value: 2. Maps to the H.264 MaxKeyFrameInterval compression property. |
<codec>
The app recognizes a <codec> element. The streaming pipeline supports:
| Codec | Notes |
|---|---|
| H.264 | Default for streaming. Universally supported. |
| H.265 | Available on supported devices. Platform compatibility varies. |
Audio is always AAC for RTMP/SRT streaming.
Examples
RTMP to OBS Studio (local network)
<?xml version="1.0" encoding="UTF-8" ?>
<streaming>
<service>
<name>Local OBS</name>
<servers>
<server>
<name>Default</name>
<url>rtmp://192.168.1.100:1935/live</url>
</server>
</servers>
<profiles>
<profile>
<name>Streaming High</name>
<config resolution="HD" fps="30">
<bitrate>6000000</bitrate>
<audio-bitrate>128000</audio-bitrate>
<keyframe-interval>2</keyframe-interval>
</config>
<config resolution="HD" fps="60">
<bitrate>9000000</bitrate>
<audio-bitrate>128000</audio-bitrate>
<keyframe-interval>2</keyframe-interval>
</config>
</profile>
<profile>
<name>Streaming Medium</name>
<config resolution="HD" fps="30">
<bitrate>4500000</bitrate>
<audio-bitrate>128000</audio-bitrate>
<keyframe-interval>2</keyframe-interval>
</config>
<config resolution="HD" fps="60">
<bitrate>7000000</bitrate>
<audio-bitrate>128000</audio-bitrate>
<keyframe-interval>2</keyframe-interval>
</config>
</profile>
<profile>
<name>Streaming Low</name>
<config resolution="HD" fps="30">
<bitrate>3000000</bitrate>
<audio-bitrate>128000</audio-bitrate>
<keyframe-interval>2</keyframe-interval>
</config>
<config resolution="HD" fps="60">
<bitrate>4000000</bitrate>
<audio-bitrate>128000</audio-bitrate>
<keyframe-interval>2</keyframe-interval>
</config>
</profile>
</profiles>
</service>
</streaming>
SRT with Authentication
<?xml version="1.0" encoding="UTF-8" ?>
<streaming>
<service>
<name>SRT Server</name>
<servers>
<server>
<name>Primary</name>
<url>srt://stream.example.com:9000</url>
</server>
</servers>
<profiles>
<profile>
<name>SRT High Quality</name>
<low-latency/>
<credentials>
<username>streamer</username>
<password>my-srt-passphrase</password>
</credentials>
<config resolution="HD">
<bitrate>9000000</bitrate>
<audio-bitrate>128000</audio-bitrate>
<keyframe-interval>2</keyframe-interval>
</config>
</profile>
</profiles>
</service>
</streaming>
4K Streaming with Multiple Profiles
<?xml version="1.0" encoding="UTF-8" ?>
<streaming>
<service>
<name>4K Production</name>
<servers>
<server>
<name>Ingest</name>
<url>srt://ingest.example.com:9000</url>
</server>
</servers>
<profiles>
<profile>
<name>4K High</name>
<config resolution="4K">
<bitrate>20000000</bitrate>
<audio-bitrate>256000</audio-bitrate>
<keyframe-interval>2</keyframe-interval>
</config>
</profile>
<profile>
<name>HD Fallback</name>
<config resolution="HD">
<bitrate>6000000</bitrate>
<audio-bitrate>128000</audio-bitrate>
<keyframe-interval>2</keyframe-interval>
</config>
</profile>
<profile>
<name>720p Low Bandwidth</name>
<config resolution="720p">
<bitrate>3000000</bitrate>
<audio-bitrate>96000</audio-bitrate>
<keyframe-interval>2</keyframe-interval>
</config>
</profile>
</profiles>
</service>
</streaming>
Multiple Servers (Primary + Backup)
<?xml version="1.0" encoding="UTF-8" ?>
<streaming>
<service>
<name>Redundant Stream</name>
<servers>
<server>
<name>Primary</name>
<url>rtmp://primary.example.com:1935/live</url>
</server>
<server>
<name>Backup</name>
<url>rtmp://backup.example.com:1935/live</url>
</server>
</servers>
<profiles>
<profile>
<name>Streaming High</name>
<config resolution="HD">
<bitrate>6000000</bitrate>
<audio-bitrate>128000</audio-bitrate>
<keyframe-interval>2</keyframe-interval>
</config>
</profile>
</profiles>
</service>
</streaming>
Importing
- Save the XML file with a
.xmlextension - Transfer to your iPhone via AirDrop, Files app, or any file sharing method
- Open the file and select “Blackmagic Camera” from the share sheet
- The service appears under Settings > Live Stream in the app
The app validates the XML on import. Common errors:
| Error | Cause |
|---|---|
| Expected <streaming> | Root element is not <streaming> |
| No server URL was provided | Missing or empty <url> element |
| No supported server protocol found. Use RTMP or SRT. | URL does not start with rtmp:// or srt:// |
| XML is not valid | Malformed XML (unclosed tags, invalid characters) |
| Missing required: followed by element path | A required child element is missing |
The app sanitizes XML entities. Unescaped & characters that are not valid XML entities will cause parse errors.