TAMS

Record video and audio streams into the Time Addressable Media Store (TAMS) and open a player for the recording. Each recording is tagged in the store with this component's name and id (the `_norsk-studio_` tags), so a TAMS client such as Norsk Cut can label and scope it.

Component Configuration

Option Description Required Environment override

id

A unique identifier for the component instance

✓

displayName

The name shown in the Studio UI of this component

✓

storePath

The path to which recordings will be made

✓

<COMPONENT_ID>_STOREPATH

cutsPath

Ignored, kept so older documents still load: cuts are now rendered, kept and expired by the Norsk engine's TAMS store. Remove it from your document.

✗

<COMPONENT_ID>_CUTSPATH

cutUrl

Where a Norsk Cut instance is served, absolute or root-relative (under norsk-ctl, https://<host>/instance/<id>/). When set, this component's view shows an "Open in Cut" link that opens Cut on its recordings in the TAMS store. Leave blank for no link.

✗

<COMPONENT_ID>_CUTURL

expiryHours

How long segments are kept on local disk, in hours. This is the local retention tier; when replicating to a remote store you can set a separate, longer remote expiry. (default: 24)

✗

<COMPONENT_ID>_EXPIRYHOURS

audioFragmentDurationSeconds

How long recorded audio fragments are, in seconds. Audio defaults to 11s, which sets how close to live a reader consuming both audio and video can play; a smaller value (e.g. 1) lowers that floor for near-live playback, at the cost of more, smaller objects. Leave blank to keep the 11s default.

✗

<COMPONENT_ID>_AUDIOFRAGMENTDURATIONSECONDS

remoteReplication

How recorded segments are retained. `None (local only)` keeps them on local disk for the expiry above and nowhere else. Choosing a remote object store (HTTP, S3 or OCI) replicates each segment there — advertised as a `remote` get_url on the TAMS timeline — and unlocks two tiered-storage modes via the retention setting: `Local + remote` (a fast local tier plus a durable remote copy, each with its own expiry) or `Expire when replicated` (local is freed once replicated and the remote store becomes the retention tier). S3 credentials come from the Norsk container's environment; OCI is supported natively with explicit auth defaulting to the instance principal. (default: {"type":"none"})

✗

<COMPONENT_ID>_REMOTEREPLICATION

Options with an environment override can be set when Studio starts, without editing the workflow. <COMPONENT_ID> is this component’s id in your workflow, uppercased, with spaces and dashes replaced by underscores and other punctuation removed — a component named SRT Input reads SRT_INPUT_PORT. Renaming a component changes its id, and so changes these variable names.

Remote Replication (None (local only))

Option Description Required

type

"none"

✓

Remote Replication (HTTP)

Option Description Required

type

"http"

✓

baseUrl

Base URL that segment objects are PUT under

✓

headers

Optional custom headers added to each PUT request (default: [])

✗

localRetention

What happens to a segment's local copy once it is safely on the remote store. "Local + remote" keeps it for the local expiry above, so the store has a fast local tier alongside the durable remote copy. "Expire when replicated" removes it, making the remote store the retention tier. Cuts and local playback need the local bytes, so choose "Local + remote" if you cut from this store. (default: "keepLocal")

✗

remoteExpiryHours

How long the remote store keeps each replicated segment, in hours. Leave blank to keep it indefinitely. Independent of the local expiry above — pair a short local expiry with a long (or blank) remote expiry for a small local cache backed by a durable remote archive.

✗

Remote Replication (S3)

Option Description Required

type

"s3"

✓

bucket

Target S3 bucket

✓

region

AWS region (defaults to the AWS_REGION environment variable)

✗

keyPrefix

Optional key prefix under which objects are uploaded

✗

endpoint

Override endpoint for S3-compatible stores (e.g. OCI Object Storage)

✗

forcePathStyle

Use path-style addressing, required by some S3-compatible stores (e.g. OCI)

✗

presign

Advertise presigned get_urls instead of plain object URLs

✗

presignExpirySeconds

Expiry, in seconds, for presigned get_urls

✗

localRetention

What happens to a segment's local copy once it is safely on the remote store. "Local + remote" keeps it for the local expiry above, so the store has a fast local tier alongside the durable remote copy. "Expire when replicated" removes it, making the remote store the retention tier. Cuts and local playback need the local bytes, so choose "Local + remote" if you cut from this store. (default: "keepLocal")

✗

remoteExpiryHours

How long the remote store keeps each replicated segment, in hours. Leave blank to keep it indefinitely. Independent of the local expiry above — pair a short local expiry with a long (or blank) remote expiry for a small local cache backed by a durable remote archive.

✗

Remote Replication (OCI)

Option Description Required

type

"oci"

✓

bucket

Target OCI Object Storage bucket

✓

auth

How Norsk authenticates to OCI. Instance principal (the default) needs no configuration when Norsk runs on a suitably-policied OCI instance; the other options supply user API-key material. (default: {"type":"instancePrincipal"})

✗

namespace

Object Storage namespace. Discovered from the tenancy when omitted.

✗

region

Region identifier, e.g. uk-london-1. Taken from the auth profile / instance metadata when omitted.

✗

keyPrefix

Optional key prefix under which objects are uploaded

✗

endpoint

Optional scheme://host[:port] override of the regional endpoint

✗

realmDomainComponent

Realm domain (default oraclecloud.com; set for government realms)

✗

presign

Advertise presigned get_urls instead of plain object URLs

✗

presignExpirySeconds

Expiry, in seconds, for presigned get_urls

✗

localRetention

What happens to a segment's local copy once it is safely on the remote store. "Local + remote" keeps it for the local expiry above, so the store has a fast local tier alongside the durable remote copy. "Expire when replicated" removes it, making the remote store the retention tier. Cuts and local playback need the local bytes, so choose "Local + remote" if you cut from this store. (default: "keepLocal")

✗

remoteExpiryHours

How long the remote store keeps each replicated segment, in hours. Leave blank to keep it indefinitely. Independent of the local expiry above — pair a short local expiry with a long (or blank) remote expiry for a small local cache backed by a durable remote archive.

✗

Tags in the TAMS store

The engine serves each recording as TAMS sources and flows under /x-tams. Because the recorder’s stream keys are fixed, every Studio recording would otherwise be labelled recorder; so the component stamps these tags on the recording’s group and on both of its streams, and a TAMS client such as Norsk Cut can label and scope recordings by them:

Tag Value

_norsk-studio_component

This component’s display name.

_norsk-studio_component_id

This component’s id in the workflow (also the media store’s name).

_norsk-studio_url

The Studio instance’s public URL, when the deployment sets STUDIO_URL_PREFIX to an absolute URL (norsk-ctl does); omitted otherwise.

To show only this component’s recordings in a TAMS client, scope on the engine’s store tag, _norsk_store (__mediaStoreName on older engines), whose value is the component id.

Cuts

POST /cut, GET /cut/{id}, GET /download/{cut_id} and the cuts listed by GET /timeline are rendered and kept by the Norsk engine’s TAMS store: Studio hands each cut to the store’s export API (POST <tams>/exports, advertised by GET <tams>/service under urn:x-norsk:tams:exports) and serves its status and file under the same routes and responses as before. Cut ids survive a restart; several cuts can render at once (the store queues beyond its limit, answering 409 when the queue is full); cut files are kept for the store’s export lifetime (24 hours by default), and cutsPath and pruneIntervalMs are ignored. The cuts are copies of whole GOPs, as before.

These routes need an engine with a TAMS data directory (tams.dataDir, or NORSK_TAMS_DATA_DIR); without one they answer 503, and the component shows a warning naming that setting. Recording is unaffected. They are kept for existing clients and are deprecated: new clients should use the store’s export API directly, which also offers frame-accurate cuts and flow-addressed edit lists.

Opening the recordings in Norsk Cut

Set cutUrl to where a Norsk Cut instance is served (under norsk-ctl, the instance URL, https://<host>/instance/<id>/) and the component’s view shows an "Open in Norsk Cut" link. It opens Cut on this engine’s TAMS store, scoped to this component’s recordings, and carries the store URL rather than the component’s own API.

Tags: tams media store recorder