<?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: Tejasvi Shinde</title>
    <description>The latest articles on DEV Community by Tejasvi Shinde (@tejasvi2).</description>
    <link>https://dev.to/tejasvi2</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%2F529366%2Fa494fca6-bc21-4416-a976-dace6fa25ce5.jpeg</url>
      <title>DEV Community: Tejasvi Shinde</title>
      <link>https://dev.to/tejasvi2</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tejasvi2"/>
    <language>en</language>
    <item>
      <title>Why Everyone Is Moving to Vite in 2025</title>
      <dc:creator>Tejasvi Shinde</dc:creator>
      <pubDate>Wed, 09 Jul 2025 15:56:55 +0000</pubDate>
      <link>https://dev.to/tejasvi2/why-everyone-is-moving-to-vite-in-2025-2epd</link>
      <guid>https://dev.to/tejasvi2/why-everyone-is-moving-to-vite-in-2025-2epd</guid>
      <description>&lt;p&gt;I’ll be honest, for the longest time, I stuck with Webpack and the usual Angular CLI defaults. I didn’t get the Vite hype. Then I spun up a Vite project for a tiny component library I was building, and it blew me away.&lt;/p&gt;

&lt;p&gt;Here’s why developers (myself included) are moving to Vite like it’s the default now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. It’s super Fast&lt;/strong&gt;&lt;br&gt;
No exaggeration. Vite’s cold starts are nearly instant, even on large projects. HMR updates in milliseconds, not seconds.&lt;/p&gt;

&lt;p&gt;I moved an old project from Webpack to Vite, and this was the difference:&lt;/p&gt;

&lt;p&gt;Initial load time with Webpack &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%2F74wtf1232ohdxncu1ose.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%2F74wtf1232ohdxncu1ose.png" alt="Webpack load time" width="800" height="95"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Initial load time with Vite&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%2Foopsc4vey4v9tyn6fh4z.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%2Foopsc4vey4v9tyn6fh4z.png" alt="Vite load time" width="800" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s powered by &lt;a href="https://esbuild.github.io/" rel="noopener noreferrer"&gt;esbuild&lt;/a&gt;, which is built in Go, so it’s crazy fast compared to Babel-based tooling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Setup is Actually... Fun?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No 400-line &lt;code&gt;webpack.config.js&lt;/code&gt;, no cryptic loaders. Just this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm create vite@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then pick your framework (&lt;em&gt;React, Vue, Svelte, even Lit&lt;/em&gt; or &lt;em&gt;vanilla&lt;/em&gt;), and you’re rolling.&lt;/p&gt;

&lt;p&gt;Here’s a &lt;code&gt;vite.config.ts&lt;/code&gt; I used in a recent React + Tailwind project:&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%2F3hlzhbx5pnoor1fwv0l6.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%2F3hlzhbx5pnoor1fwv0l6.png" alt="Dev config img" width="657" height="317"&gt;&lt;/a&gt;&lt;br&gt;
Simple. Clean. Predictable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. It Plays Nice with Everything&lt;/strong&gt;&lt;br&gt;
Whether it’s &lt;em&gt;TypeScript, Tailwind, PWA, SSR,&lt;/em&gt; or even &lt;em&gt;monorepos with NX&lt;/em&gt;, Vite has solid plugin support.&lt;/p&gt;

&lt;p&gt;You don’t have to do the dance of "is this plugin still maintained?" like we sometimes do with Webpack.&lt;/p&gt;

&lt;p&gt;For example, adding Tailwind is just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then drop it in your &lt;code&gt;main.css&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@tailwind base;
@tailwind components;
@tailwind utilities;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it. No gotchas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Even Angular Is Joining the Party&lt;/strong&gt;&lt;br&gt;
This one excites me: &lt;em&gt;Angular now supports Vite&lt;/em&gt;. The Angular team is pushing Vite adoption as an optional, faster build path.&lt;/p&gt;

&lt;p&gt;If Angular, known for its opinionated tooling, is opening up to Vite, that says something.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;br&gt;
If you haven’t touched Vite yet, try it on a weekend project or a personal component library. It’ll make you rethink what “dev server speed” should feel like.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;Vite&lt;/code&gt; for modern web apps, fast development cycles, or greenfield projects.&lt;br&gt;
Stick with &lt;code&gt;Webpack&lt;/code&gt; when you're dealing with legacy infrastructure or highly custom setups.&lt;/p&gt;

