<?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>Forem: Dan Zeitman</title>
    <description>The latest articles on Forem by Dan Zeitman (@dzeitman).</description>
    <link>https://forem.com/dzeitman</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%2F44453%2F96aab60d-fb9d-4d35-ac79-65d90aec4c11.jpeg</url>
      <title>Forem: Dan Zeitman</title>
      <link>https://forem.com/dzeitman</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/dzeitman"/>
    <language>en</language>
    <item>
      <title>Keep Your AWS S3 Demo Assets Live: Automating Presigned URLs with Node.js</title>
      <dc:creator>Dan Zeitman</dc:creator>
      <pubDate>Thu, 23 Oct 2025 00:22:31 +0000</pubDate>
      <link>https://forem.com/dzeitman/keep-your-aws-s3-demo-assets-live-automating-presigned-urls-with-nodejs-9b0</link>
      <guid>https://forem.com/dzeitman/keep-your-aws-s3-demo-assets-live-automating-presigned-urls-with-nodejs-9b0</guid>
      <description>&lt;h3&gt;
  
  
  TL;DR
&lt;/h3&gt;

&lt;p&gt;You work with audio (or any media) all the time and have &lt;strong&gt;demo assets&lt;/strong&gt; stored securely on Amazon S3.&lt;br&gt;&lt;br&gt;
You want to load these into your apps or SDK demos — but your &lt;strong&gt;presigned URLs keep expiring&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;This CLI tool also supports uploading files or directories to your S3 demo‑assets bucket and listing bucket contents — all with one command.&lt;/p&gt;

