<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shih-Yu Hwang</title>
    <description>The latest articles on DEV Community by Shih-Yu Hwang (@shihyu).</description>
    <link>https://dev.to/shihyu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F817071%2F97cf4e35-19c0-4f5e-8cbe-e7f1836796aa.jpeg</url>
      <title>DEV Community: Shih-Yu Hwang</title>
      <link>https://dev.to/shihyu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shihyu"/>
    <language>en</language>
    <item>
      <title>Export to IPFS with Livepeer Video Services</title>
      <dc:creator>Shih-Yu Hwang</dc:creator>
      <pubDate>Mon, 02 May 2022 22:04:32 +0000</pubDate>
      <link>https://dev.to/shihyu/export-to-ipfs-with-livepeer-video-services-327d</link>
      <guid>https://dev.to/shihyu/export-to-ipfs-with-livepeer-video-services-327d</guid>
      <description>&lt;p&gt;Where to store NFTs (non-fungible tokens) is just as important as what type of NFTs to create. In the process of making them, storage is an essential part of it as it allows the NFTs to be preserved.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ipfs.io/"&gt;IPFS&lt;/a&gt;, short for Interplanetary File System, has been around for a while, which means its network has had time to mature and be reliable. Their protocol is used by the majority of projects that utilize decentralized storage, including NFTs. By exporting assets to IPFS, not only will they generate a unique fingerprint called content identifier (CID) for the NFTs, but also this data will be preserved due to the support of their community for maintaining and expanding their decentralized ecosystem.&lt;/p&gt;

&lt;p&gt;Livepeer Video Services makes the process of exporting to IPFS easy by using the &lt;a href="https://livepeer.com/docs/api-reference/vod"&gt;Video on Demand (VoD) API&lt;/a&gt;. With a simple step, assets that get uploaded to Livepeer Video Services will have the option to be exported to IPFS. Once the asset has been exported they are ready to be minted. This reduces the process of transcoding the assets and then taking that transcoded asset from Livepeer VIdeo Services and then using IPFS.&lt;/p&gt;

&lt;p&gt;In this tutorial, we will look at the ease of using the VoD API to upload assets to LVS and then export them to IPFS.&lt;/p&gt;

&lt;p&gt;Access to a free Postman and Livepeer Video Services account is required. Visit &lt;a href="https://livepeer.com/blog/how-to-make-api-calls-with-postman-and-livepeer-video-services"&gt;How to make API calls with Postman and LVS &lt;/a&gt;tutorial for instructions on getting set up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1
&lt;/h2&gt;

&lt;p&gt;There are two ways to provide Livepeer with assets for VoD, either importing or uploading the asset. The following steps address how to implement both.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1A: Import an asset
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
To import an asset from an external URL, select the &lt;strong&gt;POST&lt;/strong&gt; option and paste in Livepeer's base URL for importing an asset &lt;code&gt;https://livepeer.com/api/asset/import&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3l6yhQAm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0i051vehubh1m9odnogv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3l6yhQAm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0i051vehubh1m9odnogv.png" alt="Postman1" width="880" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Then underneath the URL, click on the &lt;strong&gt;Authorization&lt;/strong&gt; tab, and select &lt;strong&gt;Bearer Token&lt;/strong&gt; as the type&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copy and paste your API key from Livepeer Video Services&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tge86p75--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f3dkxkz1qcszb1su31ll.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tge86p75--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f3dkxkz1qcszb1su31ll.png" alt="Postman2" width="880" height="650"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Select the &lt;strong&gt;Body&lt;/strong&gt; tab and underneath it select the **raw **radio button&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the &lt;strong&gt;Text&lt;/strong&gt; drop-down menu and select the &lt;strong&gt;JSON&lt;/strong&gt; option&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the text box field below, paste the following code which is from the &lt;a href="https://livepeer.com/docs/api-reference/vod/import"&gt;API reference&lt;/a&gt;. You can change the &lt;strong&gt;name&lt;/strong&gt; to whatever you want as this is for the name of your stream and the &lt;strong&gt;URL&lt;/strong&gt; is the URL file of your asset&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
"url": "https://www.pexels.com/video/5613843/download/",
"name": "JellyFish"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kRmIljpy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dn9c4ua1ohf4llcqb9oh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kRmIljpy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dn9c4ua1ohf4llcqb9oh.png" alt="Postman3" width="880" height="632"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the code icon &lt;strong&gt;&amp;lt; &amp;gt;&lt;/strong&gt; on the right side menu to confirm the format is the same as the cURL example in the API reference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Su3zN9Hy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8u4aggodu5elegzz50xm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Su3zN9Hy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8u4aggodu5elegzz50xm.png" alt="Postman4" width="880" height="632"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now click the &lt;strong&gt;Send&lt;/strong&gt; button and you should receive a confirmation that it went through with a 201 status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5EejBdcE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tpr5lkjcyo1aadfdghbz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5EejBdcE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tpr5lkjcyo1aadfdghbz.png" alt="Postman5" width="880" height="632"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1B: Upload an asset
&lt;/h3&gt;