&lt;p&gt;It’s not perfect, but in 2025, Vite feels like the new default, and honestly… it deserves it.&lt;/p&gt;

</description>
      <category>webpack</category>
      <category>vite</category>
      <category>javascript</category>
      <category>react</category>
    </item>
    <item>
      <title>RTSP stream to Web Browser using FFMPEG</title>
      <dc:creator>Tejasvi Shinde</dc:creator>
      <pubDate>Fri, 22 Jan 2021 05:08:15 +0000</pubDate>
      <link>https://dev.to/tejasvi2/rtsp-stream-to-web-browser-using-ffmpeg-1cb</link>
      <guid>https://dev.to/tejasvi2/rtsp-stream-to-web-browser-using-ffmpeg-1cb</guid>
      <description>&lt;p&gt;If you need to stream your video from the webcam to your browser webpage.&lt;br&gt;
To achieve this I have tried a few different ways but none of them is as good as converting &lt;strong&gt;&lt;em&gt;RTSP&lt;/em&gt;&lt;/strong&gt; to &lt;strong&gt;&lt;em&gt;HLS&lt;/em&gt;&lt;/strong&gt; and then pass to &lt;strong&gt;&lt;em&gt;Browser&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  We will follow the below steps
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;RTSP stream&lt;/li&gt;
&lt;li&gt;Understanding FFMPEG&lt;/li&gt;
&lt;li&gt;Converting RTSP TO HLS&lt;/li&gt;
&lt;li&gt;Passing HLS to a web browser&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  1.RTSP Stream
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;What is RTSP?&lt;/em&gt;&lt;br&gt;
RTSP, also known as Real-Time Streaming Protocol, is a lesser-known protocol for streaming video online. This protocol was designed to control the streaming servers used in entertainment and communications systems. &lt;/p&gt;

&lt;p&gt;When the RTSP controls the server to client connection, video-on-demand streams are used; when it controls the client to server connection, RTSP utilizes voice recording streams. &lt;/p&gt;

&lt;p&gt;RTSP commonly is used for Internet Protocol (IP) camera streaming, such as those coming from CCTV or IP cameras.&lt;br&gt;
Rather than forcing your viewers to download an entire video before watching it, the RTSP stream allows them to watch your content before the download is complete.&lt;/p&gt;

&lt;p&gt;You cannot directly stream RTSP over HTTP. Because of this, there is no easy, straightforward way to stream RTSP in a web browser, as RTSP is designed more for streaming video on private networks such as security systems within a business. However, you can stream RTSP using additional software that’s embedded onto your website.&lt;br&gt;
Furthermore, to achieve this I have used &lt;strong&gt;FFMPEG&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Understanding FFMPEG
&lt;/h4&gt;

&lt;p&gt;FFmpeg is a command-line tool that converts audio or video formats. It can also capture and encode in real-time from various hardware and software sources such as a TV capture card.&lt;br&gt;
Basically, it is a wrapper that converts &lt;em&gt;RTSP&lt;/em&gt; to &lt;em&gt;HLS&lt;/em&gt;.&lt;br&gt;
(HLS stands for HTTP Live Streaming. In short, HLS is a media streaming protocol for delivering visual and audio media to viewers over the internet and supported by the web browser)&lt;/p&gt;

&lt;p&gt;Check this &lt;a href="https://ffmpeg.org/documentation.html" rel="noopener noreferrer"&gt;FFMPEG&lt;/a&gt; for more information &lt;/p&gt;

&lt;h4&gt;
  
  
  3. Converting RTSP TO HLS
&lt;/h4&gt;

&lt;p&gt;To Achieve this we have to use FFMPEG commands.&lt;br&gt;
Basically from node, I will run bash file which has those commands this will run in the background and when it receives RTSP stream It parallelly changes them to HLS. &lt;/p&gt;

&lt;h4&gt;
  
  
  4. Passing HLS to a web browser
&lt;/h4&gt;

&lt;p&gt;we are almost done because passing HLS to a web browser is easy.&lt;/p&gt;

&lt;p&gt;I hope you guys got a basic idea about this conversion.&lt;/p&gt;

&lt;p&gt;Remember to run this we need a server to run in the background it can be simple HTTP-SERVER or NGX-SERVER.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code Implementation
&lt;/h3&gt;

