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 |
✓ |
|
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. |
✗ |
|
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. |
✗ |
|
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) |
✗ |
|
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. |
✗ |
|
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"}) |
✗ |
|
|
Options with an environment override can be set when Studio starts, without
editing the workflow. |
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 |
|---|---|
|
This component’s display name. |
|
This component’s id in the workflow (also the media store’s name). |
|
The Studio instance’s public URL, when the deployment sets |
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