&lt;p&gt;This is a two-step process that allows the user to provide the asset by directly uploading to Livepeer Video Services.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1B-1 - Create URL for direct upload
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Select the &lt;strong&gt;POST&lt;/strong&gt; option and paste in Livepeer Video Services' URL for importing an asset 
&lt;code&gt;https://livepeer.com/api/asset/request-upload&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then underneath the URL, click on the &lt;strong&gt;Authorization&lt;/strong&gt; tab, and select &lt;strong&gt;Bearer Token&lt;/strong&gt; as the type&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copy and paste your API key from Livepeer Video Services&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bBh5sbOb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hdqhenfigjqjrhfjp0su.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bBh5sbOb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hdqhenfigjqjrhfjp0su.png" alt="Postman6" width="880" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the text box field below, paste the following code which is from the API Reference. You can change the &lt;strong&gt;name&lt;/strong&gt; to whatever you want as this is for the name of your stream.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;{ "name": "JellyFish" }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mwPYVF1C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3fnhhz6xaoqvl5xnws5e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mwPYVF1C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3fnhhz6xaoqvl5xnws5e.png" alt="Postman7" width="880" height="632"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the code icon &lt;code&gt;&amp;lt; &amp;gt;&lt;/code&gt; on the right side menu to confirm the format is the same as the cURL example in the API reference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6grxe5Q3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/za0x760pw4e2chj59w7l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6grxe5Q3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/za0x760pw4e2chj59w7l.png" alt="Postman8" width="880" height="632"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the blue send button and you should get back a 200 status with the response including the parameters of the stream&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5uAjKneY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/64duuy8bmpa8i2xoseao.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5uAjKneY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/64duuy8bmpa8i2xoseao.png" alt="Postman9" width="880" height="632"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that the URL for direct upload is created, time to upload the content.&lt;br&gt;
&lt;em&gt;&lt;em&gt;Copy the **URL&lt;/em&gt;* and the &lt;strong&gt;ID&lt;/strong&gt; of the asset/task from the response for the next part.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1B-2 - Upload the contents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Replace POST with &lt;strong&gt;PUT&lt;/strong&gt; and insert the URL from the response in the previous step. It should look similar to the following:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;https://origin.livepeer.com/api/asset/upload
/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJwcmVzaWduZWRVcmwiOiJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vbHAtdXMtd
m9kLWNvbS9kaXJlY3RVcGxvYWQvZWIyMG01cDdqd3d1bDZ3OS9zb3VyY2U_WC1BbXotQWxnb3J
pdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ29udGVudC1TaGEyNTY9VU5TSUdORUQtUEFZT
E9BRCZYLUFtei1DcmVkZW50aWFsPUdPT0cxRVlVTldOVjZSWUlLNTQySFdBM1JMN1JCN0pVT0V
RM1lMMjNRWUI2Q0hQRzVITzJRQzMzTUpWVVklMkYyMDIyMDQyMSUyRnVzJTJGczMlMkZhd3M0X
3JlcXVlc3QmWC1BbXotRGF0ZT0yMDIyMDQyMVQxNDM1NTNaJlgtQW16LUV4cGlyZXM9OTAwJlg
tQW16LVNpZ25hdHVyZT1iZGZhOGNlYWVkNDg2YWIyMzYyZmJkMzA0MGRlNjA4MjM0ZmQ0YWU0O
DIyYTE4NzBmMzhiZTRiMDFiZmZhZWE1JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZ4LWlkPVB
1dE9iamVjdCIsImF1ZCI6Imh0dHBzOi8vbGl2ZXBlZXIuY29tIiwiaWF0IjoxNjUwNTUxNzUzf
Q.ujURa40V95ETrUrjYi4Ho5vD3g5–5l_5o0kJfJNUMiA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Select the Headers tab and for the &lt;strong&gt;Key&lt;/strong&gt; select &lt;strong&gt;Content-Type&lt;/strong&gt; and the Value select &lt;strong&gt;video/mp4&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G_Kjspvs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8m20d9x5ufgeqrggwlwv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G_Kjspvs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8m20d9x5ufgeqrggwlwv.png" alt="Postman10" width="880" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Under the body tab, select the &lt;strong&gt;binary&lt;/strong&gt; radio button&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then select the video file you want to upload&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;*Notice that we only support mp4 files encoded with H264 video and AAC audio for now. If you are unsure about these, try sending the file anyway and check any returned errors!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bRTj-rTr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/20cp5c0jgw4i8b68rxcl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bRTj-rTr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/20cp5c0jgw4i8b68rxcl.png" alt="Postman11" width="880" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the code icon &amp;lt; &amp;gt; on the right side menu to confirm the format is the same as the cURL example in the API reference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a8K3YxnW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gmaikajhvob5tdw7efk5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a8K3YxnW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gmaikajhvob5tdw7efk5.png" alt="Postman12" width="880" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the blue send button and you should get back a 200 status with the response including the parameters of the stream&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xkxITsbu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kn6eb65utyo1sk1df6h6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xkxITsbu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kn6eb65utyo1sk1df6h6.png" alt="Postman13" width="880" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Retrieve an asset
&lt;/h3&gt;

&lt;p&gt;We need to check to make sure that the asset is ready before exporting it since it can take some time to upload.&lt;/p&gt;

&lt;p&gt;For the asset ID here, use the &lt;strong&gt;asset.id&lt;/strong&gt; field in the response to the &lt;strong&gt;Import&lt;/strong&gt; or &lt;strong&gt;Request Upload&lt;/strong&gt; requests above.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Retrieve an individual asset, select &lt;strong&gt;GET&lt;/strong&gt; option, and then paste in Livepeer's URL for retrieving an asset &lt;code&gt;https://livepeer.com/api/asset/:assetId&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the params tab, paste in the asset ID in the &lt;strong&gt;Value&lt;/strong&gt; column associated with the &lt;strong&gt;Key: assetId&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yHIHV34d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2be7kx6cnvxj9xmx4cpc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yHIHV34d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2be7kx6cnvxj9xmx4cpc.png" alt="Postman16" width="880" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Make sure the &lt;strong&gt;Body&lt;/strong&gt; tag has the &lt;strong&gt;none&lt;/strong&gt; radio button selected&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the blue send button and you should get back a 200 status with the response including a list of the assets&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Look for the &lt;strong&gt;status&lt;/strong&gt; in the response body, it should return &lt;code&gt;status:"ready"&lt;/code&gt;. If it is &lt;code&gt;status:"waiting"&lt;/code&gt;, then wait a little longer and repeat this step until the status is &lt;strong&gt;ready&lt;/strong&gt; before moving to the exporting step.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iyhtX-eC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y6aafi947vu31yv53x8j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iyhtX-eC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y6aafi947vu31yv53x8j.png" alt="Postman17" width="880" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Export to IPFS
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Select the **POST **option and paste in Livepeer's URL for exporting an asset to IPFS &lt;code&gt;https://livepeer.com/api/asset/$ASSET_ID/export&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;em&gt;The *&lt;/em&gt;$ASSET_ID** is located in the response body from step 1A or 1B depending on the method you chose.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CMty9EJr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xha75czmk79z6bju6r45.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CMty9EJr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xha75czmk79z6bju6r45.png" alt="Postman18" width="880" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Make sure the &lt;strong&gt;Body&lt;/strong&gt; tag has the &lt;strong&gt;raw&lt;/strong&gt; radio button selected and the &lt;strong&gt;JSON&lt;/strong&gt; format is selected from the drop-down menu on the right&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the text box field below, paste the following code from the &lt;a href="https://livepeer.com/docs/api-reference/vod/export"&gt;Livepeer's VoD API Reference&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;{ "ipfs": { } }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QyNlvILS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wu303z8lwqs79yqbo3wm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QyNlvILS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wu303z8lwqs79yqbo3wm.png" alt="Postman19" width="880" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the code icon &lt;strong&gt;&amp;lt; &amp;gt;&lt;/strong&gt; on the right side menu to confirm the format is the same as the cURL example in the API reference&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ko8kM2jU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4i32xb8wc9kju5e4e2ay.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ko8kM2jU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4i32xb8wc9kju5e4e2ay.png" alt="Postman20" width="880" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the blue send button and you should get back a 201 status with the response showing the task has been created with the type &lt;strong&gt;export&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uFJBZunp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0yl6wxnu6umhb9cumggt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uFJBZunp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0yl6wxnu6umhb9cumggt.png" alt="Postman21" width="880" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;*IPFS is a complex protocol and so the export task can take a while. Expect this to take a bit longer than the import task&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;em&gt;Copy the **ID&lt;/em&gt;* of the task from the response for the next part.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4 Retrieve a task
&lt;/h3&gt;