&lt;p&gt;This little Node.js CLI tool lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;quickly upload a media asset object to your AWS Bucket&lt;/li&gt;
&lt;li&gt;generate presigned URLs for your S3 bucket (&lt;code&gt;demo-assets/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;save them in a JSON file for easy import into any project
&lt;/li&gt;
&lt;li&gt;refresh them anytime with a single command&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s walk through how to install and use it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;-g&lt;/span&gt; create-demo-assets 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  That's it!
&lt;/h3&gt;

&lt;p&gt;Open a terminal and run that cmd. Well almost, this tool is for managing AWS objects, so there is the expectation you've have Node v26+, and the AWS CLI tool already installed and use their tool to manage your credentials. Scroll down for a deeper explanation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Basic Use Case
&lt;/h2&gt;

&lt;p&gt;On AWS 3, you might have something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;s3://audioshake/demo-assets/
├── Chupe-Jaae-English.mp4
├── Vocal-Demo.wav
├── Guitar-Solo.mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your local or web app can fetch demo assets reliably — and when URLs expire, just rerun &lt;code&gt;create-demo-assets&lt;/code&gt;. These are your demo media files — used for testing APIs, web players, or internal demos.&lt;/p&gt;

&lt;p&gt;You could manually create a presigned URL each time, but that’s tedious.&lt;br&gt;&lt;br&gt;
Instead, you’ll use this lightweight CLI to generate a simple &lt;code&gt;demo-assets.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"assets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://audioshake.s3.us-east-1.amazonaws.com/demo-assets/Vocal-Demo.wav?..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Vocal-Demo.wav"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"audio/wav"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"expiry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-10-14T09:45:00.000Z"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Using The tool:
&lt;/h3&gt;

&lt;p&gt;From any directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;create-demo-assets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;list all objects in your S3 folder
&lt;/li&gt;
&lt;li&gt;generate presigned URLs (default 12‑hour expiry)
&lt;/li&gt;
&lt;li&gt;save &lt;code&gt;demo-assets.json&lt;/code&gt; in your current working directory
&lt;/li&gt;
&lt;/ul&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔍 Listing objects in s3://audioshake/demo-assets/ ...
demo-assets.json created with 8 assets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Upload or List Assets
&lt;/h3&gt;

&lt;p&gt;You can now upload new demo files or check what’s in your bucket without generating JSON.&lt;/p&gt;

&lt;p&gt;Upload a single file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;create-demo-assets &lt;span class="nt"&gt;--upload&lt;/span&gt; ./song.mp3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Upload a directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;create-demo-assets &lt;span class="nt"&gt;--uploadDir&lt;/span&gt; ./assets &lt;span class="nt"&gt;--type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mp3,mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;List all files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;create-demo-assets &lt;span class="nt"&gt;--list&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you pass &lt;code&gt;--type&lt;/code&gt;, only matching file extensions are included. Supported formats include mp3, wav, mp4, mov, json, txt, md, and more.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to configure the tool for AWS
&lt;/h2&gt;

&lt;p&gt;Make sure you have the AWS CLI installed set up with a config profile that can read from your bucket:&lt;/p&gt;

&lt;p&gt;Let's list the available profiles.   This is useful when switching between dev and production. In most cases it will be &lt;strong&gt;&lt;em&gt;default&lt;/em&gt;&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws configure list-profiles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you need to set up a profile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws configure &lt;span class="nt"&gt;--profile&lt;/span&gt; admin
&lt;span class="c"&gt;# Region: us-east-1&lt;/span&gt;
&lt;span class="c"&gt;# Output: json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws sts get-caller-identity &lt;span class="nt"&gt;--profile&lt;/span&gt; admin
&lt;span class="c"&gt;# This will print the S3 arn:&lt;/span&gt;
aws s3 &lt;span class="nb"&gt;ls &lt;/span&gt;s3://&amp;lt;Your-AWS-Bucket&amp;gt;/demo-assets/ &lt;span class="nt"&gt;--profile&lt;/span&gt; admin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ensure your IAM policy allows &lt;code&gt;s3:ListBucket&lt;/code&gt; and &lt;code&gt;s3:GetObject&lt;/code&gt; for your demo‑assets prefix.&lt;/p&gt;

&lt;h3&gt;
  
  
  Need to update your credentials?
&lt;/h3&gt;

&lt;p&gt;This cmd will install the dependencies globally and creates a config file that stores your bucket information and which AWS profile to use.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run setup again to change the config&lt;/span&gt;
create-demo-assets &lt;span class="nt"&gt;--setup&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  How It Works (Under the Hood)
&lt;/h3&gt;

&lt;p&gt;The script uses the AWS SDK v3:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;S3Client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ListObjectsV2Command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;GetObjectCommand&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@aws-sdk/client-s3&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getSignedUrl&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@aws-sdk/s3-request-presigner&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fromIni&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@aws-sdk/credential-providers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It lists objects, creates presigned URLs via &lt;code&gt;GetObjectCommand&lt;/code&gt;, and writes them to JSON.&lt;/p&gt;

&lt;p&gt;If your bucket has no &lt;code&gt;LocationConstraint&lt;/code&gt; (the classic us‑east‑1 case), the CLI automatically signs requests for that region.&lt;/p&gt;

&lt;p&gt;The same script now handles uploads and listing via the same S3 client — no extra configuration required.More details about &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-quickstart.html" rel="noopener noreferrer"&gt;getting started with the AWS Cli&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Refreshing URLs
&lt;/h3&gt;

&lt;p&gt;Each URL has a 12‑hour expiry by default.&lt;br&gt;&lt;br&gt;
When your links expire, just rerun:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;create-demo-assets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and it’ll overwrite the old JSON with fresh URLs.&lt;/p&gt;




&lt;h3&gt;
  
  
  Example Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔍 Listing objects in s3://audioshake/demo-assets/ ...
demo-assets.json created with 8 assets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;demo-assets.json&lt;/code&gt; now contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"assets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Guitar-Solo.mp3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"format"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"audio/mpeg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"expiry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-10-14T10:00:00Z"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Open Sourced, Feel free to extend the tool!
&lt;/h3&gt;

&lt;p&gt;You can fork the GitHub &lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/AudioExplorer/AWS-Demo-Assets-Tool" rel="noopener noreferrer"&gt;AWS-Demo-Assets-Tool&lt;/a&gt; to add new features to the tool.  Finally npx distribution is here on &lt;a href="https://www.npmjs.com/package/audioshake-demo-assets" rel="noopener noreferrer"&gt;npmjs.com&lt;/a&gt;.  if you find the tool useful then share and drop us some ⭐️⭐️⭐️⭐️⭐️'s &lt;br&gt;
Drop a comment to let me know your use case, and feel free to suggest new features.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why It’s Useful
&lt;/h3&gt;

&lt;p&gt;This simple tool bridges your secure S3 assets with live demos or dev environments — without exposing buckets or manually generating presigned URLs every time.  &lt;/p&gt;

&lt;p&gt;Recent updates make it easier to keep demo assets synchronized: you can upload, list, and regenerate presigned URLs from one CLI.&lt;/p&gt;

&lt;p&gt;Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API demos&lt;/li&gt;
&lt;li&gt;Audio/Video SDK previews&lt;/li&gt;
&lt;li&gt;Internal or hackathon projects&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;code&gt;#aws&lt;/code&gt; &lt;code&gt;#nodejs&lt;/code&gt; &lt;code&gt;#cli&lt;/code&gt; &lt;code&gt;#developers&lt;/code&gt; &lt;code&gt;#audioshake&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The roadmap includes additional S3 management features and examples. Stay tuned for more developer-facing utilities.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Caution:&lt;/strong&gt; Avoid exposing your presigned JSON publicly or using overly long expirations.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>aws</category>
      <category>automation</category>
      <category>node</category>
    </item>
    <item>
      <title>Using NDI in your Real Time Live Streaming Production Workflow</title>
      <dc:creator>Dan Zeitman</dc:creator>
      <pubDate>Mon, 07 Nov 2022 20:18:33 +0000</pubDate>
      <link>https://forem.com/dolbyio/using-ndi-in-your-real-time-live-streaming-production-workflow-59m7</link>
      <guid>https://forem.com/dolbyio/using-ndi-in-your-real-time-live-streaming-production-workflow-59m7</guid>
      <description>&lt;p&gt;If you're a developer who's also creating live streams and content you know that it takes a lot of effort setup a solid content streaming workflow. &lt;/p&gt;

&lt;h2&gt;
  
  
  NDI to the rescue!
&lt;/h2&gt;

&lt;p&gt;NDI® (Network Device Interface) is a free protocol for Video over IP, developed by NewTek. The innovation is in the protocol, which makes it possible to stream video and media across networks with low latency from many device sources. These NDI device sources can be physical hardware or software based. This makes it possible to connect to any device, in any location, anywhere in the world – and transmit live video to wherever you are.  There are a suite of &lt;a href="https://www.ndi.tv/tools/" rel="noopener noreferrer"&gt;NDI tools&lt;/a&gt; that work directly with NDI systems and sources on your network. Combine NDI with &lt;a href="https://Dolby.io" rel="noopener noreferrer"&gt;Dolby.io&lt;/a&gt; Real-time Streaming to deliver real time video for remote or interactive experiences.  &lt;/p&gt;

&lt;p&gt;Dolby.io Real-time Streaming offers incredibly low latency streams typically under a second. And even better, besides having the ability to white-label your own stream with their viewer, or &lt;a href="https://docs.dolby.io/streaming-apis/docs/getting-started" rel="noopener noreferrer"&gt;develop a complete streaming solution&lt;/a&gt;, that same stream can also be distributed through streaming services such as YouTube, Facebook and Twitch. &lt;/p&gt;

&lt;h2&gt;
  
  
  Devices Everywhere
&lt;/h2&gt;

&lt;p&gt;There are many low-to-moderate cost prosumer video devices, PTZ cameras and security systems that offer NDI support. &lt;/p&gt;

&lt;p&gt;If you do not have a camera that supports NDI, you can simply download one of many software-based solutions that stream video and audio over your network over NDI. &lt;/p&gt;

&lt;p&gt;In fact, that shiny new iPhone with the amazing and gorgeous camera might actually provide the best camera solution for live streaming content over NDI. &lt;/p&gt;

&lt;p&gt;Some of our customers have had great success with various apps that are available in the App Store. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://apps.apple.com/us/app/ndi-hx-camera/id1477266080" rel="noopener noreferrer"&gt;NDI HX Camera&lt;/a&gt; by NewTek and &lt;a href="https://apps.apple.com/us/app/stream-camera-for-ndi-hx/id1633326432" rel="noopener noreferrer"&gt;Stream Camera for NDI HX&lt;/a&gt; by fellow iOS developer Thomas Backes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Streaming Workflow
&lt;/h2&gt;

&lt;p&gt;Everyone has their own opinion on what a good live streaming content workflow actually looks like. You decide.   We've created a &lt;a href="https://docs.dolby.io/streaming-apis/docs/using-ndi" rel="noopener noreferrer"&gt;quick guide&lt;/a&gt; to make it easy for you to integrate &lt;strong&gt;&lt;em&gt;your&lt;/em&gt;&lt;/strong&gt; workflow; you have multiple options to publish NDI out with your Dolby.io account. This &lt;a href="https://docs.dolby.io/streaming-apis/docs/using-ndi" rel="noopener noreferrer"&gt;guide&lt;/a&gt; will walk you through two of these options and assumes NDI tools are already installed on your computer.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Dolby.io recently acquired Millicast; you many note some references in the documentation. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  OBS WebRTC
&lt;/h2&gt;

&lt;p&gt;Besides our web application, we also provide a forked version of OBS that's fine tuned for advanced 4K streaming and other features of the Dolby.io platform. &lt;/p&gt;

&lt;p&gt;Download the &lt;a href="https://github.com/CoSMoSoftware/OBS-studio-webrtc/releases" rel="noopener noreferrer"&gt;OBS WebRTC&lt;/a&gt; publisher.&lt;/p&gt;

&lt;p&gt;In OBS create your NDI scene and add your NDI source, which can be from a camera or a mobile app. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F78evnzga9brqzlc42g96.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F78evnzga9brqzlc42g96.png" alt="Image of OBS NDI settings panel" width="800" height="636"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You are now ready to start publishing using NDI with OBS WebRTC for a real time broadcast at scale.&lt;/p&gt;

&lt;p&gt;For the stream, OBS has the following settings:&lt;/p&gt;

&lt;p&gt;VP9&lt;br&gt;
1920x1080&lt;br&gt;
Bitrate 4000Kbps&lt;br&gt;
FPS 30&lt;/p&gt;

&lt;p&gt;You can adjust the OBS WebRTC settings as needed to deliver the best quality and experience. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://dashboard.dolby.io/signup" rel="noopener noreferrer"&gt;Sign up&lt;/a&gt; to get started and then choose streaming to navigate to the Real-time Streaming API section.&lt;/p&gt;

</description>
      <category>streaming</category>
      <category>contentproduction</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Learn Babylon.js to Create Your Own 3D Metaverse Environments</title>
      <dc:creator>Dan Zeitman</dc:creator>
      <pubDate>Wed, 28 Sep 2022 04:06:48 +0000</pubDate>
      <link>https://forem.com/dolbyio/learn-babylonjs-to-create-your-own-3d-metaverse-environments-3o53</link>
      <guid>https://forem.com/dolbyio/learn-babylonjs-to-create-your-own-3d-metaverse-environments-3o53</guid>
      <description>&lt;p&gt;&lt;a href="https://dolby.io" rel="noopener noreferrer"&gt;Dolby.io&lt;/a&gt; recently sponsored a workshop at CascadiaJS, the Northwest’s premier JavaScript developer conference. That workshop, Learn BabylonJS to Create Your Own 3D Metaverse Environments was quite a popular workshop at the conference. The workshop sold-out early, and was standing room only. And for good reasons. there is a lot of interest in developing for the Metaverse.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was all the excitement about BabylonJS and the Metaverse?
&lt;/h2&gt;

&lt;p&gt;There's been a lot of buzz about building Metaverse experiences in Unreal Engine and Unity, and yes Dolby.io has you covered with plugins for both platforms.  The new excitement for developers is the possibility of building Metaverse experiences using JavaScript.  Our workshop focus at &lt;a href="https://2022.cascadiajs.com" rel="noopener noreferrer"&gt;CascadiaJS 2022&lt;/a&gt; was to help developers get started with a fully-featured JavaScript game engine called &lt;a href="https://www.babylonjs.com" rel="noopener noreferrer"&gt;Babylon.js&lt;/a&gt;, then level up the experience with Real-Time Streaming and Spatial Audio.&lt;/p&gt;

&lt;p&gt;Here's what developers had to say about the content we presented and their experience at the Dolby.io BabylonJS Metaverse workshop.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/2EU69qU9DIg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  No More Fear of Missing Out!
&lt;/h2&gt;

&lt;p&gt;No worries if you could not attend in-person.&lt;br&gt;
You can now learn how to get started with BabylonJS with our self paced workshop available at &lt;a href="https://github.com/dolbyio-samples/workshop-babylonjs-metaverse" rel="noopener noreferrer"&gt;DolbyIO Samples on our GitHub&lt;/a&gt;.&lt;br&gt;
You'll learn the basics of 3D development, plus learn how to bring real-time streaming into your own Metaverse experiences. We've developed a full repo of code samples and tutorials to help you get started with BabylonJS and Dolby.io technologies. &lt;/p&gt;

&lt;h2&gt;
  
  
  Stay connected to to this project!
&lt;/h2&gt;

&lt;p&gt;Don’t forget to star and bookmark this repo as we are going to be producing and releasing a companion video series to showcase the possibilities of creating amazing experiences for the Metaverse. Make sure you take a moment to subscribe our new YouTube channel for video tutorials on the Metaverse, real-time streaming, spatial audio and a lot more. &lt;/p&gt;

&lt;p&gt;Metaverse Workshop Repo:&lt;br&gt;
&lt;a href="https://github.com/dolbyio-samples/workshop-babylonjs-metaverse" rel="noopener noreferrer"&gt;https://github.com/dolbyio-samples/workshop-babylonjs-metaverse&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unreal Plugins for Live Streaming:&lt;br&gt;
Streaming Player – Play a live steam within Unreal Engine.&lt;br&gt;
&lt;a href="https://docs.dolby.io/streaming-apis/docs/player-plugin" rel="noopener noreferrer"&gt;https://docs.dolby.io/streaming-apis/docs/player-plugin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stream Broadcaster – broadcast a virtual camera with Dolby.io&lt;br&gt;
&lt;a href="https://docs.dolby.io/streaming-apis/docs/publisher-plugin" rel="noopener noreferrer"&gt;https://docs.dolby.io/streaming-apis/docs/publisher-plugin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unity Plugin for real-time communications:&lt;br&gt;
&lt;a href="https://github.com/DolbyIO/comms-sdk-dotnet" rel="noopener noreferrer"&gt;https://github.com/DolbyIO/comms-sdk-dotnet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Unity Plugin Docs:&lt;br&gt;
&lt;a href="https://dolbyio.github.io/comms-sdk-dotnet/documentation/unity.html" rel="noopener noreferrer"&gt;https://dolbyio.github.io/comms-sdk-dotnet/documentation/unity.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Subscribe to our YouTube Channel:&lt;br&gt;
&lt;a href="https://www.youtube.com/c/DolbyIO" rel="noopener noreferrer"&gt;https://www.youtube.com/c/DolbyIO&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>babylonjs</category>
      <category>programming</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Where did the plist go?</title>
      <dc:creator>Dan Zeitman</dc:creator>
      <pubDate>Wed, 13 Jul 2022 19:04:47 +0000</pubDate>
      <link>https://forem.com/dolbyio/where-did-the-plist-go-1md2</link>
      <guid>https://forem.com/dolbyio/where-did-the-plist-go-1md2</guid>
      <description>&lt;p&gt;If you’ve recently fired up XCode 13 and created a new SwiftUI app, you’ll soon realize that Info.plist has gone missing. For some swift veterans, that might bring up flashbacks of the missing AppDelegate that surfaced in a prior XCode release.&lt;/p&gt;

&lt;p&gt;No worries, it's a &lt;strong&gt;&lt;em&gt;feature&lt;/em&gt;&lt;/strong&gt; not a bug. &lt;/p&gt;

&lt;p&gt;According to the XCode 13 &lt;a href="https://developer.apple.com/documentation/xcode-release-notes/xcode-13-release-notes" rel="noopener noreferrer"&gt;release notes&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Projects created from several templates no longer require configuration files such as entitlements and Info.plist files. Configure common fields in the target’s Info tab, and build settings in the project editor. These files are added to the project when additional fields are used. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While it's still &lt;a href="https://useyourloaf.com/blog/xcode-13-missing-info.plist/" rel="noopener noreferrer"&gt;possible&lt;/a&gt; to include the plist, moving forward, most Swift developers will find that it's much easier to work with. There is a new info section within the build settings; So just select the project's info tab and add the appropriate keys as you had previously had done with the plist.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fojpvt4gv92uqxwf1tckc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fojpvt4gv92uqxwf1tckc.png" alt=" " width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The info section and plist is generally used to provision additonal capibility for your application.  Most common usage is setting the &lt;strong&gt;privacy&lt;/strong&gt; messages a user sees when accessing the camera or microphone for the first time.  So when you're building your next Dolby.io &lt;a href="https://docs.dolby.io/communications-apis/docs/getting-started-with-ios?utm_medium=referral&amp;amp;utm_campaign=devrel&amp;amp;utm_source=devto&amp;amp;utm_term=plist" rel="noopener noreferrer"&gt;Communications&lt;/a&gt; or &lt;a href="https://docs.millicast.com/docs/ios?utm_medium=referral&amp;amp;utm_campaign=devrel&amp;amp;utm_source=devto&amp;amp;utm_term=plist" rel="noopener noreferrer"&gt;Streaming&lt;/a&gt; app with Swift, you'll need remember to set the Camera and Microphone Privacy keys in the info section of the build settings, exactly the same way you've been doing it with the plist for years.&lt;/p&gt;

&lt;p&gt;It's important to be crystal clear about your intended use of those features, and failing to do so may end up as delays or rejections of your app during Apple's review process. &lt;/p&gt;

&lt;p&gt;Once again these changes are part of Apple's &lt;strong&gt;&lt;em&gt;Less is More&lt;/em&gt;&lt;/strong&gt; design philosophy makes the developer experince better with fewer files to manage. &lt;/p&gt;

&lt;p&gt;With each new release of Xcode, It's easy to forget that the tools also evolve, and  it's highly recommended and best practice to review the latest release notes for such nuggets of information.&lt;/p&gt;

</description>
      <category>xcode</category>
      <category>swift</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