&lt;h6&gt;
  
  
  Index.html
&lt;/h6&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="nx"&gt;DOCTYPE&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;html&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;head&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Live&lt;/span&gt; &lt;span class="nx"&gt;Cam&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/title&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/head&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://cdn.jsdelivr.net/npm/hls.js@latest&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!--&lt;/span&gt; &lt;span class="nx"&gt;Use&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nx"&gt;you&lt;/span&gt; &lt;span class="nx"&gt;only&lt;/span&gt; &lt;span class="nx"&gt;support&lt;/span&gt; &lt;span class="nx"&gt;Safari&lt;/span&gt;&lt;span class="o"&gt;!!&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;player&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;video&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;video&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;autoplay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;true&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;controls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;controls&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt; &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://192.1xx.x.1xx:8080/playlist.m3u8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="nx"&gt;Your&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt; &lt;span class="nx"&gt;does&lt;/span&gt; &lt;span class="nx"&gt;not&lt;/span&gt; &lt;span class="nx"&gt;support&lt;/span&gt; &lt;span class="nx"&gt;HTML5&lt;/span&gt; &lt;span class="nx"&gt;streaming&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/video&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;video&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;video&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;autoplay&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;true&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;controls&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;controls&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/x-mpegURL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/video&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Hls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isSupported&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;video&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;video&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;hls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Hls&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="c1"&gt;// bind them together&lt;/span&gt;
      &lt;span class="nx"&gt;hls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attachMedia&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;video&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;hls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Hls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MEDIA_ATTACHED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;video and hls.js are now bound together !&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;hls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://192.1xx.x.1xx:8080/playlist.m3u8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;hls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Hls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Events&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MANIFEST_PARSED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/body&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/html&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In code you can see I have added the HLS CDN link you can use NPM Package too.&lt;br&gt;
You can see in this line code &lt;em&gt;hls.loadSource("&lt;a href="http://192.1xx.x.1xx:8080/playlist.m3u8%22" rel="noopener noreferrer"&gt;http://192.1xx.x.1xx:8080/playlist.m3u8"&lt;/a&gt;);&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My HTTP-SERVER is running on &lt;a href="http://192.1xx.x.1xx:8080" rel="noopener noreferrer"&gt;http://192.1xx.x.1xx:8080&lt;/a&gt; and &lt;em&gt;/playlist.m3u8&lt;/em&gt; I will come to this.&lt;/p&gt;

&lt;h6&gt;
  
  
  setup-ffmpeg.sh
&lt;/h6&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="cp"&gt;#!/bin/bash
&lt;/span&gt;&lt;span class="nx"&gt;VIDSOURCE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rtsp://192.1xx.x.xxx:5554&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;AUDIO_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-c:a aac -b:a 160000 -ac 2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;VIDEO_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-s 854x480 -c:v libx264 -b:v 800000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;OUTPUT_HLS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;-hls_time 10 -hls_list_size 10 -start_number 1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="nx"&gt;ffmpeg&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$VIDSOURCE&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;y&lt;/span&gt; &lt;span class="nx"&gt;$AUDIO_OPTS&lt;/span&gt; &lt;span class="nx"&gt;$VIDEO_OPTS&lt;/span&gt; &lt;span class="nx"&gt;$OUTPUT_HLS&lt;/span&gt; &lt;span class="nx"&gt;playlist&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;m3u8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the bash file, I have provided &lt;em&gt;VIDSOURCE="rtsp://192.1xx.x.xxx:5554"&lt;/em&gt; RTSP link.&lt;br&gt;
You can see it at the end playlist.m3u8. This will create a file playlist.m3u8 and start dumping stream one after another so at the end we will refer to this file.   &lt;/p&gt;

&lt;p&gt;When you run the bash file you can see the changes in your folder like this&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%2Fi%2Fku7kdyi1zyqnf8fayp0d.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%2Fi%2Fku7kdyi1zyqnf8fayp0d.png" alt="Alt Text" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;FFMPEG provides a lot of useful commands. You can try a different set of commands and use them as per your requirements.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>Alexa skill with Twilio voice Integration</title>
      <dc:creator>Tejasvi Shinde</dc:creator>
      <pubDate>Tue, 22 Dec 2020 15:27:56 +0000</pubDate>
      <link>https://dev.to/tejasvi2/alexa-skill-with-twilio-voice-integration-4l3h</link>
      <guid>https://dev.to/tejasvi2/alexa-skill-with-twilio-voice-integration-4l3h</guid>
      <description>&lt;p&gt;Imagine you give a command to your Amazon Echo/Alexa to make a phone call🤙🏻&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pre-requisites&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twilio &lt;/li&gt;
&lt;li&gt;Knowledge of Alexa Custom Skills&lt;/li&gt;
&lt;li&gt;AWS Lambda&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;One such technology is Amazon Alexa, it provides the programming blocks to implement voice-based interactions with a customer through the Amazon Echo speaker. While Twilio provides the voice communication layer between the customer and your backend contact center infrastructure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;1) What is Twilio&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Twilio is a developer platform for communications. Software teams use Twilio APIs to add capabilities like voice, video, and messaging to their applications. This enables businesses to provide the right communications experience for their customers.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Requirements&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twilio account&lt;/li&gt;
&lt;li&gt;Twilio AccountSid and Auth Token&lt;/li&gt;
&lt;li&gt;Twilio Number&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Reference links&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.twilio.com/try-twilio" rel="noopener noreferrer"&gt;Twilio sign-up&lt;/a&gt; &lt;br&gt;
&lt;a href="https://www.twilio.com/voice/api" rel="noopener noreferrer"&gt;Twilio voice API&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You need to create a Twilio account. once you have one, you can get a free phone number for your country. Make sure the phone number you get at Twilio supports voice.&lt;br&gt;
In your Twilio account settings, you need to find out the account session Id and authentication token. You will need them in the next stage when creating your Lambda function.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;TwilML&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
TwiML (the Twilio Markup Language) is a set of instructions you can use to tell Twilio what to do when you receive an incoming call, SMS, or fax.&lt;br&gt;
How TwiML works&lt;br&gt;
When someone makes a call to one of your Twilio numbers, Twilio looks up the URL associated with that phone number and sends it a request. Twilio then reads the TwiML instructions hosted at that URL to determine what to do, whether it's recording the call, playing a message for the caller, or prompting the caller to press digits on their keypad.&lt;br&gt;
At its core, TwiML is an XML document with special tags defined by Twilio to help you build your Programmable Voice application.&lt;/p&gt;