&lt;p&gt;For the task ID here, use the &lt;strong&gt;task.id&lt;/strong&gt; field in the response of the &lt;strong&gt;Export&lt;/strong&gt; request above.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Select the &lt;strong&gt;GET&lt;/strong&gt; option and paste in Livepeer's URL for retrieving a specific task with the task id &lt;code&gt;https://livepeer.com/api/task/:taskId&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the params tab, paste in the task ID in the &lt;strong&gt;Value&lt;/strong&gt; column associated with the &lt;strong&gt;Key: taskId&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Wk51xIzN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a0812s3gf6navcwtw9zo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Wk51xIzN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a0812s3gf6navcwtw9zo.png" alt="Postman22" width="880" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Make sure the &lt;strong&gt;Body&lt;/strong&gt; tag has the &lt;strong&gt;none&lt;/strong&gt; radio button selected&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the blue send button and you should get back a 200 status with the response including the specific task requested&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZgECdu4_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uuuvc1h62c63ajrxjvnf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZgECdu4_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uuuvc1h62c63ajrxjvnf.png" alt="Postman23" width="880" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting the CID
&lt;/h3&gt;

&lt;p&gt;IPFS locates the content based on what is inside of it rather than by the location, CID is what allows it to do this.&lt;/p&gt;

&lt;p&gt;To Get the CID and metadata URL for the asset that was just exported, you can get it by retrieving the task above until it is finished (check the &lt;strong&gt;status&lt;/strong&gt; field in the response). That finished task will have an output with all the information about that asset, and the CID information is located under the &lt;em&gt;output.export.ipfs&lt;/em&gt; path.&lt;/p&gt;

&lt;p&gt;See the image below:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pVbUYpPP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/twkk0419gcn5m351raed.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pVbUYpPP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/twkk0419gcn5m351raed.png" alt="Postman24" width="880" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see here, information such as the video file's CID, location of the URL on IPFS, and other metadata information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;With the ability to upload assets and export them to IPFS easily with &lt;a href="https://livepeer.com/docs/api-reference/vod"&gt;Livepeer Video Services' VoD API&lt;/a&gt;, those assets can now be stored in decentralized storage and be accessible.&lt;br&gt;
Start creating your own VoD Dapps and store them in decentralized storage.&lt;/p&gt;

&lt;p&gt;Take it to the next level by minting video NFTs using Livepeer Video Services video NFT SDK.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://livepeer.com/docs/guides/video-nfts/mint-a-video-nft"&gt;Mint Video NFTs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>web3</category>
      <category>blockchain</category>
      <category>livepeer</category>
    </item>
    <item>
      <title>How to mint a video NFT using Livepeer Video Services + Polygon</title>
      <dc:creator>Shih-Yu Hwang</dc:creator>
      <pubDate>Mon, 11 Apr 2022 22:17:58 +0000</pubDate>
      <link>https://dev.to/shihyu/how-to-mint-a-video-nft-using-livepeer-video-services-polygon-1a6g</link>
      <guid>https://dev.to/shihyu/how-to-mint-a-video-nft-using-livepeer-video-services-polygon-1a6g</guid>
      <description>&lt;p&gt;The concept of NFTs has been around since the 2014s but it wasn't until 2017 that projects like &lt;a href="https://www.cryptokitties.co/"&gt;CryptoKitties&lt;/a&gt; and &lt;a href="https://www.larvalabs.com/cryptopunks"&gt;CryptoPunks&lt;/a&gt; started to create traction for NFTs. Jumping to 2021, NFTs took off like wildfire. They started being referenced in pop culture, mainstream media, and they influenced the concepts that many hackathon projects were based on.&lt;/p&gt;

&lt;p&gt;The technology for creating NFTs has come a long way and is now more accessible to developers and non-developers alike. Along with the creation of NFT marketplaces such as &lt;a href="https://opensea.io/"&gt;OpenSea &lt;/a&gt;and &lt;a href="https://rarible.com/"&gt;Rarible&lt;/a&gt;, anyone can mint their own NFTs and sell them.&lt;/p&gt;

&lt;p&gt;When minting video NFTs, a major factor to consider is the file size. Livepeer Video Services solves this issue when using the &lt;a href="https://www.npmjs.com/package/@livepeer/video-nft"&gt;Video NFT SDK&lt;/a&gt;. This SDK will transcode the video to the proper file size utilizing the &lt;a href="https://livepeer.org/"&gt;Livepeer Network&lt;/a&gt; as well as leveraging the layer 2 solutions of &lt;a href="https://polygon.technology/"&gt;Polygon&lt;/a&gt; to reduce the cost of transactions on the Ethereum blockchain. Using the SDK makes it easy and more affordable to create video NFTs.&lt;/p&gt;

&lt;p&gt;In this tutorial, we will utilize Livepeer Video Services' &lt;a href="https://github.com/livepeer/video-nft"&gt;Mint a Video NFT&lt;/a&gt; tool to create our own NFT that can play a video.&lt;br&gt;
Before we get started, here is a checklist of items required for this tutorial. Instructions on how to get and install these items will be provided in the steps that follow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Checklist&lt;/strong&gt;&lt;br&gt;
☑️ Sign up for a free account at &lt;a href="https://livepeer.com/register"&gt;Livepeer Video Services&lt;/a&gt; to create an API key&lt;br&gt;
☑️ &lt;a href="https://www.pexels.com/video/group-of-jellyfish-swimming-underwater-5613843/?utm_content=attributionCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=pexels"&gt;Jellyfish Video&lt;/a&gt;&lt;br&gt;
*This is an example video that will be used, there are other free videos available at &lt;a href="https://www.pexels.com/videos/"&gt;Pexels&lt;/a&gt;.&lt;br&gt;
☑️ Sign up for a free &lt;a href="https://metamask.io/download/"&gt;Metamask&lt;/a&gt; account&lt;br&gt;
☑️ Add Polygon Mumbai testnet to Metamask wallet&lt;br&gt;
☑️ Get Polygon test &lt;a href="https://faucet.polygon.technology/"&gt;MATIC&lt;/a&gt;&lt;br&gt;
☑️ Install &lt;a href="https://livepeer.com/docs/guides/video-nft"&gt;Video NFT&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation process&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Signup for a free account at &lt;a href="https://livepeer.com/"&gt;Livepeer Video Services&lt;/a&gt; and create an API key&lt;/p&gt;

