Skip to main content

Blackmagic Camera App XML Schema Reference

May 1, 2026

Complete XML schema documentation for the Blackmagic Camera iOS app custom streaming service configuration. All valid elements, attributes, and values.

Blackmagic Camera App XML Schema Reference

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:

ElementDescription
<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.”

ProtocolURL FormatNotes
RTMPrtmp://host:port/pathDefault port 1935. Stream key appended to path or set in app UI.
SRTsrt://host:portSupports ?mode=listener query parameter for listener mode.

Built-in service URLs (for reference):

ServiceProtocolURL
YouTubeRTMPrtmp://a.rtmp.youtube.com/live2
YouTube (backup)RTMPrtmp://b.rtmp.youtube.com/live2?backup=1
TwitchRTMPrtmp://live.twitch.tv/app
VimeoRTMPrtmp://rtmp-global.cloud.vimeo.com/live
VimeoSRTsrt://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 NameBitrate (<=30 fps)Bitrate (>30 fps)
Streaming Low3000000 (3 Mbps)4000000 (4 Mbps)
Streaming Medium4500000 (4.5 Mbps)7000000 (7 Mbps)
Streaming High6000000 (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 ElementDescription
<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:

AttributeRequiredValues
resolutionYesSee resolution values below

Resolution values:

The resolution attribute accepts the following values:

ValueDimensionsNotes
4K3840 x 2160Requires iPhone 15 Pro or later
HD1920 x 1080Most common for streaming
720p1280 x 720Lower bandwidth option
Open GateDevice-dependentFull sensor, non-standard aspect ratio

Children:

ElementUnitDescription
<bitrate>bpsVideo bitrate in bits per second. Example: 6000000 for 6 Mbps. See bitrate table above for defaults.
<audio-bitrate>bpsAudio bitrate in bits per second. Typical value: 128000 (128 kbps).
<keyframe-interval>secondsInterval between keyframes. Typical value: 2. Maps to the H.264 MaxKeyFrameInterval compression property.

<codec>

The app recognizes a <codec> element. The streaming pipeline supports:

CodecNotes
H.264Default for streaming. Universally supported.
H.265Available 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

  1. Save the XML file with a .xml extension
  2. Transfer to your iPhone via AirDrop, Files app, or any file sharing method
  3. Open the file and select “Blackmagic Camera” from the share sheet
  4. The service appears under Settings > Live Stream in the app

The app validates the XML on import. Common errors:

ErrorCause
Expected <streaming>Root element is not <streaming>
No server URL was providedMissing or empty <url> element
No supported server protocol found. Use RTMP or SRT.URL does not start with rtmp:// or srt://
XML is not validMalformed XML (unclosed tags, invalid characters)
Missing required: followed by element pathA required child element is missing

The app sanitizes XML entities. Unescaped & characters that are not valid XML entities will cause parse errors.