&lt;p&gt;to learn more refer &lt;a href="https://www.twilio.com/docs/glossary/what-is-twilio-markup-language-twiml" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2) Alexa custom skill kit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;you just need to follow few steps to create a custom skill &lt;a href="https://developer.amazon.com/en-US/docs/alexa/custom-skills/steps-to-build-a-custom-skill.html" rel="noopener noreferrer"&gt;follow this&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3) Aws lambda&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1.If you don't already have one, get an Amazon AWS account (free).&lt;br&gt;
2.From the AWS Console (&lt;a href="https://aws.amazon.com" rel="noopener noreferrer"&gt;https://aws.amazon.com&lt;/a&gt;), you need to create a Lambda function which will execute the code that will send the request to Twilio voice outbound call.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Creating a lambda function steps&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;1.Create a new Execution Role for the function by selecting Create New Role-&amp;gt;Basic Execution Role. In IAM console, create new IAM Role, enter name and clock Allow button.&lt;br&gt;
2.Go to AWS Services and select Lambda&lt;br&gt;
3.Click Lambda and follow the process for adding Name. Choose the Node.js as the Runtime, Role and create the function. The Lambda function that we have created is shown in the screenshot below&lt;br&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%2Fi%2Fsbe7tkljdfo85a9crk5i.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%2Fi%2Fsbe7tkljdfo85a9crk5i.png" alt="Alt Text" width="567" height="120"&gt;&lt;/a&gt;&lt;br&gt;
4.Select 'Event Sources' tab and add Alexa Skill Kit event source&lt;br&gt;
5.Now, save the Lambda function. &lt;/p&gt;

&lt;p&gt;If you stuck in between please check &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html" rel="noopener noreferrer"&gt;this&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It helped me because I am also not completely familiar with AWS so any suggestions or help much appreciated.&lt;/p&gt;

&lt;p&gt;also in the lambda function&lt;br&gt;
Create the payload we want to send, including the Twiml location, from which Twilio will fetch instructions when the call connects&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%2Fi%2Felnr7m2azrefvd57xm1t.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%2Fi%2Felnr7m2azrefvd57xm1t.png" alt="Alt Text" width="800" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I hope you found this post helpful.&lt;/p&gt;

</description>
      <category>node</category>
      <category>twilio</category>
      <category>aws</category>
    </item>
    <item>
      <title>Introduction to Storybook JS</title>
      <dc:creator>Tejasvi Shinde</dc:creator>
      <pubDate>Thu, 10 Dec 2020 06:40:56 +0000</pubDate>
      <link>https://dev.to/tejasvi2/introduction-to-storybook-36lp</link>
      <guid>https://dev.to/tejasvi2/introduction-to-storybook-36lp</guid>
      <description>&lt;p&gt;I have recently come across a cool UI tool i.e &lt;strong&gt;&lt;em&gt;Storybook&lt;/em&gt;&lt;/strong&gt;. &lt;br&gt;
Storybook is really efficient and helps in faster UI development.&lt;/p&gt;

&lt;p&gt;Before jumping on anything lets get clear on&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;What is a storybook?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Storybook is an open-source tool for developing UI components in isolation for React, Vue, Angular, and more. It makes building stunning UIs organized and efficient.&lt;br&gt;
You can develop entire UIs without needing to start up a complex dev stack, force certain data into your database, or navigate around your application&lt;/p&gt;
&lt;/blockquote&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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--0REcx4xZ--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_880%2Fhttps%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fh0tkhbillluy2661maka.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%2Fres.cloudinary.com%2Fpracticaldev%2Fimage%2Ffetch%2Fs--0REcx4xZ--%2Fc_limit%252Cf_auto%252Cfl_progressive%252Cq_auto%252Cw_880%2Fhttps%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fh0tkhbillluy2661maka.png" alt="Alt text" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With Storybook, you create stories for your components. Each story shows the behavior for a single component with specific states set.&lt;/p&gt;

&lt;p&gt;Storybook helps you document components for reuse and automatically visually test your components to prevent bugs. Extend Storybook with an ecosystem of addons that help you do things like fine-tune responsive layouts or verify accessibility.&lt;/p&gt;

&lt;p&gt;Storybook integrates with the most popular JavaScript UI frameworks and (experimentally) supports server-rendered component frameworks such as Ruby on Rails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Learning&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you want to build a simple application in your framework with the storybook, &lt;a href="https://www.learnstorybook.com/" rel="noopener noreferrer"&gt;LearnStorybook&lt;/a&gt;  will help you!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Few more resources&lt;/em&gt;&lt;br&gt;
&lt;a href="https://medium.com/javascript-in-plain-english/storybook-for-angular-components-with-markdown-support-72950cc3d9ee" rel="noopener noreferrer"&gt;Implementation with Angular&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.digitalocean.com/community/tutorials/how-to-build-a-ui-component-with-react-and-storybook" rel="noopener noreferrer"&gt;Implementation with React&lt;/a&gt;&lt;br&gt;
&lt;a href="https://labs.thisdot.co/blog/how-to-set-up-storybook-in-vuejs" rel="noopener noreferrer"&gt;Implementation with Vue&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>javascript</category>
      <category>react</category>
      <category>vue</category>
    </item>
    <item>
      <title>JavaScript Set</title>
      <dc:creator>Tejasvi Shinde</dc:creator>
      <pubDate>Tue, 08 Dec 2020 06:57:27 +0000</pubDate>
      <link>https://dev.to/tejasvi2/javascript-set-39a</link>
      <guid>https://dev.to/tejasvi2/javascript-set-39a</guid>
      <description>&lt;p&gt;Javascript set object does not allow duplicate values to be pushed it contains only unique values.&lt;/p&gt;

&lt;p&gt;First, we declare a variable set using const in which we assign a set object with a new keyword.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const animals = new Set();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we add animals to set variable using set object add() method.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;animals.add('🐷');
animals.add('🐴');
console.log(animals.size); // 2
animals.add('🐴');
console.log(animals.size); // 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Javascript set only store unique values either it’s for string or number or object. So, the set will neglect the 🐴 add when he found out the same value again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strings are a valid iterable so they can also be passed-in to initialize a set&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;console.log('Happy Coding'.length); // 13
let sentence = new Set('Happy Coding'); //12
console.log(sentence.size);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;Note&lt;/em&gt;&lt;/strong&gt;: Set has a size property, not a length property.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>angular</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