&lt;p&gt;*If you need a step-by-step process for getting a free account and the API key, visit the How to make API calls with Postman tutorial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Get a video to mint as an NFT&lt;/p&gt;

&lt;p&gt;For this example, we will use this video: &lt;a href="https://www.pexels.com/video/group-of-jellyfish-swimming-underwater-5613843/?utm_content=attributionCopyText&amp;amp;utm_medium=referral&amp;amp;utm_source=pexels"&gt;Jellyfish Video&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*You can also find another video using &lt;a href="https://www.pexels.com/videos/"&gt;Pexels&lt;/a&gt; or use provide one of your own. If you do use one of your own, make sure it is in a .mp4 format.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Install Metamask (if you do not already have one)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Go to &lt;a href="https://metamask.io/download/"&gt;Metamask&lt;/a&gt; and download the browser extension. For this tutorial, we will use the Chrome version, but a Firefox version is also available.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DsD7K_-d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iw1yr9ry5yyhuvf34rkm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DsD7K_-d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iw1yr9ry5yyhuvf34rkm.png" alt="Metamask Website" width="880" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fE7bnqjk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wu8hhqu8uotxlduugy4h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fE7bnqjk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wu8hhqu8uotxlduugy4h.png" alt="Metamask Website" width="880" height="692"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Once downloaded, you should see the Metamask logo in the extension menu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qt6Xm_Yx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9u3jnawovt7i3q6oky94.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qt6Xm_Yx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9u3jnawovt7i3q6oky94.png" alt="Metamask Website" width="880" height="723"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next, set up your Metamask wallet - &lt;a href="https://docs.polygon.technology/docs/develop/metamask/hello/"&gt;Polygon&lt;/a&gt; has a great tutorial on how to do this&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Configuring Polygon network for Metamask&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We need to configure the Polygon network to the Metamask wallet. For this tutorial, we will use the Polygon testnet called &lt;a href="https://docs.polygon.technology/docs/develop/metamask/config-polygon-on-metamask"&gt;Mumbai&lt;/a&gt;, but they also have the &lt;a href="https://docs.polygon.technology/docs/develop/metamask/config-polygon-on-metamask"&gt;Polygon mainnet&lt;/a&gt; configuration as well.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; Getting MATIC for testing&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minting NFTs has a gas fee associated with it, so we need to add funds to our wallet. Since we are using the Mumbai testnet, we will need to get some &lt;a href="https://faucet.polygon.technology/"&gt;test MATIC tokens&lt;/a&gt;. If you are using Polygon's mainnet, you can find the &lt;a href="https://matic.supply/"&gt;MATIC faucet&lt;/a&gt; here.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MuMYvIYJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dz2eyir30uxbn4rwimx8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MuMYvIYJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dz2eyir30uxbn4rwimx8.png" alt="Polygon Website" width="880" height="729"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make sure the Mumbai tab is selected&lt;/li&gt;
&lt;li&gt;Paste in your wallet address and you should receive some test MATIC token&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ybSSLfKD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mbpfkg888n1uwdsdgvfe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ybSSLfKD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mbpfkg888n1uwdsdgvfe.png" alt="Polygon Website" width="880" height="729"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the submit button and a confirmation window should pop up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9sMTJEtX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ldhhnhzj4pltpqw5ncro.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9sMTJEtX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ldhhnhzj4pltpqw5ncro.png" alt="Polygon Website" width="880" height="729"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click confirm and a message should appear stating the transaction went through&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fWzWXw1_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dkx4jlpoxee5czf2zs08.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fWzWXw1_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dkx4jlpoxee5czf2zs08.png" alt="Polygon Website" width="880" height="729"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your wallet should be funded with some test MATIC tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BOTEmxv3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ul621a0zs4ru5md8fih2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BOTEmxv3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ul621a0zs4ru5md8fih2.png" alt="Polygon Website" width="880" height="729"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6:&lt;/strong&gt; Installing the mint Video-NFT&lt;/p&gt;

