{"componentChunkName":"component---src-templates-blog-post-jsx","path":"/blog/how-to-setup-live-streaming-on-aws-elemental/","result":{"data":{"markdownRemark":{"excerpt":"Live streaming workflow on AWS can be achieved by integrating multiple services. For this, we will be using following services on AWS AWS…","html":"<p>Live streaming workflow on AWS can be achieved by integrating multiple services. For this, we will be using following services on AWS</p>\n<ul>\n<li>AWS Elemental MediaLive</li>\n<li>AWS Elemental MediaStore</li>\n<li>AWS Elemental MediaConvert</li>\n<li>Amazon CloudFront</li>\n<li>Amazon S3</li>\n</ul>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/1b36c860553f95bf3999fb8a7cff5748/5a190/workflow2.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 52%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAABYlAAAWJQFJUiTwAAACR0lEQVQoz0WS21PaQBTG+f+fOm1ntM74XNSqYDtqWzHckbtckhADJCEXBLJJoPrY+XWJ7fThm3P23PbbPV9G+DOipY0/15npj8y1HrbexzaGLO0JydpFeAaR/5TWLIxHhKyPvQmuOWJl62xjwW63S5EJA5tQRMSRIE62zEd9jF4ba+FiWTaOG7BZ6ITBFFPTUR9qPK9WxL6O0+8SeRaqOqLeaFKr1ckkqwWe51MuV6g/tGi1WrQbCmXljoeqQq1SZKZ1MYYNvuW/8PXyhK4c+uppTJ6mrFxLvmrM5+wp5+eXZO4XcwqaRuv6E3cXR/RLecJhFrV5zaqXxejnyA663HZK6IVD9LsPdFoFamqH6tUBpWIO8+WFpiSiaSqZvD3jWjqT+0Mq+QMG5RxbNcukfUM0PMEZ5rgddSn3KmjKMaasU5r3vG83UG/fcV0849jxeJpNcWybjOHbDGZzKnd5lPuf1CsK4+oZ1cIVj8VTaqVLbgZtlE6ZUv4I5eIjvXqBnTNGlf9t6QN+v/7CNE0WiwWZ7bNDLGK5mBgRxdjyFs2YoumGxBOqbrJzJ9jjFjc/itx8L9DpdEn8CVu51WgdkEQbVusNm83mbcubUMjDOg3sB7rypiRJSOKIZLsj9E0prRmuXJ5tW0QiRDijlJXvTBHrpSQkCPcDRTAnlLoKl1aqL8ccp9j7YWClOSE1GAUmtoxPtX6ai6Q251K3wVxDhHsy4RvDTfjmhH/tcrkkCAJc1/0Pz5PWS+P7/L/Y8/JZ9ol02L5/jz/sJsFatScqJwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"Live Streaming workflow\"\n        title=\"Live Streaming workflow\"\n        src=\"/static/1b36c860553f95bf3999fb8a7cff5748/0b533/workflow2.png\"\n        srcset=\"/static/1b36c860553f95bf3999fb8a7cff5748/fac75/workflow2.png 125w,\n/static/1b36c860553f95bf3999fb8a7cff5748/63868/workflow2.png 250w,\n/static/1b36c860553f95bf3999fb8a7cff5748/0b533/workflow2.png 500w,\n/static/1b36c860553f95bf3999fb8a7cff5748/1d69c/workflow2.png 750w,\n/static/1b36c860553f95bf3999fb8a7cff5748/5a190/workflow2.png 800w\"\n        sizes=\"(max-width: 500px) 100vw, 500px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p>Apart from the workflow above, we will also be creating an archive group in Amazon S3 from the HLS output of MediaLive. This S3 will be source to Amazon Elemental MediaConvert which will convert input video into multiple output formats, to support viewing on a broad array of devices at varying resolutions.</p>\n<p>The workflow needs 2 major configurations</p>\n<ul>\n<li><strong><a href=\"http://www.niteshsood.com/blog/obs-setup-for-live-streaming-from-your-computer/\">OBS setup</a></strong> at the source of live streaming</li>\n<li><strong>AWS workflow</strong> setup (as shown in picture above)</li>\n</ul>\n<h3>AWS workflow setup</h3>\n<h4>Task 1: Create a MediaStore Container</h4>\n<ol>\n<li>Goto <strong>AWS Console</strong> → <strong>MediaStore</strong>.</li>\n<li>In <strong>Create a storage container</strong>, enter <strong>test_workflow_container_1</strong>.</li>\n<li>Click <strong>Create Container</strong></li>\n</ol>\n<h2>POST call</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token constant\">POST</span> <span class=\"token operator\">/</span> <span class=\"token constant\">HTTP</span><span class=\"token operator\">/</span><span class=\"token number\">1.1</span>\nHost<span class=\"token operator\">:</span> mediastore<span class=\"token punctuation\">.</span>us<span class=\"token operator\">-</span>west<span class=\"token operator\">-</span><span class=\"token number\">2.</span>amazonaws<span class=\"token punctuation\">.</span>com\nx<span class=\"token operator\">-</span>amz<span class=\"token operator\">-</span>Date<span class=\"token operator\">:</span> <span class=\"token number\">20170323</span>T120000Z\nx<span class=\"token operator\">-</span>amz<span class=\"token operator\">-</span>target<span class=\"token operator\">:</span>ElementalMediaStoreService_20160711<span class=\"token punctuation\">.</span>CreateContainer\ncontent<span class=\"token operator\">-</span>type<span class=\"token operator\">:</span>application<span class=\"token operator\">/</span>x<span class=\"token operator\">-</span>amz<span class=\"token operator\">-</span>json<span class=\"token operator\">-</span><span class=\"token number\">1.1</span>\nContent<span class=\"token operator\">-</span>Length<span class=\"token operator\">:</span><span class=\"token number\">30</span>\nAuthorization<span class=\"token operator\">:</span> <span class=\"token constant\">AWS4</span><span class=\"token operator\">-</span><span class=\"token constant\">HMAC</span><span class=\"token operator\">-</span><span class=\"token constant\">SHA256</span>\nCredential<span class=\"token operator\">=</span><span class=\"token operator\">&lt;</span><span class=\"token constant\">API</span><span class=\"token operator\">-</span><span class=\"token constant\">KEY</span><span class=\"token operator\">></span><span class=\"token operator\">/</span><span class=\"token number\">20141123</span><span class=\"token operator\">/</span>us<span class=\"token operator\">-</span>west<span class=\"token operator\">-</span><span class=\"token number\">2</span><span class=\"token operator\">/</span>mediastore<span class=\"token operator\">/</span>aws4_request<span class=\"token punctuation\">,</span>\nSignedHeaders<span class=\"token operator\">=</span>host<span class=\"token punctuation\">;</span>x<span class=\"token operator\">-</span>amz<span class=\"token operator\">-</span>date<span class=\"token punctuation\">;</span>x<span class=\"token operator\">-</span>amz<span class=\"token operator\">-</span>mediastore<span class=\"token operator\">-</span>version<span class=\"token punctuation\">,</span>\nSignature<span class=\"token operator\">=</span><span class=\"token number\">9257</span>c16da6b25a715ce900a5b45b03da0447acf430195dcb540091b12966f2a2\n<span class=\"token punctuation\">{</span>\n  <span class=\"token string\">\"ContainerName\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"test_workflow_container_1\"</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h4>Task 2: Create an Amazon CloudFront Distribution</h4>\n<ol>\n<li>Goto <strong>AWS Console</strong> → <strong>CloudFront</strong>.</li>\n<li>On <strong>CloudFront Distribution</strong> page, click <strong>Create Distribution</strong></li>\n<li>In <strong>Web</strong> section, click <strong>Get started</strong></li>\n<li>Under <strong>Origin Settings</strong>, choose the <strong>MediaStore</strong> container you created above.\nNote: It may take a moment for the container to populate the drop-down list.</li>\n<li>For <strong>Origin Protocol Policy</strong>, select <strong>Match Viewer</strong>\nThis determines whether you want CloudFront to connect to your origin using only HTTP, only HTTPS or by matching protocol used by viewer.</li>\n<li>Leave all other settings to default and click <strong>Create Distribution</strong></li>\n<li>The status for this newly created distribution will be <strong>In Progress</strong>. It will take around 20 minutes to provision the distribution and the status to update to <strong>Deployed</strong></li>\n</ol>\n<h2>CloudFront Distribution XML</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token constant\">POST</span> <span class=\"token operator\">/</span><span class=\"token number\">2019</span><span class=\"token operator\">-</span><span class=\"token number\">03</span><span class=\"token operator\">-</span><span class=\"token number\">26</span><span class=\"token operator\">/</span>distribution <span class=\"token constant\">HTTP</span><span class=\"token operator\">/</span><span class=\"token number\">1.1</span>\n<span class=\"token operator\">&lt;</span><span class=\"token operator\">?</span>xml version<span class=\"token operator\">=</span><span class=\"token string\">\"1.0\"</span> encoding<span class=\"token operator\">=</span><span class=\"token string\">\"UTF-8\"</span><span class=\"token operator\">?</span><span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span>DistributionConfig xmlns<span class=\"token operator\">=</span><span class=\"token string\">\"http://cloudfront.amazonaws.com/doc/2019-03-26/\"</span><span class=\"token operator\">></span>\n   <span class=\"token operator\">&lt;</span>Origins<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Items<span class=\"token operator\">></span>\n         <span class=\"token operator\">&lt;</span>Origin<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>CustomOriginConfig<span class=\"token operator\">></span>\n               <span class=\"token operator\">&lt;</span>OriginProtocolPolicy<span class=\"token operator\">></span>Match Viewer<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>OriginProtocolPolicy<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>CustomOriginConfig<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>DomainName<span class=\"token operator\">></span><span class=\"token number\">3</span>wdmrnzrlqfgto<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">.</span>mediastore<span class=\"token punctuation\">.</span>us<span class=\"token operator\">-</span>west<span class=\"token operator\">-</span><span class=\"token number\">2.</span>amazonaws<span class=\"token punctuation\">.</span>com<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>DomainName<span class=\"token operator\">></span>\n            <span class=\"token operator\">&lt;</span>Id<span class=\"token operator\">></span><span class=\"token constant\">MS</span><span class=\"token operator\">-</span><span class=\"token number\">3</span>wdmrnzrlqfgto<span class=\"token punctuation\">.</span>data<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Id<span class=\"token operator\">></span>\n         <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Origin<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Items<span class=\"token operator\">></span>\n      <span class=\"token operator\">&lt;</span>Quantity<span class=\"token operator\">></span>integer<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Quantity<span class=\"token operator\">></span>\n   <span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>Origins<span class=\"token operator\">></span>\n   <span class=\"token operator\">&lt;</span>WebACLId<span class=\"token operator\">></span>string<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>WebACLId<span class=\"token operator\">></span>\n<span class=\"token operator\">&lt;</span><span class=\"token operator\">/</span>DistributionConfig<span class=\"token operator\">></span></code></pre></div>\n<h4>Task 3: Setup MediaLive inputs</h4>\n<p>MediaLive has 2 main components: <strong>Input</strong> which connects to the source and <strong>Channels</strong> which specify the encoding instructions and output destinations.</p>\n<ol>\n<li>Goto <strong>AWS Console</strong> → <strong>MediaLive</strong>.</li>\n<li>\n<p>Expand the navigation panel on left. Click <strong>Input</strong> → <strong>Create Input</strong></p>\n<ul>\n<li>Input Name: <strong>test-workflow-input-14-01</strong></li>\n<li>Input type: <strong>RTMP(push)</strong></li>\n<li>Network Mode: <strong>Public</strong></li>\n<li>Input Security Group: 1 CIDR Block 0.0.0.0/0 (Use existing)</li>\n<li>\n<p>Input Destinations</p>\n<ul>\n<li>Destination A: test-workflow livestreaming</li>\n<li>Destination B: test-workflow livestreaming</li>\n</ul>\n</li>\n</ul>\n</li>\n<li>Click <strong>Create</strong></li>\n<li><strong>MediaLive</strong> adds input to the list of inputs.</li>\n</ol>\n<p>Note:</p>\n<ul>\n<li>In a \"push\" delivery, the upstream system is pushing the stream from two IP addresses on the upstream system</li>\n<li>MediaLive always creates two endpoints.</li>\n<li>If the channel for this input will be set up as a standard channel, both endpoints will be used.</li>\n<li>If the channel for this input will be set up as a single-pipeline channel, only the first endpoint will be used. MediaLive won't expect to receive content at the second endpoint.</li>\n<li>A standard channel provides two redundant encoder pipelines, a single pipeline channel creates only a single encoder pipeline.</li>\n</ul>\n<p>Sample configuration</p>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/d971e9c8e16160cfbbbe4ab8ebd782dd/6af66/sample-configuration-1.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 79.2%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAAsTAAALEwEAmpwYAAABW0lEQVQ4y51T246EIAzl//9y9mHcBHVGEJFrt63AjO5uNNPkBMRy6OVUTLMGNc/gQoCQIvgYeY05Qcr5OiAzh7DrCotdwXkPzjleV1wjErNlOLe8OQUiXKxlEk+EZfX4I6VUfPMlNMItQstRrSXCiGREWB2vWsCshFkW0FhDIm6wBHwE91yGK8BAKDDR9z1IKfmyrym/leAqoa+EdIlCpbq1RnxoIWDKSmuYlOK0KcoX3OH7BBjlguUTElPuum8YhgEPLBhjYC7k/pOUlUYCJPE+NJJ3Kfwtu/3/nWw0pkyEa3mp1vFMc0efRihlj+mOLJWqvTMyzgQvHy1WHdoqGXTaoUrniDIE4c2X9vSQuHcd3G5fMI4jN4O6XmHMwgL/hTYArzMio4aK53PidvOrZQwHJB8fD5gm9a/Yj2e02q3LGh38rtB9P2C0hme6laIMAPlT3UkV/pAyRf0D+lfoPqyN1nsAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"sample configuration\"\n        title=\"sample configuration\"\n        src=\"/static/d971e9c8e16160cfbbbe4ab8ebd782dd/0b533/sample-configuration-1.png\"\n        srcset=\"/static/d971e9c8e16160cfbbbe4ab8ebd782dd/fac75/sample-configuration-1.png 125w,\n/static/d971e9c8e16160cfbbbe4ab8ebd782dd/63868/sample-configuration-1.png 250w,\n/static/d971e9c8e16160cfbbbe4ab8ebd782dd/0b533/sample-configuration-1.png 500w,\n/static/d971e9c8e16160cfbbbe4ab8ebd782dd/6af66/sample-configuration-1.png 640w\"\n        sizes=\"(max-width: 500px) 100vw, 500px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<h4>Task 4: Configure a channel in MediaLive</h4>\n<ol>\n<li>\n<p>Click <strong>Create Channel</strong></p>\n<ul>\n<li><strong>Channel Name</strong>: test-workflow-stream-channel-1</li>\n<li><strong>IAM role</strong>: MediaLiveAccessRole (Use existing)</li>\n<li><strong>Channel Template</strong>: HTTP Live Streaming (HLS)</li>\n</ul>\n</li>\n<li>\n<p>Attach an input to this channel</p>\n<ul>\n<li>On left panel, Input attachments, Click <strong>Add</strong></li>\n<li>Under <strong>Input Attachment Name</strong>, Select the input you created earlier <strong>test-workflow-input-14-01</strong></li>\n<li>General input settings can be left as default</li>\n</ul>\n</li>\n<li>\n<p>Move on to 1st output group <strong>TN2224</strong>.</p>\n<ul>\n<li>Rename the output group to <strong>HLS Stream</strong></li>\n<li>Change the CDN settings to <strong>Hls media store</strong></li>\n</ul>\n</li>\n<li>Keep this tab open as it is.</li>\n</ol>\n<p>You have begun the process of creating a channel and attaching inputs in MediaLive. Next you will provide this channel its output destinations, which will be in MediaStore we created in Task1 (test_workflow_container_1). Move to MediaStore in console to get these end points and update in MediaLive output group <strong>HLS Stream</strong></p>\n<h4>Task 5: Copy the MediaStore endpoint</h4>\n<ol>\n<li>Go to <strong>AWS Console</strong> → <strong>MediaStore</strong> → <strong>test_workflow_container_1</strong></li>\n<li>In the <strong>Info</strong> section, copy the <strong>Data Endpoint URL</strong>.</li>\n</ol>\n<h4>Task 6: Configure MediaLive to output to the MediaStore endpoint</h4>\n<ol>\n<li>Move back to the left open tab in Task 4</li>\n<li>Under <strong>HLS Stream</strong> output group, there are 2 destinations <strong>HLS group destination A</strong> and <strong>HLS group destination B</strong>.</li>\n<li>\n<p>The URL copied will be something like this\n<a href=\"https://3wdmrnzrlqfgto.data.mediastore.us-west-2.amazonaws.com\">https://3wdmrnzrlqfgto.data.mediastore.us-west-2.amazonaws.com</a>.\nUpdate this URL as\nmediastoressl://3wdmrnzrlqfgto.data.mediastore.us-west-2.amazonaws.com/hls-a/stream-a</p>\n<p>and copy it in <strong>HLS group destination A</strong>.\n<strong>hls-a</strong> is unique directory destination.\n<strong>stream-a</strong> is manifest basename</p>\n</li>\n<li>Similarly, update <strong>HLS group destination</strong> B as mediastoressl://3wdmrnzrlqfgto.data.mediastore.us-west-2.amazonaws.com/hls-b/stream-b</li>\n<li>The URLs in <strong>HLS group destination A</strong> and <strong>HLS group destination B</strong> must be unique else there will a validation error</li>\n</ol>\n<h4>Task 7: Check encoding settings and start MediaLive channel</h4>\n<ol>\n<li><strong>Output 10</strong> is webvtt captions. This is not required. Remove this output.</li>\n<li>\n<p>Under <strong>Actions</strong> of <strong>Output 1</strong>, click <strong>Settings</strong></p>\n<ul>\n<li>Under <strong>Video</strong>, you will see preconfigured values of width as <strong>960</strong> and height as <strong>540</strong>.</li>\n<li>For <strong>Codec</strong> settings, the template preconfigured as <strong>H264</strong></li>\n</ul>\n</li>\n<li>\n<p>Expand <strong>Rate Control</strong></p>\n<ul>\n<li>Notice that the template selected is <strong>CBR</strong> Rate Control Mode and Bitrate of <strong>2200000</strong>.\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/49069acc76a45e71750de93581ac60a7/6af66/sample-configuration-2.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 79.2%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAAA9hAAAPYQGoP6dpAAABLklEQVQ4y42Ui66EIAxE9/8/9SqggLxxbutqgruuSNKYNHCcdgqvv9lDuQwdCuzisCwLjrWuazdSylBqgpASznm8Rh2gfUaswEKJYRgghIDWBj4k1Fq7kXMmcEIpBS9OkJZNUQgBI8FmrbcNmTaUTrDKdu3A93LOYZo1Sl27II68A9s4Ab2nfk4zbeRSyiPoofD4noFUslKKjHEI1OweNPeA3ENJbi1Ueoypqy6E+Bt4JHhspFQEjI9Gpz17CTTGbk4bYxBTeTSLXYWaYN4H6mn8XTKd4xZ9nr8EjkIi1/ffb03JbFxHITd6GMet5E0B5e9uyW3JHGyGtXaDsYo7Y9o7f2kKpxkmaRZZaZt/as4XkIeaXw+7vzqfd/Vuna7e8RdDCgWbQg1/+oS1Cv8BQ3LvCMDgBMIAAAAASUVORK5CYII='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"sample configuration\"\n        title=\"sample configuration\"\n        src=\"/static/49069acc76a45e71750de93581ac60a7/0b533/sample-configuration-2.png\"\n        srcset=\"/static/49069acc76a45e71750de93581ac60a7/fac75/sample-configuration-2.png 125w,\n/static/49069acc76a45e71750de93581ac60a7/63868/sample-configuration-2.png 250w,\n/static/49069acc76a45e71750de93581ac60a7/0b533/sample-configuration-2.png 500w,\n/static/49069acc76a45e71750de93581ac60a7/6af66/sample-configuration-2.png 640w\"\n        sizes=\"(max-width: 500px) 100vw, 500px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></li>\n</ul>\n</li>\n<li>Start the channel after next task.</li>\n</ol>\n<h4>Task 8: Create Archive group for VOD</h4>\n<ol>\n<li>Go to <strong>AWS Console</strong> → <strong>S3</strong> → <strong>Create Bucket</strong>.</li>\n<li>Enter the bucket name as <strong>test-workflow-livestream-bucket-1</strong>.</li>\n<li>Create 2 folders in this bucket as <strong>delivery</strong> and <strong>backup</strong>.</li>\n<li>Coming back to the same MediaLive channel you are working on, create a new output group by clicking <strong>Add</strong> in front of <strong>Output group</strong> in the left pane.</li>\n<li>Choose <strong>Archive</strong> as the output group and click <strong>Confirm</strong>.</li>\n<li>Under <strong>Archive group destination A</strong>, enter the value as s3ssl://test-workflow-livestream-bucket-1/delivery/program</li>\n<li>Similarly, under <strong>Archive group destination B</strong>, enter the value as s3ssl://test-workflow-livestream-bucket-1/backup/program</li>\n<li>\n<p>Under <strong>Archive Settings</strong>, name the channel as <strong>Save to S3</strong></p>\n<ul>\n<li>Expand the Additional settings.</li>\n<li><strong>Rollover Interval</strong> is the value which determines after how much seconds, the live streamed video will be dumped in this S3 bucket. Idle value is 300 seconds.</li>\n</ul>\n</li>\n</ol>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/9055afa8dc1989c47fed6a1d63727abd/6af66/sample-configuration-3.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 77.6%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAYAAAAWGF8bAAAACXBIWXMAABYlAAAWJQFJUiTwAAABgElEQVQ4y5WUDXOCMAyG+///4LwxAXfnZIrINy1YsrwRuB7Wqdw914ppmrxJUGEU0c/hQFVdCyVTlOVbZJcL+0hkVUmSUJqmdM4ySs9nuuQ5dV1Hbdu+RdM0EpCK4pjieEdhGFIQBLTbfYvBMAzU9/3LwL7hc0prQ3YchRGrtYvB9Xp9COxccBaZKeQtcMrzPi8KWSEDosWBtUM4WD/aGFKd1tRCMxfRpRNdBGjko3Hg36JhEHzRdhvSJ+v3sdlQxFWvqopKrh4cG75V86XPgF3Nlyt4Re7dFJ27n7Xy6Yl3LniHMwp9hLRqdjyngsjqupFIUSA7FcvF9yBKBQf11EMoBsAleV5IT+J/iL0Ghw1fJvAeF0vbHHhK9vs9HY9HMUSRJO1Jm/ZBk68L1M5FOZ1SjiaXIth/+u4ZkEH6sCyrRZPhxcM3u3sdkZHC/GKWodvc8daOy/R4mexcFoe/rB30y/KS+gGG9q6ij/BOipnmtmd81fSib+v8YTCy3j4Of5Sy3X33bvTqAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"sample configuration\"\n        title=\"sample configuration\"\n        src=\"/static/9055afa8dc1989c47fed6a1d63727abd/0b533/sample-configuration-3.png\"\n        srcset=\"/static/9055afa8dc1989c47fed6a1d63727abd/fac75/sample-configuration-3.png 125w,\n/static/9055afa8dc1989c47fed6a1d63727abd/63868/sample-configuration-3.png 250w,\n/static/9055afa8dc1989c47fed6a1d63727abd/0b533/sample-configuration-3.png 500w,\n/static/9055afa8dc1989c47fed6a1d63727abd/6af66/sample-configuration-3.png 640w\"\n        sizes=\"(max-width: 500px) 100vw, 500px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n  </a>\n    </span></p>\n<p>9.Click <strong>Create Channel</strong>. Once the channel is created, Click <strong>Start</strong>. In a minute, the channel will be started.</p>\n<h4>Task 9: Checking contents on MediaStore container</h4>\n<p>At this point, the OBS is streaming the video. Once the MediaLive channel is up and running, it will begin creating object-based directories on the MediaStore container, in this case as <strong>hls-a</strong> and <strong>hls-b</strong>. Within those directories, there will be HLS master and variant manifests (.m3u8) and well as transport segments (.ts)</p>\n<ol>\n<li>Go to <strong>AWS Console</strong> → <strong>MediaStore</strong> → <strong>test_workflow_container_1</strong></li>\n<li>Under <strong>test_workflow_container_1: Items</strong>, there will still be no items. Click <strong>Refresh</strong></li>\n<li>Now you will see <strong>hls-a</strong> directory. Click on <strong>hls-a</strong> to reveal its contents.</li>\n<li>Locate the parent manifest: <strong>stream-a.m3u8</strong></li>\n<li>Click this manifest <strong>stream-a.m3u8</strong></li>\n<li>Under object name, copy the object name URL which looks something like <a href=\"https://bftwstdfnjd3og.data.mediastore.us-west-2.amazonaws.com/hls-a/stream-a.m3u8\">https://bftwstdfnjd3og.data.mediastore.us-west-2.amazonaws.com/hls-a/stream-a.m3u8</a></li>\n<li>You can test this stream by running the command curl -vvv <a href=\"https://bftwstdfnjd3og.data.mediastore.us-west-2.amazonaws.com/hls-a/stream-a.m3u8\">https://bftwstdfnjd3og.data.mediastore.us-west-2.amazonaws.com/hls-a/stream-a.m3u8</a></li>\n<li>This results in <strong>403 Forbidden error</strong></li>\n</ol>\n<h4>Task 10: Edit MediaStore Container and CORS policy</h4>\n<ol>\n<li>Go to <strong>AWS Console</strong> → <strong>MediaStore</strong> → <strong>test_workflow_container_1</strong></li>\n<li>Move to <strong>Container Policy</strong> section and click <strong>Edit Policy</strong></li>\n<li>Enter the policy as</li>\n</ol>\n<h2>MediaStore container Policy</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token punctuation\">{</span>\n  <span class=\"token string\">\"Version\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"2012-10-17\"</span><span class=\"token punctuation\">,</span>\n  <span class=\"token string\">\"Statement\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"Sid\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"MediaStoreFullAccess\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"Effect\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Allow\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"Principal\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string\">\"AWS\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"arn:aws:iam::361242680605:root\"</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"Action\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"mediastore:*\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"Resource\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"arn:aws:mediastore:us-west-2:361242680605:container/test_workflow_container_1/*\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"Condition\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string\">\"Bool\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"aws:SecureTransport\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"true\"</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"Sid\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"MediaStorePostToSpecificPath\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"Effect\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Allow\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"Principal\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string\">\"Service\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"medialive.amazonaws.com\"</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"Action\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"mediastore:PutObject\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"Resource\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"arn:aws:mediastore:us-west-2:361242680605:container/test_workflow_container_1/*\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"Condition\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string\">\"Bool\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"aws:SecureTransport\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"true\"</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"Sid\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"PublicReadOverHttps\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"Effect\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"Allow\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"Principal\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"*\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"Action\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span> <span class=\"token string\">\"mediastore:GetObject\"</span><span class=\"token punctuation\">,</span> <span class=\"token string\">\"mediastore:DescribeObject\"</span> <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"Resource\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"arn:aws:mediastore:us-west-2:361242680605:container/test_workflow_container_1/*\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"Condition\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token string\">\"Bool\"</span> <span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"aws:SecureTransport\"</span> <span class=\"token operator\">:</span> <span class=\"token string\">\"true\"</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token punctuation\">]</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ol start=\"4\">\n<li>Also Edit the <strong>CORS</strong> policy as</li>\n</ol>\n<h2>MediaStore CORS Policy</h2>\n<div class=\"gatsby-highlight\" data-language=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token punctuation\">[</span>\n  <span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"AllowedHeaders\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n      <span class=\"token string\">\"*\"</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"AllowedMethods\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n      <span class=\"token string\">\"GET\"</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"AllowedOrigins\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n      <span class=\"token string\">\"*\"</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"ExposeHeaders\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n      <span class=\"token string\">\"*\"</span>\n    <span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"MaxAgeSeconds\"</span><span class=\"token operator\">:</span> <span class=\"token number\">3000</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">]</span></code></pre></div>\n<h4>Task 11: Edit CloudFront Cache behavior to set up CORS</h4>\n<ol>\n<li>Go to <strong>AWS Console</strong> → <strong>CloudFront</strong>. Select your distribution and click <strong>Distribution Settings</strong></li>\n<li>Click on <strong>Behaviors</strong> tab. Select your origin and click <strong>Edit</strong>.</li>\n<li>For <strong>Cache Based on Selected Request Headers</strong>, Select <strong>Whitelist</strong></li>\n<li>For <strong>Whitelist Headers</strong>, Select <strong>Origin</strong> and click <strong>Add>></strong></li>\n<li>Leave rest as default. Scroll down to the last and click <strong>Yes edit</strong></li>\n</ol>\n<p>This will take some time to propagate.</p>\n<h4>Task 12: Check playout of stream from MediaStore and CloudFront</h4>\n<p>MediaStore stream:\n1. Go to <strong>AWS Console</strong> → <strong>MediaStore</strong> → <strong>test_workflow_container_1</strong>\n2. Click <strong>hls-a</strong> and look for manifest <strong>stream-a.m3u8</strong>. Click the manifest and look for object name URL something like <a href=\"https://bftwstdfnjd3og.data.mediastore.us-west-2.amazonaws.com/hls-a/stream-a.m3u8\">https://bftwstdfnjd3og.data.mediastore.us-west-2.amazonaws.com/hls-a/stream-a.m3u8</a>\n3. Open this URL in new tab <a href=\"https://www.jwplayer.com/developers/stream-tester/\">https://www.jwplayer.com/developers/stream-tester/</a> and paste above streaming URL in File URL field and test the stream</p>\n<p>CloudFront stream:\n1. Go to <strong>AWS Console</strong> → <strong>CloudFront</strong>. Click on your created distribution and copy the <strong>Domain Name</strong>\n<span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; \"\n    >\n      <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 16%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAo0lEQVQI13WKwY6CMAAF+f+v8egH7M2ziRtEKe1WCq3Swmq2wI61Jnvb5E0yL5mikj2fdYs2FtN1fN8frOsv87IS54Uledq/pOXmJ0ZinCm2u5rNR8nhpHBdi7U9zlluV8c0jQTvGceQmRLeD4wh/OGHASUl1bHEmJbiFTSN4NL1CG1R5kZ5FuwPJedGIZSmlhrxdckutUmtfXtrMlXd5O+GwBOKNOJLYk2CLgAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n  ></span>\n  <img\n        class=\"gatsby-resp-image-image\"\n        alt=\"sample configuration\"\n        title=\"sample configuration\"\n        src=\"/static/783f8cc7951ebd9c490324c591c2607c/0b533/sample-configuration-4.png\"\n        srcset=\"/static/783f8cc7951ebd9c490324c591c2607c/fac75/sample-configuration-4.png 125w,\n/static/783f8cc7951ebd9c490324c591c2607c/63868/sample-configuration-4.png 250w,\n/static/783f8cc7951ebd9c490324c591c2607c/0b533/sample-configuration-4.png 500w,\n/static/783f8cc7951ebd9c490324c591c2607c/6af66/sample-configuration-4.png 640w\"\n        sizes=\"(max-width: 500px) 100vw, 500px\"\n        style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n        loading=\"lazy\"\n      />\n    </span>\n2. Edit the <strong>stream-a.m3u8</strong> URL from <a href=\"https://bftwstdfnjd3og.data.mediastore.us-west-2.amazonaws.com/hls-a/stream-a.m3u8\">https://bftwstdfnjd3og.data.mediastore.us-west-2.amazonaws.com/hls-a/stream-a.m3u8</a> to <a href=\"https://d1b2i1qy1t8sra.cloudfront.net/hls-a/stream-a.m3u8\">https://d1b2i1qy1t8sra.cloudfront.net/hls-a/stream-a.m3u8</a>\n3. Open this URL in new tab <a href=\"https://www.jwplayer.com/developers/stream-tester/\">https://www.jwplayer.com/developers/stream-tester/</a> and paste above CloudFront URL in File URL and test the stream</p>\n<p>Voila! You are done!</p>","fields":{"slug":"/how-to-setup-live-streaming-on-aws-elemental/"},"frontmatter":{"title":"Live Streaming on AWS Elemental","summary":"Architecture setup for Live Streaming on AWS Elemental Service","date":"28-07-2020T15:00:00+05:30","dateModified":"28-07-2020T15:00:00+05:30","thumbnail":"/blogImages/AWS-Elemental/cover.jpeg"}}},"pageContext":{"slug":"/how-to-setup-live-streaming-on-aws-elemental/","modifiedDate":"28-07-2020T15:00:00+05:30"}},"staticQueryHashes":[]}