[{"data":1,"prerenderedAt":1905},["ShallowReactive",2],{"navigation_docs_en":3,"-en-how-tos-publish-to-object-storage":427,"-en-how-tos-publish-to-object-storage-surround":1900},[4,25,83,133,247,262,332,361,407],{"title":5,"path":6,"stem":7,"children":8,"page":24},"Getting Started","\u002Fen\u002Fgetting-started","en\u002F1.getting-started",[9,14,19],{"title":10,"path":11,"stem":12,"icon":13},"Introduction","\u002Fen\u002Fgetting-started\u002Fintroduction","en\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":15,"path":16,"stem":17,"icon":18},"Quickstart","\u002Fen\u002Fgetting-started\u002Fquickstart","en\u002F1.getting-started\u002F2.quickstart","i-lucide-rocket",{"title":20,"path":21,"stem":22,"icon":23},"Concepts","\u002Fen\u002Fgetting-started\u002Fconcepts","en\u002F1.getting-started\u002F3.concepts","i-lucide-book-open",false,{"title":26,"path":27,"stem":28,"children":29,"page":24},"Live Production","\u002Fen\u002Flive-production","en\u002F2.live-production",[30,35,55,69],{"title":31,"path":32,"stem":33,"icon":34},"On air","\u002Fen\u002Flive-production\u002Fon-air","en\u002F2.live-production\u002F1.on-air","i-lucide-radio",{"title":36,"path":37,"stem":38,"children":39,"page":24},"Live Streams","\u002Fen\u002Flive-production\u002Flive-streams","en\u002F2.live-production\u002F2.live-streams",[40,45,50],{"title":41,"path":42,"stem":43,"icon":44},"Overview","\u002Fen\u002Flive-production\u002Flive-streams\u002Foverview","en\u002F2.live-production\u002F2.live-streams\u002F1.overview","i-lucide-list",{"title":46,"path":47,"stem":48,"icon":49},"Options","\u002Fen\u002Flive-production\u002Flive-streams\u002Flive-stream-options","en\u002F2.live-production\u002F2.live-streams\u002F2.live-stream-options","i-lucide-file-text",{"title":51,"path":52,"stem":53,"icon":54},"Start and stop","\u002Fen\u002Flive-production\u002Flive-streams\u002Fstart-stop","en\u002F2.live-production\u002F2.live-streams\u002F3.start-stop","i-lucide-play-circle",{"title":56,"path":57,"stem":58,"children":59,"page":24},"Scheduler","\u002Fen\u002Flive-production\u002Fscheduler","en\u002F2.live-production\u002F3.scheduler",[60,64],{"title":41,"path":61,"stem":62,"icon":63},"\u002Fen\u002Flive-production\u002Fscheduler\u002Foverview","en\u002F2.live-production\u002F3.scheduler\u002F1.overview","i-lucide-calendar-clock",{"title":65,"path":66,"stem":67,"icon":68},"Planned actions","\u002Fen\u002Flive-production\u002Fscheduler\u002Fplanned-actions","en\u002F2.live-production\u002F3.scheduler\u002F2.planned-actions","i-lucide-alarm-clock",{"title":70,"path":71,"stem":72,"children":73,"page":24},"Recordings","\u002Fen\u002Flive-production\u002Frecordings","en\u002F2.live-production\u002F4.recordings",[74,78],{"title":41,"path":75,"stem":76,"icon":77},"\u002Fen\u002Flive-production\u002Frecordings\u002Foverview","en\u002F2.live-production\u002F4.recordings\u002F1.overview","i-lucide-circle-dot",{"title":79,"path":80,"stem":81,"icon":82},"Editor","\u002Fen\u002Flive-production\u002Frecordings\u002Feditor","en\u002F2.live-production\u002F4.recordings\u002F2.editor","i-lucide-scissors",{"title":84,"path":85,"stem":86,"children":87,"page":24},"Configuration","\u002Fen\u002Fconfiguration","en\u002F3.configuration",[88,102,107,120],{"title":89,"path":90,"stem":91,"children":92,"page":24},"Devices","\u002Fen\u002Fconfiguration\u002Fdevices","en\u002F3.configuration\u002F1.devices",[93,97],{"title":89,"path":94,"stem":95,"icon":96},"\u002Fen\u002Fconfiguration\u002Fdevices\u002Fdevices","en\u002F3.configuration\u002F1.devices\u002F1.devices","i-lucide-server",{"title":98,"path":99,"stem":100,"icon":101},"Groups","\u002Fen\u002Fconfiguration\u002Fdevices\u002Fgroups","en\u002F3.configuration\u002F1.devices\u002F2.groups","i-lucide-network",{"title":103,"path":104,"stem":105,"icon":106},"Sources","\u002Fen\u002Fconfiguration\u002Fsources","en\u002F3.configuration\u002F2.sources","i-lucide-cable",{"title":108,"path":109,"stem":110,"children":111,"page":24},"Encodings","\u002Fen\u002Fconfiguration\u002Fencodings","en\u002F3.configuration\u002F3.encodings",[112,116],{"title":108,"path":113,"stem":114,"icon":115},"\u002Fen\u002Fconfiguration\u002Fencodings\u002Fprofiles","en\u002F3.configuration\u002F3.encodings\u002F1.profiles","i-lucide-sliders-horizontal",{"title":98,"path":117,"stem":118,"icon":119},"\u002Fen\u002Fconfiguration\u002Fencodings\u002Fgroups","en\u002F3.configuration\u002F3.encodings\u002F2.groups","i-lucide-layers",{"title":121,"path":122,"stem":123,"children":124,"page":24},"Destinations","\u002Fen\u002Fconfiguration\u002Fdestinations","en\u002F3.configuration\u002F4.destinations",[125,129],{"title":121,"path":126,"stem":127,"icon":128},"\u002Fen\u002Fconfiguration\u002Fdestinations\u002Fdestinations","en\u002F3.configuration\u002F4.destinations\u002F1.destinations","i-lucide-send",{"title":98,"path":130,"stem":131,"icon":132},"\u002Fen\u002Fconfiguration\u002Fdestinations\u002Fpublishing-groups","en\u002F3.configuration\u002F4.destinations\u002F2.publishing-groups","i-lucide-share-2",{"title":134,"path":135,"stem":136,"children":137,"page":24},"Settings","\u002Fen\u002Fsettings","en\u002F4.settings",[138,151,156,172,188],{"title":139,"path":140,"stem":141,"children":142,"page":24},"Users","\u002Fen\u002Fsettings\u002Fusers","en\u002F4.settings\u002F1.users",[143,147],{"title":139,"path":144,"stem":145,"icon":146},"\u002Fen\u002Fsettings\u002Fusers\u002Fusers","en\u002F4.settings\u002F1.users\u002F1.users","i-lucide-user",{"title":98,"path":148,"stem":149,"icon":150},"\u002Fen\u002Fsettings\u002Fusers\u002Fuser-groups","en\u002F4.settings\u002F1.users\u002F2.user-groups","i-lucide-users",{"title":152,"path":153,"stem":154,"icon":155},"Security","\u002Fen\u002Fsettings\u002Fsecurity","en\u002F4.settings\u002F2.security","i-lucide-shield",{"title":157,"icon":158,"path":159,"stem":160,"children":161,"page":24},"Assets","i-lucide-image","\u002Fen\u002Fsettings\u002Fassets","en\u002F4.settings\u002F3.assets",[162,167],{"title":163,"path":164,"stem":165,"icon":166},"Logos","\u002Fen\u002Fsettings\u002Fassets\u002Flogos","en\u002F4.settings\u002F3.assets\u002F1.logos","i-lucide-images",{"title":168,"path":169,"stem":170,"icon":171},"Files","\u002Fen\u002Fsettings\u002Fassets\u002Ffiles","en\u002F4.settings\u002F3.assets\u002F2.files","i-lucide-clapperboard",{"title":173,"icon":174,"path":175,"stem":176,"children":177,"page":24},"External Storage","i-lucide-folder-cog","\u002Fen\u002Fsettings\u002Fexternal-storage","en\u002F4.settings\u002F4.external-storage",[178,183],{"title":179,"path":180,"stem":181,"icon":182},"Remote Folders","\u002Fen\u002Fsettings\u002Fexternal-storage\u002Fremote-folders","en\u002F4.settings\u002F4.external-storage\u002F1.remote-folders","i-lucide-folder-archive",{"title":184,"path":185,"stem":186,"icon":187},"Target Folders","\u002Fen\u002Fsettings\u002Fexternal-storage\u002Ftarget-folders","en\u002F4.settings\u002F4.external-storage\u002F2.target-folders","i-lucide-folder-up",{"title":189,"path":190,"stem":191,"children":192,"page":24},"Integrations","\u002Fen\u002Fsettings\u002Fintegrations","en\u002F4.settings\u002F5.integrations",[193,197,202,216],{"title":41,"path":194,"stem":195,"icon":196},"\u002Fen\u002Fsettings\u002Fintegrations\u002Foverview","en\u002F4.settings\u002F5.integrations\u002F1.overview","i-lucide-plug",{"title":198,"path":199,"stem":200,"icon":201},"MediaCopilot","\u002Fen\u002Fsettings\u002Fintegrations\u002Fmediacopilot","en\u002F4.settings\u002F5.integrations\u002F2.mediacopilot","i-lucide-sparkles",{"title":203,"icon":204,"path":205,"stem":206,"children":207,"page":24},"C21 Live Cloud","i-lucide-cloud","\u002Fen\u002Fsettings\u002Fintegrations\u002Fc21livecloud","en\u002F4.settings\u002F5.integrations\u002F3.c21livecloud",[208,211],{"title":41,"path":209,"stem":210,"icon":204},"\u002Fen\u002Fsettings\u002Fintegrations\u002Fc21livecloud\u002Foverview","en\u002F4.settings\u002F5.integrations\u002F3.c21livecloud\u002F1.overview",{"title":212,"path":213,"stem":214,"icon":215},"Accounts","\u002Fen\u002Fsettings\u002Fintegrations\u002Fc21livecloud\u002Faccounts","en\u002F4.settings\u002F5.integrations\u002F3.c21livecloud\u002F2.accounts","i-lucide-key-round",{"title":217,"icon":155,"path":218,"stem":219,"children":220,"page":24},"DRM Providers","\u002Fen\u002Fsettings\u002Fintegrations\u002Fdrm","en\u002F4.settings\u002F5.integrations\u002F4.drm",[221,225,229,233,237,242],{"title":41,"path":222,"stem":223,"icon":224},"\u002Fen\u002Fsettings\u002Fintegrations\u002Fdrm\u002Foverview","en\u002F4.settings\u002F5.integrations\u002F4.drm\u002F1.overview","i-lucide-shield-check",{"title":226,"path":227,"stem":228,"icon":155},"Widevine","\u002Fen\u002Fsettings\u002Fintegrations\u002Fdrm\u002Fwidevine","en\u002F4.settings\u002F5.integrations\u002F4.drm\u002F2.widevine",{"title":230,"path":231,"stem":232,"icon":155},"PlayReady","\u002Fen\u002Fsettings\u002Fintegrations\u002Fdrm\u002Fplayready","en\u002F4.settings\u002F5.integrations\u002F4.drm\u002F3.playready",{"title":234,"path":235,"stem":236,"icon":155},"FairPlay","\u002Fen\u002Fsettings\u002Fintegrations\u002Fdrm\u002Ffairplay","en\u002F4.settings\u002F5.integrations\u002F4.drm\u002F4.fairplay",{"title":238,"path":239,"stem":240,"icon":241},"Providers","\u002Fen\u002Fsettings\u002Fintegrations\u002Fdrm\u002Fproviders","en\u002F4.settings\u002F5.integrations\u002F4.drm\u002F5.providers","i-lucide-shield-half",{"title":243,"path":244,"stem":245,"icon":246},"Workflow","\u002Fen\u002Fsettings\u002Fintegrations\u002Fdrm\u002Fworkflow","en\u002F4.settings\u002F5.integrations\u002F4.drm\u002F6.workflow","i-lucide-workflow",{"title":248,"path":249,"stem":250,"children":251,"page":24},"System Status","\u002Fen\u002Fsystem-status","en\u002F5.system-status",[252,257],{"title":253,"path":254,"stem":255,"icon":256},"Commands","\u002Fen\u002Fsystem-status\u002Fcommands","en\u002F5.system-status\u002F1.commands","i-lucide-square-terminal",{"title":258,"path":259,"stem":260,"icon":261},"Logs","\u002Fen\u002Fsystem-status\u002Flogs","en\u002F5.system-status\u002F2.logs","i-lucide-scroll-text",{"title":263,"path":264,"stem":265,"children":266,"page":24},"How Tos","\u002Fen\u002Fhow-tos","en\u002F6.how-tos",[267,272,277,282,286,291,296,300,304,309,313,318,323,328],{"title":268,"path":269,"stem":270,"icon":271},"Start and stop a Live stream","\u002Fen\u002Fhow-tos\u002Fstart-stream-via-api","en\u002F6.how-tos\u002F1.start-stream-via-api","i-lucide-terminal",{"title":273,"path":274,"stem":275,"icon":276},"Ingest a YouTube Live broadcast","\u002Fen\u002Fhow-tos\u002Fingest-youtube-live","en\u002F6.how-tos\u002F10.ingest-youtube-live","i-lucide-youtube",{"title":278,"path":279,"stem":280,"icon":281},"Source Synchronized Encoding (SSE) — bit-identical redundancy","\u002Fen\u002Fhow-tos\u002Fsource-synchronized-encoding","en\u002F6.how-tos\u002F11.source-synchronized-encoding","i-lucide-copy-check",{"title":283,"path":284,"stem":285,"icon":34},"Broadcast radio as video","\u002Fen\u002Fhow-tos\u002Fbroadcast-radio-as-video","en\u002F6.how-tos\u002F12.broadcast-radio-as-video",{"title":287,"path":288,"stem":289,"icon":290},"Real Time streaming to Dolby Millicast","\u002Fen\u002Fhow-tos\u002Freal-time-streaming","en\u002F6.how-tos\u002F13.real-time-streaming","i-lucide-zap",{"title":292,"path":293,"stem":294,"icon":295},"Publish to object storage (S3, Azure Blob)","\u002Fen\u002Fhow-tos\u002Fpublish-to-object-storage","en\u002F6.how-tos\u002F14.publish-to-object-storage","i-lucide-database",{"title":297,"path":298,"stem":299,"icon":224},"Protect a Live stream with multi-DRM","\u002Fen\u002Fhow-tos\u002Fmulti-drm-destination","en\u002F6.how-tos\u002F2.multi-drm-destination",{"title":301,"path":302,"stem":303,"icon":63},"Schedule a weekly recurring broadcast","\u002Fen\u002Fhow-tos\u002Fweekly-recurring-broadcast","en\u002F6.how-tos\u002F3.weekly-recurring-broadcast",{"title":305,"path":306,"stem":307,"icon":308},"Cut a clip in the Editor and send it to MediaCopilot","\u002Fen\u002Fhow-tos\u002Fexport-recording-to-mediacopilot","en\u002F6.how-tos\u002F4.export-recording-to-mediacopilot","i-lucide-upload-cloud",{"title":310,"path":311,"stem":312,"icon":158},"Apply a logo overlay to a running Live stream","\u002Fen\u002Fhow-tos\u002Fapply-logo-overlay","en\u002F6.how-tos\u002F5.apply-logo-overlay",{"title":314,"path":315,"stem":316,"icon":317},"Black out or replace the program on a running Live stream","\u002Fen\u002Fhow-tos\u002Fbroadcast-blackout","en\u002F6.how-tos\u002F6.broadcast-blackout","i-lucide-square",{"title":319,"path":320,"stem":321,"icon":322},"Switch the source of a running Live stream","\u002Fen\u002Fhow-tos\u002Fruntime-source-switch","en\u002F6.how-tos\u002F7.runtime-source-switch","i-lucide-repeat-2",{"title":324,"path":325,"stem":326,"icon":327},"Toggle a Publishing mid-broadcast","\u002Fen\u002Fhow-tos\u002Ftoggle-publishing-mid-broadcast","en\u002F6.how-tos\u002F8.toggle-publishing-mid-broadcast","i-lucide-toggle-right",{"title":329,"path":330,"stem":331,"icon":34},"Contribute a live signal to MediaCopilot Live","\u002Fen\u002Fhow-tos\u002Fcontribute-to-mediacopilot-live","en\u002F6.how-tos\u002F9.contribute-to-mediacopilot-live",{"title":333,"path":334,"stem":335,"children":336,"page":24},"Installation","\u002Fen\u002Finstallation","en\u002F7.installation",[337,342,347,352,357],{"title":338,"path":339,"stem":340,"icon":341},"Prepare the host","\u002Fen\u002Finstallation\u002Fprepare-host","en\u002F7.installation\u002F1.prepare-host","i-lucide-server-cog",{"title":343,"path":344,"stem":345,"icon":346},"Install C21 Live Control","\u002Fen\u002Finstallation\u002Fcontrol","en\u002F7.installation\u002F2.control","i-lucide-cloud-download",{"title":348,"path":349,"stem":350,"icon":351},"Install C21 Live Encoder","\u002Fen\u002Finstallation\u002Fencoder","en\u002F7.installation\u002F3.encoder","i-lucide-cpu",{"title":353,"path":354,"stem":355,"icon":356},"Updates","\u002Fen\u002Finstallation\u002Fupdates","en\u002F7.installation\u002F4.updates","i-lucide-refresh-cw",{"title":358,"path":359,"stem":360,"icon":215},"Licenses","\u002Fen\u002Finstallation\u002Flicenses","en\u002F7.installation\u002F5.licenses",{"title":362,"path":363,"stem":364,"children":365,"page":24},"Developers","\u002Fen\u002Fdevelopers","en\u002F8.developers",[366,370,388],{"title":41,"path":367,"stem":368,"icon":369},"\u002Fen\u002Fdevelopers\u002Foverview","en\u002F8.developers\u002F1.overview","i-lucide-code",{"title":371,"icon":369,"path":372,"stem":373,"children":374,"page":24},"API","\u002Fen\u002Fdevelopers\u002Fapi","en\u002F8.developers\u002F2.api",[375,378,383],{"title":41,"path":376,"stem":377,"icon":369},"\u002Fen\u002Fdevelopers\u002Fapi\u002Foverview","en\u002F8.developers\u002F2.api\u002F1.overview",{"title":379,"path":380,"stem":381,"icon":382},"Authentication","\u002Fen\u002Fdevelopers\u002Fapi\u002Fauthentication","en\u002F8.developers\u002F2.api\u002F2.authentication","i-lucide-key",{"title":384,"path":385,"stem":386,"icon":387},"Pagination and Errors","\u002Fen\u002Fdevelopers\u002Fapi\u002Fpagination-errors","en\u002F8.developers\u002F2.api\u002F3.pagination-errors","i-lucide-list-ordered",{"title":389,"icon":390,"path":391,"stem":392,"children":393,"page":24},"MCP Server","i-lucide-bot","\u002Fen\u002Fdevelopers\u002Fmcp-server","en\u002F8.developers\u002F3.mcp-server",[394,397,402],{"title":41,"path":395,"stem":396,"icon":390},"\u002Fen\u002Fdevelopers\u002Fmcp-server\u002Foverview","en\u002F8.developers\u002F3.mcp-server\u002F1.overview",{"title":398,"path":399,"stem":400,"icon":401},"Tools","\u002Fen\u002Fdevelopers\u002Fmcp-server\u002Ftools","en\u002F8.developers\u002F3.mcp-server\u002F2.tools","i-lucide-wrench",{"title":403,"path":404,"stem":405,"icon":406},"Examples","\u002Fen\u002Fdevelopers\u002Fmcp-server\u002Fexamples","en\u002F8.developers\u002F3.mcp-server\u002F3.examples","i-lucide-play",{"title":408,"path":409,"stem":410,"children":411,"page":24},"Resources","\u002Fen\u002Fresources","en\u002F9.resources",[412,417,422],{"title":413,"path":414,"stem":415,"icon":416},"Links","\u002Fen\u002Fresources\u002Flinks","en\u002F9.resources\u002F1.links","i-lucide-link",{"title":418,"path":419,"stem":420,"icon":421},"Release Notes","\u002Fen\u002Fresources\u002Frelease-notes","en\u002F9.resources\u002F2.release-notes","i-lucide-clipboard-list",{"title":423,"path":424,"stem":425,"icon":426},"Glossary","\u002Fen\u002Fresources\u002Fglossary","en\u002F9.resources\u002F3.glossary","i-lucide-book-a",{"id":428,"title":292,"body":429,"description":1893,"extension":1894,"links":1895,"meta":1896,"navigation":1897,"path":293,"seo":1898,"stem":294,"__hash__":1899},"docs_en\u002Fen\u002F6.how-tos\u002F14.publish-to-object-storage.md",{"type":430,"value":431,"toc":1869},"minimark",[432,440,455,460,463,469,481,485,535,539,599,603,898,902,908,970,1128,1146,1157,1168,1171,1174,1221,1224,1228,1232,1235,1477,1482,1486,1489,1504,1511,1515,1525,1529,1536,1546,1550,1553,1673,1676,1680,1687,1691,1715,1719,1722,1819,1825,1829,1865],[433,434,435,439],"p",{},[436,437,438],"strong",{},"Available in:"," UI · API",[433,441,442,443,446,447,450,451,454],{},"Use this how-to to send the segmented output of a Live stream into object storage instead of a CDN ingest. Two providers cover it: ",[436,444,445],{},"S3"," for any S3-compatible bucket and ",[436,448,449],{},"Azure Blob Storage"," for an Azure container. Both are ordinary ",[452,453,121],"a",{"href":126}," — there is no separate form and no extra entity to create.",[456,457,459],"h2",{"id":458},"when-to-use-this","When to use this",[433,461,462],{},"When you want to own the origin. The bucket holds the manifests and segments the Encoder produces, a CDN in front of it serves the audience, and the storage bill replaces the CDN ingest contract. It is also the shortest path to an archive that a player can read directly, and to a self-hosted origin on premises.",[433,464,465,468],{},[436,466,467],{},"S3 is not AWS-specific."," The same signed upload surface works against AWS S3, MinIO, Ceph RGW, Wasabi, Backblaze B2, DigitalOcean Spaces and Cloudflare R2, including endpoints on a non-default port.",[470,471,472,475,476,480],"callout",{"icon":295},[436,473,474],{},"A bucket is not a CDN."," Object storage is an origin: it has no caching, no geographic distribution, and it bills every request. Serving playback straight from the bucket works, but put a CDN in front of it and give players the CDN URL through the Destination's ",[477,478,479],"em",{},"Playback URL"," field.",[456,482,484],{"id":483},"prerequisites","Prerequisites",[486,487,488,499,514,523,529],"ul",{},[489,490,491,494,495,498],"li",{},[436,492,493],{},"A bucket or container, already created."," ",[436,496,497],{},"C21 Live Control"," does not create it. For S3, note the regional endpoint, the bucket name and the key prefix you want the output to live under; for Azure, the account endpoint and the container.",[489,500,501,504,505,508,509,513],{},[436,502,503],{},"Credentials scoped to that prefix."," For S3, an Access Key ID and a Secret Access Key belonging to an identity that can write and delete under the prefix. For Azure, a ",[436,506,507],{},"container-scoped"," SAS token (",[510,511,512],"code",{},"sr=c",") with create and write permission.",[489,515,516,519,520,522],{},[436,517,518],{},"A CDN in front of the bucket"," — recommended for anything an audience will watch. Its public URL is what goes into ",[477,521,479],{},".",[489,524,525,528],{},[436,526,527],{},"A configured Live stream"," whose Encoding produces HLS \u002F TS, DASH or CMAF output.",[489,530,531,534],{},[436,532,533],{},"Required role."," System Administrator to register the Destination; Operator (or System Administrator) to bind it to a Live stream and run the broadcast.",[456,536,538],{"id":537},"constraints-to-be-aware-of","Constraints to be aware of",[486,540,541,559,569,575,581,587,593],{},[489,542,543,546,547,550,551,554,555,558],{},[436,544,545],{},"Segmented formats only."," Object storage Destinations accept ",[510,548,549],{},"HLS \u002F TS",", ",[510,552,553],{},"DASH"," and ",[510,556,557],{},"CMAF",". The provider is not offered on RTMP, Enhanced RTMP, SRT, STREAM, SDIOUT or Record.",[489,560,561,564,565,522],{},[436,562,563],{},"No region field on S3, by design."," The signing region is derived from the endpoint and corrected automatically — see ",[452,566,568],{"href":567},"#region-s3","Region (S3)",[489,570,571,574],{},[436,572,573],{},"Temporary STS credentials are not supported."," Use long-lived keys.",[489,576,577,580],{},[436,578,579],{},"Per-object SSE-KMS keys are not supported."," Bucket-level default encryption (SSE-S3 or SSE-KMS) applies transparently and needs nothing here.",[489,582,583,586],{},[436,584,585],{},"Storage class is the bucket default."," Use a lifecycle rule to transition objects to a cheaper class.",[489,588,589,592],{},[436,590,591],{},"Azure Blob Storage is not purged by the Encoder."," Old segments stay in the container until an Azure lifecycle management rule expires them.",[489,594,595,598],{},[436,596,597],{},"DASH and CMAF orphan one session's objects per Encoder restart."," Their segment names carry a per-session timestamp, so a restart begins a new naming session and the previous session's objects are left behind — nothing in the product tracks them afterwards. A lifecycle rule on the prefix is required, not optional. HLS is unaffected: its segments are a continuous counter under a fixed path, so the window keeps rolling across restarts.",[456,600,602],{"id":601},"via-ui","Via UI",[604,605,606,611,643,649,749,753,826,830,833,843,856,870,874,888,892],"steps",{},[607,608,610],"h3",{"id":609},"create-the-destination","Create the Destination",[433,612,613,614,617,618,621,622,625,626,550,628,630,631,633,634,637,638,630,640,642],{},"Navigate: ",[436,615,616],{},"Destinations → Add destination",". Set ",[477,619,620],{},"Name",", pick the ",[477,623,624],{},"Type"," (",[436,627,549],{},[436,629,553],{}," or ",[436,632,557],{},") and set ",[477,635,636],{},"Provider"," to ",[436,639,445],{},[436,641,449],{},". The rest of the form relabels itself around the provider.",[433,644,645,646,648],{},"For ",[436,647,445],{},":",[650,651,652,668],"table",{},[653,654,655],"thead",{},[656,657,658,662,665],"tr",{},[659,660,661],"th",{},"UI label",[659,663,664],{},"API field",[659,666,667],{},"Value",[669,670,671,690,705,720,735],"tbody",{},[656,672,673,679,684],{},[674,675,676],"td",{},[477,677,678],{},"Endpoint and bucket",[674,680,681],{},[510,682,683],{},"settings_common.urls.primary_server",[674,685,686,687,522],{},"Endpoint, bucket and key prefix in one URL, for example ",[510,688,689],{},"https:\u002F\u002Fs3.eu-west-1.amazonaws.com\u002Fmy-bucket\u002Flive",[656,691,692,697,702],{},[674,693,694],{},[477,695,696],{},"Stream name",[674,698,699],{},[510,700,701],{},"settings_common.stream",[674,703,704],{},"Appended to the prefix — it becomes the key's next path segment.",[656,706,707,712,717],{},[674,708,709],{},[477,710,711],{},"Access Key ID",[674,713,714],{},[510,715,716],{},"settings_common.username",[674,718,719],{},"The access key id.",[656,721,722,727,732],{},[674,723,724],{},[477,725,726],{},"Secret Access Key",[674,728,729],{},[510,730,731],{},"settings_common.password",[674,733,734],{},"The matching secret. Stored encrypted; reads return the sentinel.",[656,736,737,741,746],{},[674,738,739],{},[477,740,479],{},[674,742,743],{},[510,744,745],{},"settings_common.urls.player",[674,747,748],{},"The CDN URL players should use.",[433,750,645,751,648],{},[436,752,449],{},[650,754,755,765],{},[653,756,757],{},[656,758,759,761,763],{},[659,760,661],{},[659,762,664],{},[659,764,667],{},[669,766,767,783,796,814],{},[656,768,769,774,778],{},[674,770,771],{},[477,772,773],{},"Primary server",[674,775,776],{},[510,777,683],{},[674,779,780,522],{},[510,781,782],{},"https:\u002F\u002F\u003Caccount>.blob.core.windows.net\u002F\u003Ccontainer>\u002F\u003Cprefix>",[656,784,785,789,793],{},[674,786,787],{},[477,788,696],{},[674,790,791],{},[510,792,701],{},[674,794,795],{},"Appended to the prefix, as above.",[656,797,798,803,807],{},[674,799,800],{},[477,801,802],{},"SAS token",[674,804,805],{},[510,806,731],{},[674,808,809,810,813],{},"The container SAS. With or without its leading ",[510,811,812],{},"?"," — both are accepted. There is no username: the SAS is the whole authorisation.",[656,815,816,820,824],{},[674,817,818],{},[477,819,479],{},[674,821,822],{},[510,823,745],{},[674,825,748],{},[607,827,829],{"id":828},"get-the-url-right","Get the URL right",[433,831,832],{},"Both S3 addressing styles are accepted and need nothing to distinguish them:",[834,835,841],"pre",{"className":836,"code":838,"language":839,"meta":840},[837],"language-text","path-style            https:\u002F\u002Fs3.eu-west-1.amazonaws.com\u002Fmy-bucket\u002Flive\nvirtual-hosted-style  https:\u002F\u002Fmy-bucket.s3.eu-west-1.amazonaws.com\u002Flive\nself-hosted           https:\u002F\u002Fminio.example.com:9000\u002Fmy-bucket\u002Flive\n","text","",[510,842,838],{"__ignoreMap":840},[433,844,845,846,494,848,851,852,855],{},"With ",[477,847,696],{},[510,849,850],{},"channel-1",", the first form writes ",[510,853,854],{},"my-bucket\u002Flive\u002Fchannel-1\u002Findex.m3u8"," and its segments alongside.",[433,857,858,861,862,865,866,869],{},[436,859,860],{},"Use a regional endpoint."," The global ",[510,863,864],{},"s3.amazonaws.com"," answers with a redirect to the bucket's own region, and a redirected request no longer matches its signature. The editor warns about this under the field, and about an endpoint that is not ",[510,867,868],{},"https"," or that carries no bucket in its path. The warnings do not block the save.",[607,871,873],{"id":872},"bind-the-destination-to-a-live-stream","Bind the Destination to a Live stream",[433,875,876,877,880,881,883,884,887],{},"Open the target Live stream in the ",[452,878,879],{"href":42},"Live streams editor"," and add the new Destination under ",[477,882,121],{}," — directly, or through a ",[452,885,886],{"href":130},"Destination group",". Save.",[607,889,891],{"id":890},"start-the-live-stream","Start the Live stream",[433,893,894,895,897],{},"Start the broadcast from ",[452,896,31],{"href":32},". The Destination turns active on the per-Destination indicator of the on-air row, and objects begin to appear under the prefix.",[456,899,901],{"id":900},"via-api","Via API",[433,903,904,905,522],{},"Every call uses the standard bearer header ",[510,906,907],{},"Authorization: Bearer \u003CYOUR_API_TOKEN>",[650,909,910,923],{},[653,911,912],{},[656,913,914,917,920],{},[659,915,916],{},"Action",[659,918,919],{},"Method + path",[659,921,922],{},"operationId",[669,924,925,940,955],{},[656,926,927,930,935],{},[674,928,929],{},"List the provider catalogue",[674,931,932],{},[510,933,934],{},"GET \u002Fc21apiv2\u002Fpublishing\u002Fproviders",[674,936,937],{},[510,938,939],{},"getPublishingProviders",[656,941,942,945,950],{},[674,943,944],{},"Create a Destination",[674,946,947],{},[510,948,949],{},"POST \u002Fc21apiv2\u002Fpublishings",[674,951,952],{},[510,953,954],{},"addPublishing",[656,956,957,960,965],{},[674,958,959],{},"Update a Destination",[674,961,962],{},[510,963,964],{},"PUT \u002Fc21apiv2\u002Fpublishings\u002F{publishingId}",[674,966,967],{},[510,968,969],{},"updatePublishing",[834,971,975],{"className":972,"code":973,"language":974,"meta":840,"style":840},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -X POST \"https:\u002F\u002F\u003Cyour-host>\u002Fc21apiv2\u002Fpublishings\" \\\n  -H \"Authorization: Bearer \u003CYOUR_API_TOKEN>\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"name\": \"Origin bucket — Channel 1\",\n    \"type\": \"HLS \u002F TS\",\n    \"settings_common\": {\n      \"provider\": \"S3\",\n      \"stream\": \"channel-1\",\n      \"username\": \"\u003CAccess Key ID>\",\n      \"password\": \"\u003CSecret Access Key>\",\n      \"urls\": {\n        \"primary_server\": \"https:\u002F\u002Fs3.eu-west-1.amazonaws.com\u002Fmy-bucket\u002Flive\",\n        \"player\": \"https:\u002F\u002Fcdn.example.com\u002Flive\u002Fchannel-1\u002Findex.m3u8\"\n      }\n    }\n  }'\n","bash",[510,976,977,1007,1021,1035,1047,1053,1059,1065,1071,1077,1083,1089,1095,1101,1107,1113,1119],{"__ignoreMap":840},[978,979,982,986,990,993,997,1000,1003],"span",{"class":980,"line":981},"line",1,[978,983,985],{"class":984},"sBMFI","curl",[978,987,989],{"class":988},"sfazB"," -X",[978,991,992],{"class":988}," POST",[978,994,996],{"class":995},"sMK4o"," \"",[978,998,999],{"class":988},"https:\u002F\u002F\u003Cyour-host>\u002Fc21apiv2\u002Fpublishings",[978,1001,1002],{"class":995},"\"",[978,1004,1006],{"class":1005},"sTEyZ"," \\\n",[978,1008,1010,1013,1015,1017,1019],{"class":980,"line":1009},2,[978,1011,1012],{"class":988},"  -H",[978,1014,996],{"class":995},[978,1016,907],{"class":988},[978,1018,1002],{"class":995},[978,1020,1006],{"class":1005},[978,1022,1024,1026,1028,1031,1033],{"class":980,"line":1023},3,[978,1025,1012],{"class":988},[978,1027,996],{"class":995},[978,1029,1030],{"class":988},"Content-Type: application\u002Fjson",[978,1032,1002],{"class":995},[978,1034,1006],{"class":1005},[978,1036,1038,1041,1044],{"class":980,"line":1037},4,[978,1039,1040],{"class":988},"  -d",[978,1042,1043],{"class":995}," '",[978,1045,1046],{"class":988},"{\n",[978,1048,1050],{"class":980,"line":1049},5,[978,1051,1052],{"class":988},"    \"name\": \"Origin bucket — Channel 1\",\n",[978,1054,1056],{"class":980,"line":1055},6,[978,1057,1058],{"class":988},"    \"type\": \"HLS \u002F TS\",\n",[978,1060,1062],{"class":980,"line":1061},7,[978,1063,1064],{"class":988},"    \"settings_common\": {\n",[978,1066,1068],{"class":980,"line":1067},8,[978,1069,1070],{"class":988},"      \"provider\": \"S3\",\n",[978,1072,1074],{"class":980,"line":1073},9,[978,1075,1076],{"class":988},"      \"stream\": \"channel-1\",\n",[978,1078,1080],{"class":980,"line":1079},10,[978,1081,1082],{"class":988},"      \"username\": \"\u003CAccess Key ID>\",\n",[978,1084,1086],{"class":980,"line":1085},11,[978,1087,1088],{"class":988},"      \"password\": \"\u003CSecret Access Key>\",\n",[978,1090,1092],{"class":980,"line":1091},12,[978,1093,1094],{"class":988},"      \"urls\": {\n",[978,1096,1098],{"class":980,"line":1097},13,[978,1099,1100],{"class":988},"        \"primary_server\": \"https:\u002F\u002Fs3.eu-west-1.amazonaws.com\u002Fmy-bucket\u002Flive\",\n",[978,1102,1104],{"class":980,"line":1103},14,[978,1105,1106],{"class":988},"        \"player\": \"https:\u002F\u002Fcdn.example.com\u002Flive\u002Fchannel-1\u002Findex.m3u8\"\n",[978,1108,1110],{"class":980,"line":1109},15,[978,1111,1112],{"class":988},"      }\n",[978,1114,1116],{"class":980,"line":1115},16,[978,1117,1118],{"class":988},"    }\n",[978,1120,1122,1125],{"class":980,"line":1121},17,[978,1123,1124],{"class":988},"  }",[978,1126,1127],{"class":995},"'\n",[433,1129,1130,1131,1134,1135,1138,1139,1142,1143,522],{},"The Azure variant is the same call with ",[510,1132,1133],{},"\"provider\": \"Azure Blob Storage\"",", the container URL in ",[510,1136,1137],{},"primary_server",", the SAS token in ",[510,1140,1141],{},"password"," and no ",[510,1144,1145],{},"username",[433,1147,1148,1149,1152,1153,1156],{},"Credentials are write-only. Every read path returns the sentinel ",[510,1150,1151],{},"••••••••"," when a value is stored and an empty string when it is not; echoing the sentinel back on a write keeps the stored value, so a ",[510,1154,1155],{},"PUT"," that only changes the stream name does not need the secret in hand.",[433,1158,1159,1160,1163,1164,1167],{},"See ",[452,1161,1162],{"href":376},"API → Overview"," for the standard envelope and ",[452,1165,1166],{"href":385},"Pagination and errors"," for error handling.",[456,1169,568],{"id":1170},"region-s3",[433,1172,1173],{},"SigV4 binds a signature to a region, and the Encoder works the region out rather than asking for something the endpoint can state itself. In order:",[1175,1176,1177,1183,1207,1215],"ol",{},[489,1178,1179,1182],{},[436,1180,1181],{},"The endpoint's own answer."," An unsigned probe on the bucket returns the region alongside its denial, so this resolves correctly even with credentials that may only write objects.",[489,1184,1185,1188,1189,550,1192,550,1195,1198,1199,1202,1203,1206],{},[436,1186,1187],{},"The hostname",", for the vendors that encode it in a label — ",[510,1190,1191],{},"s3.\u003Cregion>.amazonaws.com",[510,1193,1194],{},"s3.\u003Cregion>.wasabisys.com",[510,1196,1197],{},"\u003Cregion>.digitaloceanspaces.com",", and ",[510,1200,1201],{},"*.r2.cloudflarestorage.com"," (which signs as ",[510,1204,1205],{},"auto",").",[489,1208,1209,1214],{},[436,1210,1211],{},[510,1212,1213],{},"us-east-1",", which is what an S3 implementation with no configured region accepts.",[489,1216,1217,1220],{},[436,1218,1219],{},"Correction."," If the storage rejects the request as a malformed authorisation header, its answer names the region it expects; the Encoder adopts it, records the correction and re-signs. A misconfigured region therefore costs one request, not an outage.",[433,1222,1223],{},"The region in use is reported in the Encoder log when publishing starts.",[456,1225,1227],{"id":1226},"bucket-setup","Bucket setup",[607,1229,1231],{"id":1230},"iam-policy-aws-s3","IAM policy (AWS S3)",[433,1233,1234],{},"Give the Destination its own identity with nothing but the verbs it uses, scoped to the prefix it writes. Do not reuse an administrative key.",[834,1236,1240],{"className":1237,"code":1238,"language":1239,"meta":840,"style":840},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"Version\": \"2012-10-17\",\n  \"Statement\": [\n    {\n      \"Sid\": \"PublishSegments\",\n      \"Effect\": \"Allow\",\n      \"Action\": [\"s3:PutObject\", \"s3:DeleteObject\"],\n      \"Resource\": \"arn:aws:s3:::my-bucket\u002Flive\u002F*\"\n    },\n    {\n      \"Sid\": \"RegionDiscovery\",\n      \"Effect\": \"Allow\",\n      \"Action\": \"s3:GetBucketLocation\",\n      \"Resource\": \"arn:aws:s3:::my-bucket\"\n    }\n  ]\n}\n","json",[510,1241,1242,1246,1269,1283,1288,1309,1329,1362,1381,1386,1390,1409,1427,1446,1463,1467,1472],{"__ignoreMap":840},[978,1243,1244],{"class":980,"line":981},[978,1245,1046],{"class":995},[978,1247,1248,1251,1255,1257,1259,1261,1264,1266],{"class":980,"line":1009},[978,1249,1250],{"class":995},"  \"",[978,1252,1254],{"class":1253},"spNyl","Version",[978,1256,1002],{"class":995},[978,1258,648],{"class":995},[978,1260,996],{"class":995},[978,1262,1263],{"class":988},"2012-10-17",[978,1265,1002],{"class":995},[978,1267,1268],{"class":995},",\n",[978,1270,1271,1273,1276,1278,1280],{"class":980,"line":1023},[978,1272,1250],{"class":995},[978,1274,1275],{"class":1253},"Statement",[978,1277,1002],{"class":995},[978,1279,648],{"class":995},[978,1281,1282],{"class":995}," [\n",[978,1284,1285],{"class":980,"line":1037},[978,1286,1287],{"class":995},"    {\n",[978,1289,1290,1293,1296,1298,1300,1302,1305,1307],{"class":980,"line":1049},[978,1291,1292],{"class":995},"      \"",[978,1294,1295],{"class":984},"Sid",[978,1297,1002],{"class":995},[978,1299,648],{"class":995},[978,1301,996],{"class":995},[978,1303,1304],{"class":988},"PublishSegments",[978,1306,1002],{"class":995},[978,1308,1268],{"class":995},[978,1310,1311,1313,1316,1318,1320,1322,1325,1327],{"class":980,"line":1055},[978,1312,1292],{"class":995},[978,1314,1315],{"class":984},"Effect",[978,1317,1002],{"class":995},[978,1319,648],{"class":995},[978,1321,996],{"class":995},[978,1323,1324],{"class":988},"Allow",[978,1326,1002],{"class":995},[978,1328,1268],{"class":995},[978,1330,1331,1333,1335,1337,1339,1342,1344,1347,1349,1352,1354,1357,1359],{"class":980,"line":1061},[978,1332,1292],{"class":995},[978,1334,916],{"class":984},[978,1336,1002],{"class":995},[978,1338,648],{"class":995},[978,1340,1341],{"class":995}," [",[978,1343,1002],{"class":995},[978,1345,1346],{"class":988},"s3:PutObject",[978,1348,1002],{"class":995},[978,1350,1351],{"class":995},",",[978,1353,996],{"class":995},[978,1355,1356],{"class":988},"s3:DeleteObject",[978,1358,1002],{"class":995},[978,1360,1361],{"class":995},"],\n",[978,1363,1364,1366,1369,1371,1373,1375,1378],{"class":980,"line":1067},[978,1365,1292],{"class":995},[978,1367,1368],{"class":984},"Resource",[978,1370,1002],{"class":995},[978,1372,648],{"class":995},[978,1374,996],{"class":995},[978,1376,1377],{"class":988},"arn:aws:s3:::my-bucket\u002Flive\u002F*",[978,1379,1380],{"class":995},"\"\n",[978,1382,1383],{"class":980,"line":1073},[978,1384,1385],{"class":995},"    },\n",[978,1387,1388],{"class":980,"line":1079},[978,1389,1287],{"class":995},[978,1391,1392,1394,1396,1398,1400,1402,1405,1407],{"class":980,"line":1085},[978,1393,1292],{"class":995},[978,1395,1295],{"class":984},[978,1397,1002],{"class":995},[978,1399,648],{"class":995},[978,1401,996],{"class":995},[978,1403,1404],{"class":988},"RegionDiscovery",[978,1406,1002],{"class":995},[978,1408,1268],{"class":995},[978,1410,1411,1413,1415,1417,1419,1421,1423,1425],{"class":980,"line":1091},[978,1412,1292],{"class":995},[978,1414,1315],{"class":984},[978,1416,1002],{"class":995},[978,1418,648],{"class":995},[978,1420,996],{"class":995},[978,1422,1324],{"class":988},[978,1424,1002],{"class":995},[978,1426,1268],{"class":995},[978,1428,1429,1431,1433,1435,1437,1439,1442,1444],{"class":980,"line":1097},[978,1430,1292],{"class":995},[978,1432,916],{"class":984},[978,1434,1002],{"class":995},[978,1436,648],{"class":995},[978,1438,996],{"class":995},[978,1440,1441],{"class":988},"s3:GetBucketLocation",[978,1443,1002],{"class":995},[978,1445,1268],{"class":995},[978,1447,1448,1450,1452,1454,1456,1458,1461],{"class":980,"line":1103},[978,1449,1292],{"class":995},[978,1451,1368],{"class":984},[978,1453,1002],{"class":995},[978,1455,648],{"class":995},[978,1457,996],{"class":995},[978,1459,1460],{"class":988},"arn:aws:s3:::my-bucket",[978,1462,1380],{"class":995},[978,1464,1465],{"class":980,"line":1109},[978,1466,1118],{"class":995},[978,1468,1469],{"class":980,"line":1115},[978,1470,1471],{"class":995},"  ]\n",[978,1473,1474],{"class":980,"line":1121},[978,1475,1476],{"class":995},"}\n",[433,1478,1479,1481],{},[510,1480,1356],{}," is not optional in practice: without it the live window is never purged and the bucket grows for as long as the channel runs. A refused delete is reported in the Encoder log.",[607,1483,1485],{"id":1484},"public-access","Public access",[433,1487,1488],{},"No ACL header is sent, so objects are private and how they are served is a bucket decision:",[486,1490,1491,1497],{},[489,1492,1493,1496],{},[436,1494,1495],{},"Recommended:"," keep the bucket private and put CloudFront in front of it with Origin Access Control.",[489,1498,1499,1500,1503],{},"Alternatively, a bucket policy granting ",[510,1501,1502],{},"s3:GetObject"," on the prefix.",[433,1505,1506,1507,1510],{},"Buckets created since April 2023 have ACLs disabled, so a ",[510,1508,1509],{},"public-read"," ACL would be rejected outright — which is why none is sent.",[607,1512,1514],{"id":1513},"cors","CORS",[433,1516,1517,1518,554,1521,1524],{},"Browser playback needs CORS on the bucket, or on the CDN. A minimal policy allows ",[510,1519,1520],{},"GET",[510,1522,1523],{},"HEAD"," from the player's origin.",[607,1526,1528],{"id":1527},"lifecycle-rule","Lifecycle rule",[433,1530,1531,1532,1535],{},"The live window is maintained by the Encoder itself: as each segment leaves the window, it is deleted from the bucket. That keeps a running HLS channel bounded — measured on a reference channel at a steady 81 ",[510,1533,1534],{},".ts"," objects, flat over time.",[433,1537,1538,1539,1542,1543,1545],{},"A lifecycle rule on the prefix is still required for ",[436,1540,1541],{},"DASH and CMAF",", whose per-session segment names orphan the previous session's objects on every restart, and for ",[436,1544,449],{},", which is never purged by the Encoder. Expire the prefix after a few days; it is also cheaper than a delete per object.",[456,1547,1549],{"id":1548},"what-each-object-carries","What each object carries",[433,1551,1552],{},"Object storage keeps exactly what the upload declared and serves it back for the life of the object, so the media type and the cache lifetime are set at upload time:",[650,1554,1555,1568],{},[653,1556,1557],{},[656,1558,1559,1562,1565],{},[659,1560,1561],{},"Object",[659,1563,1564],{},"Content-Type",[659,1566,1567],{},"Cache-Control",[669,1569,1570,1587,1603,1619,1641,1657],{},[656,1571,1572,1577,1582],{},[674,1573,1574],{},[510,1575,1576],{},".m3u8",[674,1578,1579],{},[510,1580,1581],{},"application\u002Fvnd.apple.mpegurl",[674,1583,1584],{},[510,1585,1586],{},"no-cache, max-age=1",[656,1588,1589,1594,1599],{},[674,1590,1591],{},[510,1592,1593],{},".mpd",[674,1595,1596],{},[510,1597,1598],{},"application\u002Fdash+xml",[674,1600,1601],{},[510,1602,1586],{},[656,1604,1605,1609,1614],{},[674,1606,1607],{},[510,1608,1534],{},[674,1610,1611],{},[510,1612,1613],{},"video\u002FMP2T",[674,1615,1616],{},[510,1617,1618],{},"public, max-age=31536000, immutable",[656,1620,1621,1632,1637],{},[674,1622,1623,550,1626,550,1629],{},[510,1624,1625],{},".m4s",[510,1627,1628],{},".mp4",[510,1630,1631],{},".cmfv",[674,1633,1634],{},[510,1635,1636],{},"video\u002Fmp4",[674,1638,1639],{},[510,1640,1618],{},[656,1642,1643,1648,1653],{},[674,1644,1645],{},[510,1646,1647],{},".cmfa",[674,1649,1650],{},[510,1651,1652],{},"audio\u002Fmp4",[674,1654,1655],{},[510,1656,1618],{},[656,1658,1659,1664,1669],{},[674,1660,1661],{},[510,1662,1663],{},".vtt",[674,1665,1666],{},[510,1667,1668],{},"text\u002Fvtt",[674,1670,1671],{},[510,1672,1618],{},[433,1674,1675],{},"Manifests are rewritten every segment and must not be cached. Segments and init segments are immutable — their names carry the segment number or the session timestamp — so the long lifetime is what makes bucket-plus-CDN affordable.",[456,1677,1679],{"id":1678},"cost","Cost",[433,1681,1682,1683,1686],{},"Every segment of every rendition is one upload, and every segment leaving the window is one delete. With 2-second segments and five renditions that is roughly ",[436,1684,1685],{},"9,000 uploads per hour per Destination",", scaling linearly with the number of renditions. On a major cloud provider that is cents per hour, but it is recurring — size it before pointing a 24\u002F7 channel at a bucket. Longer segments cut it proportionally.",[456,1688,1690],{"id":1689},"verify","Verify",[486,1692,1693,1700,1706,1712],{},[489,1694,1695,1696,1699],{},"Objects appear under ",[510,1697,1698],{},"\u003Cprefix>\u002F\u003Cstream name>\u002F"," within a segment duration or two of the start.",[489,1701,1702,1703,1705],{},"The object count stabilises instead of growing without bound: on a reference channel, 81 ",[510,1704,1534],{}," objects for HLS and 351 per rendition for DASH, flat over time.",[489,1707,1708,1709,1711],{},"The manifest is reachable through the CDN URL stored in ",[477,1710,479],{},", and a player opened on that URL plays the live edge.",[489,1713,1714],{},"Stopping the Live stream stops the uploads; the objects already written stay until the lifecycle rule expires them.",[456,1716,1718],{"id":1717},"troubleshooting","Troubleshooting",[433,1720,1721],{},"The storage provider's own error code is surfaced in the Encoder log rather than a bare HTTP status.",[650,1723,1724,1734],{},[653,1725,1726],{},[656,1727,1728,1731],{},[659,1729,1730],{},"Symptom",[659,1732,1733],{},"Cause",[669,1735,1736,1746,1756,1766,1774,1784,1797,1808],{},[656,1737,1738,1743],{},[674,1739,1740],{},[510,1741,1742],{},"403 SignatureDoesNotMatch",[674,1744,1745],{},"Wrong Secret Access Key.",[656,1747,1748,1753],{},[674,1749,1750],{},[510,1751,1752],{},"403 AccessDenied",[674,1754,1755],{},"The key is valid; the policy does not allow writes on that prefix.",[656,1757,1758,1763],{},[674,1759,1760],{},[510,1761,1762],{},"404 NoSuchBucket",[674,1764,1765],{},"Bucket name wrong, or the URL path is missing the bucket segment.",[656,1767,1768,1771],{},[674,1769,1770],{},"A logged region correction",[674,1772,1773],{},"Informational: the signing region was corrected automatically on the first request.",[656,1775,1776,1779],{},[674,1777,1778],{},"The bucket keeps growing, with delete failures logged",[674,1780,1781,1782,522],{},"The policy is missing ",[510,1783,1356],{},[656,1785,1786,1792],{},[674,1787,1788,1789],{},"Azure: every upload returns ",[510,1790,1791],{},"404 ResourceNotFound",[674,1793,1794,1795,1206],{},"The SAS arrived truncated, or is blob-scoped instead of container-scoped (",[510,1796,512],{},[656,1798,1799,1802],{},[674,1800,1801],{},"Objects arrive but playback fails",[674,1803,1804,1805,1807],{},"Check CORS on the bucket or the CDN, and that ",[477,1806,479],{}," points at the CDN.",[656,1809,1810,1813],{},[674,1811,1812],{},"Playback serves a stale manifest",[674,1814,1815,1816,1818],{},"A cache in front of the bucket is ignoring ",[510,1817,1567],{}," on the manifest.",[433,1820,1821,1822,1824],{},"An Azure container SAS runs to roughly 160 characters and its signature is the last thing in it, so any truncation on the way in silently removes the part that authorises the request — and every upload comes back ",[510,1823,1791],{},". Paste it whole.",[456,1826,1828],{"id":1827},"faq","FAQ",[1830,1831,1832,1850,1854,1861],"accordion",{},[1833,1834,1836,1837,554,1839,1841,1842,1845,1846,1849],"accordion-item",{"label":1835},"Is this the same as External Storage?","No. ",[452,1838,184],{"href":185},[452,1840,179],{"href":180}," deliver ",[477,1843,1844],{},"recordings and clips"," — finished files, after the fact. An object storage Destination publishes the ",[477,1847,1848],{},"live"," output, manifest and segments, while the broadcast is running.",[1833,1851,1853],{"label":1852},"Can the same Live stream publish to a bucket and to a CDN at once?","Yes. Add a second Destination with a different provider and bind both to the Live stream, directly or through a Destination group. Each Destination is monitored independently on the on-air row.",[1833,1855,1857,1858,1860],{"label":1856},"Why is there no region field for S3?","Because the endpoint can state it. The Encoder probes the bucket, falls back to the hostname and then to ",[510,1859,1213],{},", and if the storage rejects the signature naming a different region it adopts that one and re-signs. A wrong guess costs one request.",[1833,1862,1864],{"label":1863},"Do I have to put a CDN in front?","Not technically — a public bucket serves playback. But object storage has no caching and no geographic distribution, and it bills every request, so a live audience reading straight from the bucket is both slow and expensive.",[1866,1867,1868],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":840,"searchDepth":1009,"depth":1009,"links":1870},[1871,1872,1873,1874,1880,1881,1882,1888,1889,1890,1891,1892],{"id":458,"depth":1009,"text":459},{"id":483,"depth":1009,"text":484},{"id":537,"depth":1009,"text":538},{"id":601,"depth":1009,"text":602,"children":1875},[1876,1877,1878,1879],{"id":609,"depth":1023,"text":610},{"id":828,"depth":1023,"text":829},{"id":872,"depth":1023,"text":873},{"id":890,"depth":1023,"text":891},{"id":900,"depth":1009,"text":901},{"id":1170,"depth":1009,"text":568},{"id":1226,"depth":1009,"text":1227,"children":1883},[1884,1885,1886,1887],{"id":1230,"depth":1023,"text":1231},{"id":1484,"depth":1023,"text":1485},{"id":1513,"depth":1023,"text":1514},{"id":1527,"depth":1023,"text":1528},{"id":1548,"depth":1009,"text":1549},{"id":1678,"depth":1009,"text":1679},{"id":1689,"depth":1009,"text":1690},{"id":1717,"depth":1009,"text":1718},{"id":1827,"depth":1009,"text":1828},"Publish the HLS \u002F TS, DASH or CMAF output of a Live stream straight into an S3-compatible bucket or an Azure Blob container, with a CDN in front.","md",null,{},{"icon":295},{"title":292,"description":1893},"JsnTm4s-XdAitygfYy0vpibwY78JsQ-1U3b6z7S42d0",[1901,1903],{"title":287,"path":288,"stem":289,"description":1902,"icon":290,"children":-1},"Broadcast with sub-second, end-to-end latency — Real time encoding on the Live stream, RTMP or Enhanced RTMP contribution, and Dolby Millicast WebRTC distribution.",{"title":297,"path":298,"stem":299,"description":1904,"icon":224,"children":-1},"Register a DRM provider and attach it to a Publishing — through the UI, through the API, or both.",1789032144961]