&lt;p&gt;&lt;em&gt;*If you want to have video-nft available as a command on your machine, you can also install the CLI persistently with &lt;code&gt;npm i -g @livepeer/video-nft&lt;/code&gt;, and after that just call video-nft from anywhere to run it.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a new directory with the command
&lt;code&gt;mkdir VideoNFT&lt;/code&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dqxLhiVB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cetptje9mqfubzcll6u7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dqxLhiVB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cetptje9mqfubzcll6u7.png" alt="Image of terminal" width="880" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Change into that directory using
&lt;code&gt;cd VideoNFT&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d2ikXRpY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o8ouxtmx3ybokvrknxus.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d2ikXRpY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o8ouxtmx3ybokvrknxus.png" alt="Image of terminal" width="880" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Move the video from &lt;strong&gt;Step 2&lt;/strong&gt; into this directory&lt;/li&gt;
&lt;li&gt;The file should be in this directory, use the ls command to view it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;ls&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1RTdLGIe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uz3ipfwtjc71451xfvgz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1RTdLGIe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uz3ipfwtjc71451xfvgz.png" alt="Image of terminal" width="880" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run Livepeer Video Services Video NFT using&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;npx @livepeer/video-nft&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fsei5F6B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f8rrahhirntx1zzvj5f4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fsei5F6B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f8rrahhirntx1zzvj5f4.png" alt="Image of terminal" width="880" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rBO-TsxQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uyt5qvs9nu6ht4tecz62.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rBO-TsxQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uyt5qvs9nu6ht4tecz62.png" alt="Image of terminal" width="880" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copy and paste the API key that you got from &lt;strong&gt;Step 1&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D1gQ8IW2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sc5tc6rp824rxtt08lu3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D1gQ8IW2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sc5tc6rp824rxtt08lu3.png" alt="Image of terminal" width="880" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Type in the name of the video file, for this example, it is &lt;em&gt;jellyfish.mp4&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vcJ5kTzH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3u5rk1kkxo33kl95xwlb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vcJ5kTzH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3u5rk1kkxo33kl95xwlb.png" alt="Image of terminal" width="880" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provide the name you want to give the NFT, you can use the file name to name the NFT but in this example, we will use &lt;em&gt;JellyFish&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Fnbh7SVS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0qkteqms3vgie17ur00t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Fnbh7SVS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0qkteqms3vgie17ur00t.png" alt="Image of terminal" width="880" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Qee_jmMH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j8hiudqra1svxc400n6k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Qee_jmMH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j8hiudqra1svxc400n6k.png" alt="Image of terminal" width="880" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In this example we will not customize our metadata so select no for customizing the metadata for the NFT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IV-YrcMz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x22uizl3vcby13ykyc45.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IV-YrcMz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x22uizl3vcby13ykyc45.png" alt="Image of terminal" width="880" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A message should appear that states the export is successful along with the metadata and our URL for minting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MTbdEDmZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kcgrc6o5fuwzgop45jaz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MTbdEDmZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kcgrc6o5fuwzgop45jaz.png" alt="Image of terminal" width="880" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copy the URL in &lt;strong&gt;Step 3&lt;/strong&gt; for the next step&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 7:&lt;/strong&gt; Minting the video NFT&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copy and paste the URL from the previous step into a browser window&lt;/li&gt;
&lt;li&gt;A Livepeer Video Services site should appear with a Mint a Video NFT pop up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qaFdIkmc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/otsckd8vd1fjb91bp6sw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qaFdIkmc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/otsckd8vd1fjb91bp6sw.png" alt="LVS minting dashboard" width="880" height="729"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the &lt;strong&gt;Connect to Metamask&lt;/strong&gt; button&lt;/li&gt;
&lt;li&gt;Metamask browser extension should open and ask the account to connect to&lt;/li&gt;
&lt;li&gt;Select the account with the funded testnet MATIC and connect it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HBS3vxZQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ss1501dxvabkjleu9lla.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HBS3vxZQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ss1501dxvabkjleu9lla.png" alt="Metamask extension" width="510" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Once connected, the pop up should have the &lt;strong&gt;ContractAddress&lt;/strong&gt; and the message box should state that you are connected to the Polygon Testnet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MpnnGLsJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jfj9i4j0lhul5zpdj6hs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MpnnGLsJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jfj9i4j0lhul5zpdj6hs.png" alt="LVS minting dashboard" width="880" height="729"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the &lt;strong&gt;Mint NFT&lt;/strong&gt; button&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f-dNgh9a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7gwepyia6sju0kf5hvf6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f-dNgh9a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7gwepyia6sju0kf5hvf6.png" alt="LVS minting dashboard" width="880" height="723"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Metamask browser extension should open and ask to confirm the transaction fee&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rJQgQFE4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8zl2xejpfvfz8k1husgy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rJQgQFE4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8zl2xejpfvfz8k1husgy.png" alt="Metamask extension" width="438" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the &lt;strong&gt;Confirm&lt;/strong&gt; button&lt;/li&gt;
&lt;li&gt;You should see the minting in progress in the message field&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RzpcI8nF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5vz8kcerm2x6xp9tiwwa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RzpcI8nF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5vz8kcerm2x6xp9tiwwa.png" alt="LVS minting dashboard" width="880" height="729"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Once the minting is completed, it should provide a link to OpenSea testnet where you can view your Video NFT! For example:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://testnets.opensea.io/assets/mumbai/0xA4E1d8FE768d471B048F9d73ff90ED8fcCC03643/56"&gt;https://testnets.opensea.io/assets/mumbai/0xA4E1d8FE768d471B048F9d73ff90ED8fcCC03643/56&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--93vQIGF---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2w9c8lpx9l3yl1vztntq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--93vQIGF---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2w9c8lpx9l3yl1vztntq.png" alt="LVS minting dashboard" width="880" height="729"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6ltdTZaz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pxbi9vnf2681m0t8upwe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6ltdTZaz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pxbi9vnf2681m0t8upwe.png" alt="Image of NFT" width="880" height="729"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Congratulations! You have minted a video NFT using Livepeer Video Services' &lt;a href="https://www.npmjs.com/package/@livepeer/video-nft"&gt;Video NFT SDK&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Using the SDK is a great way to get started with being able to upload video NFTs. If you want to upload videos and do not want to mint NFTS, Livepeer Video Services also has Video on Demand where you can do just that.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://livepeer.com/docs/api-reference/vod"&gt;Check out Video On Demand&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to make API calls with Postman and Livepeer Video Services</title>
      <dc:creator>Shih-Yu Hwang</dc:creator>
      <pubDate>Tue, 15 Mar 2022 22:18:57 +0000</pubDate>
      <link>https://dev.to/shihyu/how-to-make-api-calls-with-postman-and-livepeer-video-services-15f9</link>
      <guid>https://dev.to/shihyu/how-to-make-api-calls-with-postman-and-livepeer-video-services-15f9</guid>
      <description>&lt;p&gt;APIs are essential when it comes to software development. It allows softwares to communicate with each other to exchange information. In the beginning, when learning to make API calls, it can be a challenge using tools such as cURL in the terminal, &lt;strong&gt;FETCH&lt;/strong&gt; in the frontend or backend option such as &lt;strong&gt;Express&lt;/strong&gt;. Postman is a great tool for understanding the process of making API calls and getting feedback on the response of those calls. It provides a visual interface and allows developers to get a sense of the workflow which can provide easier transitions to using other tools such as cURL or Express.&lt;/p&gt;

&lt;p&gt;In this tutorial, we will be using &lt;a href="https://www.postman.com/"&gt;Postman&lt;/a&gt; to make API requests to &lt;a href="https://livepeer.com/"&gt;Livepeer Video Services&lt;/a&gt; to get a better understanding on building an application similar to Twitch or YouTube. The Livepeer Video Services API consists of the standard features for users such as creating new live streams, recording the streams and getting a list of their streams. By leveraging &lt;a href="https://livepeer.org/"&gt;Livepeer's decentralized network&lt;/a&gt; for transcoding, it will be easier and cost effective to scale for in the future.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Get access to Postman&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;a href="https://www.postman.com/"&gt;Postman's website&lt;/a&gt; and sign up for a free account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8O9yaLy---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/983f8k575k33h80y7131.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8O9yaLy---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/983f8k575k33h80y7131.png" alt="Postman website" width="880" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can use their web browser tool or download the desktop version. For this tutorial, we will use the desktop version with Mac OS, but it is also available for Windows and Linux.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Get access to Livepeer Video Services&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;a href="https://livepeer.com/"&gt;Livepeer Video Services&lt;/a&gt; and sign up for a free account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--r2PcSj98--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8e135md3hb2xg1sxtjec.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--r2PcSj98--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8e135md3hb2xg1sxtjec.png" alt="Livepeer Video Services dashboard" width="880" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EPOiOl1M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1n64xb31z9s4arsknlft.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EPOiOl1M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1n64xb31z9s4arsknlft.png" alt="Livepeer Video Services dashboard" width="880" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that we have access to these two services, let's start interacting with them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Get an API key&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In your Livepeer dashboard, tap the developers tab and select API keys&lt;/li&gt;
&lt;li&gt;Click the button that says &lt;strong&gt;Create Key&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Then give your key a name and click &lt;strong&gt;Create&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MUs_tcaO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a6q1qqrzmvfniws01to6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MUs_tcaO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a6q1qqrzmvfniws01to6.png" alt="Livepeer Video Services dashboard" width="880" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PA7Etz4F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vjiin9xdgnsv71evwt59.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PA7Etz4F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vjiin9xdgnsv71evwt59.png" alt="Livepeer Video Services dashboard" width="880" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the API key, we will start going through the &lt;strong&gt;Stream&lt;/strong&gt; section of Livepeer Video Services' &lt;a href="https://livepeer.com/docs/api-reference/stream/post-stream"&gt;API Reference&lt;/a&gt;. The reference uses the cURL command but we will do this using Postman instead.&lt;/p&gt;

&lt;p&gt;To learn more about streaming Livepeer Video Services with the cURL command, visit the tutorial &lt;a href="https://livepeer.com/blog/streaming-with-rtmp-api"&gt;How To Stream With Livepeer Video Service's RTMP API&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4&lt;/strong&gt;: Launch the Postman desktop app&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the &lt;strong&gt;+&lt;/strong&gt; icon under the Reports tab to start a new request or select &lt;strong&gt;New Tab&lt;/strong&gt; under the file menu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VyQ3vyr4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b5h1t4lspmvmwuevalax.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VyQ3vyr4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b5h1t4lspmvmwuevalax.png" alt="Postman dashboard" width="880" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5:&lt;/strong&gt; Create a stream&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select the &lt;strong&gt;POST&lt;/strong&gt; option and the paste in Livepeer Video Services' base URL for streaming &lt;strong&gt;&lt;code&gt;https://livepeer.com/api/stream&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zibvFDoo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pcqbx3wewif0mw5n17gw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zibvFDoo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pcqbx3wewif0mw5n17gw.png" alt="Postman dashboard" width="880" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Then underneath the URL, click on the &lt;strong&gt;Authorization&lt;/strong&gt; tab, and select &lt;strong&gt;Bearer Token&lt;/strong&gt; as the type&lt;/li&gt;
&lt;li&gt;Copy and paste your API key from Livepeer Video Services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1hgs_-4l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xminn4qcjzcyfdnuiukg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1hgs_-4l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xminn4qcjzcyfdnuiukg.png" alt="Postman dashboard" width="880" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now select the &lt;strong&gt;Body&lt;/strong&gt; tab and then underneath select the &lt;strong&gt;raw&lt;/strong&gt; radio button&lt;/li&gt;
&lt;li&gt;Then click the the Text drop down menu and select the JSON option&lt;/li&gt;
&lt;li&gt;In the text box field below, paste the following code which is from the &lt;a href="https://livepeer.com/docs/api-reference/stream/post-stream"&gt;Livepeer Video Services API reference docs&lt;/a&gt;. You can change the &lt;strong&gt;name&lt;/strong&gt; to whatever you want as this is for the name of your stream&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8Ho1NLuX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rdd0sh95osq4f3x6rc40.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8Ho1NLuX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rdd0sh95osq4f3x6rc40.png" alt="Stream code" width="522" height="700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6scVLwaC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/02d8wwzr7z14rtbdnstb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6scVLwaC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/02d8wwzr7z14rtbdnstb.png" alt="Postman dashboard" width="880" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now click on the &lt;strong&gt;Send&lt;/strong&gt; button and you should receive a confirmation that it went through with a 201 status&lt;/li&gt;
&lt;li&gt;Scroll down in the response and copy the id for the stream that was just created. It should be under renditions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qQ0u3ekx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zaem5jugql8663bvb35q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qQ0u3ekx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zaem5jugql8663bvb35q.png" alt="Postman dashboard" width="880" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check the Livepeer Video Services' dashboard and the stream that you just created should come up&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2TYainFm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6t0p1k37ghzjw90oxj3g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2TYainFm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6t0p1k37ghzjw90oxj3g.png" alt="Livepeer Video Services dashboard" width="880" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now let's get the stream we just created&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6:&lt;/strong&gt; Retrieve a stream&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the Postman app, we will change from &lt;strong&gt;POST&lt;/strong&gt; to &lt;strong&gt;GET&lt;/strong&gt;, and in the URL paste in &lt;strong&gt;&lt;code&gt;https://livepeer.com/api/stream/{id}&lt;/code&gt;&lt;/strong&gt; and replace &lt;strong&gt;&lt;code&gt;{id}&lt;/code&gt;&lt;/strong&gt; with the id we copied from our response earlier.&lt;/li&gt;
&lt;li&gt;Click the blue send button and you should get back a 200 status with the response including the parameters of the stream&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hwUl6593--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gwk20t0bdkoexydmqrah.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hwUl6593--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gwk20t0bdkoexydmqrah.png" alt="Postman dashboard" width="880" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7:&lt;/strong&gt; Get a list of streams&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In order to get a list of streams, follow &lt;strong&gt;Step 5&lt;/strong&gt; to create a second stream so that there is more than one stream&lt;/li&gt;
&lt;li&gt;Give it a name of your choice, but for this example, it will be named &lt;em&gt;Second Stream&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mIEz0o8a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hc9eze52yjhevnsnnc70.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mIEz0o8a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hc9eze52yjhevnsnnc70.png" alt="Postman dashboard" width="880" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go back to Livepeer Video Services' dashboard and you should see the &lt;strong&gt;Second Stream&lt;/strong&gt; appear&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d58pRIbN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/siv4bctnc2ejpece8eh6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d58pRIbN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/siv4bctnc2ejpece8eh6.png" alt="Livepeer Video Services dashboard" width="880" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now that we have multiple streams, go back to the Postman app and retrieve them&lt;/li&gt;
&lt;li&gt;Similar to &lt;strong&gt;Step 6&lt;/strong&gt; we are changing &lt;strong&gt;POST&lt;/strong&gt; to &lt;strong&gt;GET&lt;/strong&gt; and insert the base URL for retrieving multiple streams &lt;strong&gt;&lt;code&gt;https://livepeer.com/api/stream?streamsonly=1&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Remember that the body should have the &lt;strong&gt;none radio button&lt;/strong&gt; selected since we are not passing in any data&lt;/li&gt;
&lt;li&gt;Click the blue send button and it should confirm with a response of status 200 meaning that the request went through and a response back with a list of your streams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ubXo7oHV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hgpcfwg3lw3wkz40qly1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ubXo7oHV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hgpcfwg3lw3wkz40qly1.png" alt="Postman dashboard" width="880" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 8: Toggling a stream&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace &lt;strong&gt;GET&lt;/strong&gt; with &lt;strong&gt;Patch&lt;/strong&gt; and insert the URL for for toggling recording &lt;strong&gt;&lt;code&gt;https://livepeer.com/api/stream/{id}/record&lt;/code&gt;&lt;/strong&gt; and replace &lt;strong&gt;&lt;code&gt;{id}&lt;/code&gt;&lt;/strong&gt; with the one you have at the end of &lt;strong&gt;Step 5&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Now we will toggle the recording on by putting the following in body, just as we did in &lt;strong&gt;Step 5&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;{&lt;br&gt;
"record": true&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the blue send button and it should confirm with a response of status 204 meaning that the request went through&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yC_sR2X2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9whenklbprjf36uywq34.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yC_sR2X2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9whenklbprjf36uywq34.png" alt="Postman dashboard" width="880" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 9:&lt;/strong&gt; Update a stream&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;Patch&lt;/strong&gt; and insert the URL for updating a stream &lt;strong&gt;&lt;code&gt;https://livepeer.com/api/stream/{id}&lt;/code&gt;&lt;/strong&gt; and replace &lt;strong&gt;&lt;code&gt;{id}&lt;/code&gt;&lt;/strong&gt; with the one you have at the end of &lt;strong&gt;Step 5&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Now we will not have the recording on and suspend the stream by putting the following in body, just as we did in &lt;strong&gt;Step 5&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;{&lt;br&gt;
"record": false,&lt;br&gt;
"suspend": true&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the blue send button and it should confirm with a response of status 204 meaning that the request went through&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JHhamllf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k09lhvzfssyv11ul7m07.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JHhamllf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k09lhvzfssyv11ul7m07.png" alt="Postman dashboard" width="880" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 10:&lt;/strong&gt; Delete a stream&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We will delete &lt;strong&gt;Second Stream&lt;/strong&gt; by replacing &lt;strong&gt;Patch&lt;/strong&gt; with &lt;strong&gt;Delete&lt;/strong&gt; and insert the URL for deleting a stream &lt;strong&gt;&lt;code&gt;https://livepeer.com/api/stream/{id}&lt;/code&gt;&lt;/strong&gt; and replace the &lt;strong&gt;&lt;code&gt;{id}&lt;/code&gt;&lt;/strong&gt; you have at the end of &lt;strong&gt;Step 5&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click the blue send button and you should get a status 204 as a response to confirm the stream has been deleted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tDYx45OH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x2dybda1lzm3rdak7grt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tDYx45OH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x2dybda1lzm3rdak7grt.png" alt="Postman dashboard" width="880" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go back to Livepeer Video Services' dashboard to confirm that the stream has been deleted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UTW11PTK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s4wxljeir3e7do8pacrn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UTW11PTK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s4wxljeir3e7do8pacrn.png" alt="Livepeer Video Services dashboard" width="880" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that you are able to use Postman to interact with Livepeer Video Services' API, take your skills to another level using cURL. To learn more, check out the tutorial How to Stream With Livepeer Video Service's RTMP API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://livepeer.com/blog/streaming-with-rtmp-api"&gt;How to Stream with RTMP API&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>programming</category>
      <category>postman</category>
      <category>livestreaming</category>
    </item>
    <item>
      <title>What to know about RTMP</title>
      <dc:creator>Shih-Yu Hwang</dc:creator>
      <pubDate>Fri, 25 Feb 2022 23:45:08 +0000</pubDate>
      <link>https://dev.to/shihyu/what-to-know-about-rtmp-56l3</link>
      <guid>https://dev.to/shihyu/what-to-know-about-rtmp-56l3</guid>
      <description>&lt;p&gt;These four letters are used a lot in the video development world, but what does it mean and what is it for? In this article, we will go into the meaning of RTMP, its workflow and how it works in general.&lt;/p&gt;

&lt;p&gt;RTMP or Real-Time Messaging Protocol is a type of transporting protocol also known as TCP or Transmission Control Protocol. Transporting protocols are responsible for delivering information from a media server to a user whether through the use of a CDN or directly to the video player. RTMP has been used more as a method of transporting data for a while due to being around for a long time. However, there is another transfer protocol called SRT that is gaining popularity. To learn more about SRT and Livepeer, read our article &lt;a href="https://livepeer.com/blog/livepeer-now-supports-srt"&gt;Start Using SRT with Livepeer&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Synonymous with Flash player, RTMP was developed by Macromedia and later acquired by Adobe, which they rebranded to Adobe Flash Player. Key features of RTMP include streaming at low-latency (~5 seconds) with minimal buffering and it being bi-directional, meaning that it can send and receive video data. There are other variations of RTMP such as RTMP, RTMPS, RTMPE, RTMPT, RTMPF.&lt;/p&gt;

&lt;p&gt;Though the benefits are useful, it is no longer as supported or updated. Nor does it have much compatibility with most web browsers,  iOS or Android devices. Another shortcoming of RTMP is that it can only deliver two channels for audio. This means RTMP can not deliver audio with more than one language.&lt;/p&gt;

&lt;h3&gt;
  
  
  RTMP delivery workflow
&lt;/h3&gt;

&lt;p&gt;As a delivery protocol, RTMP takes the data and is able to break it down into smaller pieces of information known as chunks. It then determines the proper chunk size to send and does this in a continuous manner. This is how it is able to generate a constant connection for live streaming.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zGqHwsx7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s3x2vh4mm7jrkl2ey6ye.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zGqHwsx7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s3x2vh4mm7jrkl2ey6ye.png" alt="RTMP delivery workflow chart" width="800" height="217"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  RTMP ingest workflow
&lt;/h3&gt;

&lt;p&gt;Nowadays, RTMP is often used more for transferring data from the encoder to the media server than for delivering from the media server to the CDN or video player. A main reason is because Adobe Flash Player is no longer supported and more adoption of HLS as the transfer protocol.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Hb3YLDss--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4odat5z4u2uaa8b045sd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hb3YLDss--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4odat5z4u2uaa8b045sd.png" alt="RTMP ingest workflow chart" width="880" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is an outline of how the ingesting method works:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Handshake&lt;/strong&gt; - data being exchanged between client and server (3 chunks of data)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chunk 1 - Informs server which variation of RTMP being used&lt;/li&gt;
&lt;li&gt;Chunk 2 - Contains the timestamp&lt;/li&gt;
&lt;li&gt;Chunk 3 - Confirms first two data chunks and then starts - connection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Connection&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send information that contains the type of application, audio codec and video codec being used&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stream&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send information on transaction ID, stream ID, and other parameters to create stream&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  RTMP ingest with Livepeer
&lt;/h3&gt;

&lt;p&gt;Livepeer offers a convenient way to get an ingest point and start streaming with ease. To learn more on how to do so, check out this article &lt;a href="https://livepeer.com/blog/New-Dashboard"&gt;New Dashboard for Livepeer.com's Streaming API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For those who want to build Livepeer into their own applications for a more customizable experience to give to their users, visit &lt;a href="https://livepeer.com/blog/streaming-with-rtmp-api"&gt;Streaming with RTMP&lt;/a&gt; for a more in-depth use of RTMP to stream with Livepeer with the API.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://livepeer.com/docs/api-reference"&gt;Learn more about the Livepeer API&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>SRT Blog Post: Livepeer now supports SRT</title>
      <dc:creator>Shih-Yu Hwang</dc:creator>
      <pubDate>Thu, 17 Feb 2022 15:00:30 +0000</pubDate>
      <link>https://dev.to/shihyu/srt-blog-post-livepeer-now-supports-srt-54f</link>
      <guid>https://dev.to/shihyu/srt-blog-post-livepeer-now-supports-srt-54f</guid>
      <description>&lt;h2&gt;
  
  
  What’s SRT?
&lt;/h2&gt;

&lt;p&gt;Secure Reliable Transport (SRT) is an open source video transport protocol developed by Haivision, that excels at providing stable streaming at relatively low latency. Although SRT is primarily used in broadcasting and corporate environments, SRT is increasingly becoming popular for all kinds of streaming over the internet.  &lt;/p&gt;

&lt;p&gt;Before going into more details on why the SRT protocol is gaining more adoption compared to the more traditional transport protocol such as RTMP and RTSP, let’s take a brief look at where it fits in the context of live video streaming.&lt;/p&gt;

&lt;h2&gt;
  
  
  Live video streaming workflow
&lt;/h2&gt;

&lt;p&gt;Here is a simplified process of how live streaming works:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cameras and Microphones&lt;/strong&gt; &lt;br&gt;
 Source used for broadcasting video and/or audio&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Encoding&lt;/strong&gt;&lt;br&gt;
Compresses the raw data from cameras and/or microphones for easier transporting across the internet&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transcoding&lt;/strong&gt;  &lt;em&gt;(*SRT)&lt;/em&gt;&lt;br&gt;
Compresses the encoded data to smaller sizes and different formats to be more accessible across different types of devices&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Media servers&lt;/strong&gt; &lt;br&gt;
Converts and repackages transcoded data as needed to be available for different types of formats chosen to view the video&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content Delivery Network&lt;/strong&gt;&lt;br&gt;
Quickly distributes the content provided by the media server from the nearest location requested by the viewer&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Video players and playback&lt;/strong&gt;&lt;br&gt;
Decodes the data from the CDN and displays it for viewing&lt;/p&gt;

&lt;h2&gt;
  
  
  In depth on SRT
&lt;/h2&gt;

&lt;p&gt;SRT is part of the transcoding process that delivers the data to the media server. Due to the nature of data getting transferred constantly in different variations, maintaining the optimum quality from the original source is very important.  &lt;/p&gt;

&lt;p&gt;There are features in SRT that assists in maintaining high quality data when transferring them.&lt;br&gt;
Here are some unique features provided by SRT that help preserve the quality of data that is being transferred.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The ability to configure the time to synchronize to multiple feeds&lt;/li&gt;
&lt;li&gt;The ability to set and adjust the bandwidth&lt;/li&gt;
&lt;li&gt;Reconstruct NAK(Negative Acknowledgement) packages to provide a smoother experience&lt;/li&gt;
&lt;li&gt;More adaptability by being codec agnostic for audio and video&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We like SRT not only because it’s being actively maintained and is open-sourced, but also because SRT is designed to be highly stable and perform well in unpredictable network conditions by adapting to real-time network conditions. Another important aspect is that it also provides for security for the content distribution by using AES encryption. &lt;/p&gt;

&lt;p&gt;Simply put: more reliable video means happier viewers. &lt;/p&gt;

&lt;p&gt;SRT is still relatively new and not as widespread as RTMP, which means that you can’t stream SRT into popular live-streaming sites like Youtube, Twitch, and Facebook. Livepeer supporting SRT means that your streamers can stream SRT and get all the stability and security improvements that it was designed to deliver. &lt;/p&gt;

&lt;h2&gt;
  
  
  Using SRT with Livepeer
&lt;/h2&gt;

&lt;p&gt;SRT streaming is simple to use. Currently, we provide a RTMP ingest URL like the following example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TyimMeMJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xjumclvky0eijf3eo45z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TyimMeMJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xjumclvky0eijf3eo45z.png" alt="RTMP URL" width="880" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To use SRT transport method, simply replace the RTMP ingest URL with:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TNz9jn0n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yds7gckh91d70mebquvr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TNz9jn0n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yds7gckh91d70mebquvr.png" alt="SRT URL" width="880" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another easy option is that the SRT ingest URL is located right under the RTMP URL in the Livepeer dashboard. If you are using the SRT URL from the dashboard, there is no need to provide the stream key as it is already included.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DAlrXp3B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/miir3qq8a0hdyer4fn83.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DAlrXp3B--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/miir3qq8a0hdyer4fn83.png" alt="Livepeer Dashboard" width="880" height="615"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Below is an example of using SRT with OBS&lt;/p&gt;

&lt;p&gt;Go to settings &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tvOkwsPI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gupl5rowh8u9wq3mfli0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tvOkwsPI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gupl5rowh8u9wq3mfli0.png" alt="OBS Dashboard" width="880" height="642"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then select the &lt;strong&gt;Stream&lt;/strong&gt; tab in the left menu &lt;br&gt;
Select custom from the &lt;strong&gt;Service&lt;/strong&gt; drop down menu&lt;br&gt;
Paste in the SRT URL in the &lt;strong&gt;Server&lt;/strong&gt; field&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2ykQqK16--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eyvosntjrse7oan6zz27.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2ykQqK16--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eyvosntjrse7oan6zz27.png" alt="OBS Settings" width="880" height="697"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste in the SRT ingest URL from Livepeer Video Services. Note that {stream_key} should be replaced with the given key, e.g. 56g6-xcd1-toox-w70z&lt;/p&gt;

&lt;p&gt;And that’s it! &lt;/p&gt;

&lt;p&gt;SRT is free to use for all accounts. For more information to get started using SRT, check out our documentation. Here is more information on getting started using SRT in Livepeer, also check out our documentation. Happy streaming!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://livepeer.com/docs/guides/start-live-streaming/srt-support"&gt;Read SRT docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>opensource</category>
      <category>livestream</category>
      <category>video</category>
    </item>
  </channel>
</rss>
