<?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: Kun Wu</title>
    <description>The latest articles on DEV Community by Kun Wu (@wkkkkk).</description>
    <link>https://dev.to/wkkkkk</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%2F1145469%2Ff1bd9be8-2266-484b-a0f8-383bb260afc2.jpeg</url>
      <title>DEV Community: Kun Wu</title>
      <link>https://dev.to/wkkkkk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wkkkkk"/>
    <language>en</language>
    <item>
      <title>Sever-Guided Ad Insertion Made Easy.</title>
      <dc:creator>Kun Wu</dc:creator>
      <pubDate>Tue, 05 Nov 2024 14:31:04 +0000</pubDate>
      <link>https://dev.to/video/sever-guided-ad-insertion-made-easy-3626</link>
      <guid>https://dev.to/video/sever-guided-ad-insertion-made-easy-3626</guid>
      <description>&lt;p&gt;In today’s streaming landscape, delivering personalized, seamless ad experiences is key, and Server-Guided Ad Insertion (SGAI) is leading the charge. Unlike traditional Client-Side Ad Insertion (CSAI), where the user’s device manages ads, SGAI centralizes control at the server level. It decides the timing, format, and content of ads based on user data, ensuring ad relevance without relying on the client’s system. By connecting to ad decision servers (ADS), SGAI generates tailored ad breaks in real-time, keeping viewers engaged with ads that suit their preferences and demographics. &lt;/p&gt;




&lt;h2&gt;
  
  
  How SGAI Works
&lt;/h2&gt;

&lt;p&gt;Servers can schedule interstitials by placing EXT-X-DATERANGE tags in Media Playlists, allowing flexibility in ad placements. These interstitials, which must be VOD assets, can be inserted at any point in a primary asset, whether VOD or live, including Low-Latency HLS streams.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#EXTM3U
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:11
#EXT-X-PROGRAM-DATE-TIME:2024-10-30T12:52:27.853+0100
#EXTINF:4,
fileSequence11.ts
#EXT-X-PROGRAM-DATE-TIME:2024-10-30T12:52:31.853+0100
#EXTINF:4,
fileSequence12.ts
#EXT-X-PROGRAM-DATE-TIME:2024-10-30T12:52:35.853+0100
#EXTINF:4,
fileSequence13.ts
#EXT-X-PROGRAM-DATE-TIME:2024-10-30T12:52:39.853+0100
#EXTINF:4,
fileSequence14.ts
#EXT-X-PROGRAM-DATE-TIME:2024-10-30T12:52:43.853+0100
#EXTINF:4,
fileSequence15.ts
#EXT-X-DATERANGE:ID="ad_slot0",CLASS="com.apple.has.interstitial",START-DATE="2024-10-30T12:52:47.207+01:00",DURATION=10,X-ASSET-LIST="http://localhost:3333/interstitials.m3u8?_HLS_interstitial_id=ad_slot0",X-RESTRICT="SKIP,JUMP",X-RESUME-OFFSET=10,X-SNAP="IN,OUT"
#EXT-X-PROGRAM-DATE-TIME:2024-10-30T12:52:47.853+0100
#EXTINF:4,
fileSequence16.ts
#EXT-X-PROGRAM-DATE-TIME:2024-10-30T12:52:51.853+0100
#EXTINF:4,
fileSequence17.ts
#EXT-X-PROGRAM-DATE-TIME:2024-10-30T12:52:55.853+0100
#EXTINF:4,
fileSequence18.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this playlist, an EXT-X-DATERANGE tag schedules a 10-second ad break to play at the specified time point. The player loads the resource specified by the URL after buffering the primary asset to the scheduled interstitial playback time, and then resumes playback of the primary asset at the live edge. Seeking and scanning forward will be disabled during interstitial playback. It is also possible to include custom attributes to be processed by the client.&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="nl"&gt;"URI"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3333/interstitials.m3u8?_HLS_interstitial_id=ad_slot0&amp;amp;_HLS_primary_id=40FE1829-438E-49B0-8B3A-A285DD4A8154&amp;amp;_HLS_start_offset=0&amp;amp;_HLS_follow_id=361434bf-05e7-4e17-83ca-690452e1cb33"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="nl"&gt;"DURATION"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&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;"URI"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3333/interstitials.m3u8?_HLS_interstitial_id=ad_slot0&amp;amp;_HLS_primary_id=40FE1829-438E-49B0-8B3A-A285DD4A8154&amp;amp;_HLS_start_offset=5&amp;amp;_HLS_follow_id=eb805a34-1d61-4217-9632-deab8790c30d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
         &lt;/span&gt;&lt;span class="nl"&gt;"DURATION"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&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;p&gt;In this example, the returned JSON object from the X-ASSET-LIST URL includes two 5-second ads. Their URI includes query parameters to identify ad slots, individual ads, and user sessions, making late binding to ad inventory possible and ad personalization easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compared to SSAI and CSAI
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;SGAI vs. SSAI: Both SGAI and SSAI stitch ads server-side, but SGAI offers finer control over targeting and adapts dynamically to real-time user data. While SSAI lacks some targeting precision, SGAI’s server-level adjustments allow for improved ad personalization.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SGAI vs. CSAI: CSAI places ads on the client side, allowing for tracking data but also making ads prone to blockers and playback glitches. SGAI, on the other hand, provides a seamless experience and improved protection from ad blockers, enhancing both viewer engagement and revenue.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Our SGAI Proxy Tool
&lt;/h2&gt;

&lt;p&gt;As a Proof of Concept, Eyevinn's SGAI Ad Proxy serves as a practical tool that facilitates the integration of ads into HLS content. This lightweight HTTP proxy server intercepts the video stream and inserts ads at defined time points.&lt;/p&gt;

&lt;h2&gt;
  
  
  Steps to Use the Ad Proxy Tool
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Set Up the Environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create an HLS Stream: Use &lt;code&gt;ffmpeg&lt;/code&gt; to set up a basic HLS streaming server.&lt;/li&gt;
&lt;li&gt;Ad Server: Ensure access to a compatible ad server serving VAST-compliant ads.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choose Ad Insertion Mode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select either static mode (fixed intervals) or dynamic mode (on-demand insertion).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run the Proxy Server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To Insert Ads Dynamically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send a GET request to the proxy.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Access the new Stream:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a compatible video player (e.g., AVPlayer) with the proxy URL.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;As the streaming landscape evolves, tools like the SGAI Ad Proxy are pivotal in enhancing the viewer experience and driving ad revenue. For more information and setup details, visit the tool’s &lt;a href="https://github.com/Eyevinn/sgai-ad-proxy/tree/main" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; repository.&lt;/p&gt;

</description>
      <category>hls</category>
      <category>opensource</category>
      <category>sgai</category>
      <category>streaming</category>
    </item>
    <item>
      <title>Stream from OBS to Twitch and Preview With SRT-WHEP</title>
      <dc:creator>Kun Wu</dc:creator>
      <pubDate>Mon, 28 Aug 2023 10:30:37 +0000</pubDate>
      <link>https://dev.to/video/stream-from-obs-to-twitch-and-preview-with-srt-whep-2i5o</link>
      <guid>https://dev.to/video/stream-from-obs-to-twitch-and-preview-with-srt-whep-2i5o</guid>
      <description>&lt;p&gt;This guide will take you through the step-by-step process of setting up OBS (Open Broadcaster Software) to stream to Twitch and preview the output in browser using our SRT-WHEP &lt;a href="https://github.com/Eyevinn/srt-whep"&gt;tool&lt;/a&gt; and Web Player.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2uEN6yj---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/argtnwu71ht44302nhme.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2uEN6yj---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/argtnwu71ht44302nhme.png" alt="Preview" width="800" height="358"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Installed OBS:&lt;/strong&gt; Download and install OBS from the official website: &lt;a href="https://obsproject.com/"&gt;OBS Project&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;p&gt;1.&lt;strong&gt;Twitch Account Setup:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you don't have a Twitch account, create one by visiting: &lt;a href="https://www.twitch.tv/signup"&gt;Twitch Signup&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Log in to your Twitch account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2.&lt;strong&gt;Install and Run SRT-WHEP:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need to run the SRT-WHEP application on your computer. You can either build it from source or use the Docker image (for Ubuntu). Detailed building instructions can be found in the &lt;a href="https://github.com/Eyevinn/srt-whep#install"&gt;GitHub repository&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;To run it in &lt;code&gt;listener&lt;/code&gt; mode and wait on port 1234, execute the following commands:

&lt;ul&gt;
&lt;li&gt;If building from source: &lt;code&gt;srt-whep -i 127.0.0.1:1234 -o 127.0.0.1:8888 -p 8000 -s listener | bunyan&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;If using Docker image: &lt;code&gt;docker run --rm --network host eyevinntechnology/srt-whep -i 127.0.0.1:1234 -o 127.0.0.1:8888 -p 8000 -s listener&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;This will forward the SRT stream to port 8888.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3.&lt;strong&gt;Create Input Stream with OBS:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Launch OBS on your computer.&lt;/li&gt;
&lt;li&gt;In OBS, go to the "Sources" tab and add a new source (e.g., macOS Screen Capture).&lt;/li&gt;
&lt;li&gt;To connect to SRT-WHEP, navigate to the "Settings" menu in OBS and select the "Stream" tab.&lt;/li&gt;
&lt;li&gt;Choose "Custom" as your streaming service.&lt;/li&gt;
&lt;li&gt;In the "Server" field, enter the input SRT URL: &lt;code&gt;srt://127.0.0.1:1234?mode=caller&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Start streaming by clicking the "Start Streaming" button. OBS will begin sending the stream to SRT-WHEP as the caller.&lt;/li&gt;
&lt;li&gt;You'll see in the SRT-WHEP console that the stream is received and ready for playback.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4.&lt;strong&gt;Stream to Twitch using SRT-RTMP Tool:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twitch accepts RTMP streams directly but not SRT stream.&lt;/li&gt;
&lt;li&gt;We have a &lt;a href="https://github.com/Eyevinn/srt-rtmp"&gt;tool&lt;/a&gt; that accepts SRT stream and outputs as RTMP stream.&lt;/li&gt;
&lt;li&gt;Once it's &lt;a href="https://github.com/Eyevinn/srt-rtmp"&gt;installed&lt;/a&gt;, set your &lt;strong&gt;Stream Key&lt;/strong&gt; as environmental variable &lt;code&gt;STREAM_KEY&lt;/code&gt; and then run the srt-rtmp application:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export STREAM_KEY=$YOUR_STREAM_KEY

srt-rtmp -i 127.0.0.1:1234 -s listener -o live.twitch.tv/app | bunyan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Here the &lt;strong&gt;Stream KEY&lt;/strong&gt; is the Stream Key from your Twitch account. Find it under Creator Dashboard -&amp;gt; Settings -&amp;gt; Stream -&amp;gt; Primary Stream Key.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;5.&lt;strong&gt;Preview the Stream in Browser:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To preview the stream, open the WHEP &lt;a href="https://webrtc.player.eyevinn.technology/?type=whep"&gt;Player&lt;/a&gt; in your web browser.&lt;/li&gt;
&lt;li&gt;Enter the URL: &lt;code&gt;http://localhost:8000/channel&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Click "Play," and within a few seconds, you should see the OBS stream in your browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;6.&lt;strong&gt;Viewing the Stream on Twitch:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to your Twitch account dashboard to view your live stream.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;7.&lt;strong&gt;Ending the Stream:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To stop previewing the stream, click the "Stop" button in the WHEP Web Player.&lt;/li&gt;
&lt;li&gt;When you're ready to end your stream, return to OBS and click the "Stop Streaming" button.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Congratulations! You've successfully configured OBS to stream to Twitch and previewed the output using your web browser. Enjoy your seamless streaming experience!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Seamlessly Streaming SRT Content in Web Browsers</title>
      <dc:creator>Kun Wu</dc:creator>
      <pubDate>Fri, 25 Aug 2023 11:25:01 +0000</pubDate>
      <link>https://dev.to/video/seamlessly-streaming-srt-content-in-web-browsers-4k6d</link>
      <guid>https://dev.to/video/seamlessly-streaming-srt-content-in-web-browsers-4k6d</guid>
      <description>&lt;p&gt;In the ever-evolving realm of content delivery, the convergence of SRT (Secure Reliable Transport) streaming and WebRTC (Web Real-Time Communication) marks a significant milestone. This fusion addresses the complex challenge of delivering content seamlessly across diverse devices and platforms, opening up new avenues for real-time interactions. Our exploration into bridging the gap between SRT streaming and browser playback is a testament to our commitment to solving these challenges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Background: The Nexus of SRT and WebRTC
&lt;/h2&gt;

&lt;p&gt;RT streaming redefines how video, audio, and data are transmitted across unpredictable networks. Operating on a single UDP socket, SRT seamlessly integrates reliability, ordering, and congestion control, crucial for real-time applications like video conferencing. Its automatic repeat request (ARQ) mechanism ensures content delivery integrity, particularly essential for maintaining seamless real-time interactions.&lt;/p&gt;

&lt;p&gt;In contrast, the conventional HLS (HTTP Live Streaming) protocol relies on TCP, which can introduce latency complexities and hinder real-time interactions. However, HLS excels in device compatibility, making it accessible on a wide range of devices without the need for specialized tools. Recognizing the strengths of SRT in terms of reliability and efficiency, coupled with HLS's device compatibility edge, our exploration led us to the world of WebRTC.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our Endeavor: Forging with Tools and Architecture
&lt;/h2&gt;

&lt;p&gt;Our mission to seamlessly integrate SRT streaming into web browsers relied on a foundation of carefully selected tools and architecture. GStreamer, a versatile open-source multimedia framework, served as the core of our project, enabling efficient processing and streaming of audio and video content. The modularity of GStreamer allowed us to seamlessly integrate various components, optimizing SRT streaming within web browsers.&lt;/p&gt;

&lt;p&gt;In terms of coding, we chose the Rust programming language. Renowned for its exceptional performance, memory safety, and cloud deployment suitability, Rust's unique attributes were pivotal in ensuring a robust and efficient solution. Rust's focus on preventing memory-related errors and its concurrency model were instrumental for real-time streaming and interactivity. Furthermore, its inherent cross-platform compatibility aligned seamlessly with our mission. The strategic combination of Rust and GStreamer produced a codebase capable of navigating various operating systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture of Seamless Playback
&lt;/h2&gt;

&lt;p&gt;Our application's architecture followed a streamlined workflow familiar in video and audio processing. An input stream, such as an SRT stream, underwent demuxing to reveal metadata and streams. Compressed stream data was decoded, and optional filters were applied to raw frames, such as resizing for optimization. Notably, video streams from MPEG-TS were transmitted directly to WebRTC peers without decoding, leveraging WebRTC's inherent support for H.264 (AVC) video codec. However, audio transcoding from AAC to OPUS was necessary to achieve compatibility with browser peers. This approach caters to use cases like confidence monitoring or content preview, where maintaining unaltered visual fidelity is essential.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tAVEefBA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dcy8tx4cjetc9skfyye5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tAVEefBA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dcy8tx4cjetc9skfyye5.png" alt="Simplified Overall Architecture" width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;For those interested in exploring our solution, two options are available: building from source code or using our Docker images (compatible with Ubuntu systems only). Here, we demonstrate the Docker option.&lt;/p&gt;

&lt;p&gt;Generate an SRT test source, for example, using our testsrc Docker container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run --rm -p 1234:1234/udp eyevinntechnology/testsrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An SRT stream (in listener mode) is then available at srt://127.0.0.1:1234. Then run the srt-whep application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run --rm --network host eyevinntechnology/srt-whep -i 127.0.0.1:1234 -o 127.0.0.1:8888 -p 8000 -s caller 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will connect to the SRT test stream in caller mode as the generated SRT stream is in listener mode.&lt;/p&gt;

&lt;p&gt;WHEP endpoint is available at &lt;a href="http://localhost:8000/channel"&gt;http://localhost:8000/channel&lt;/a&gt;. You can then play it for example using our WebRTC &lt;a href="https://webrtc.player.eyevinn.technology/?type=whep"&gt;Player&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KZrmbxaI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/om0wekuzq9eh47dcbs6x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KZrmbxaI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/om0wekuzq9eh47dcbs6x.png" alt="Play-out Demo" width="800" height="567"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges: Overcoming Hurdles
&lt;/h2&gt;

&lt;p&gt;Our journey to integrate SRT streaming with browser playback encountered several challenges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complexity in Tool Compatibility:&lt;/strong&gt; The intricacies of tool compatibility emerged as we engaged with tools like FFmpeg/FFplay and GStreamer. Despite the apparent simplicity of creating and playing an SRT stream, intricacies arose due to diverse toolsets across platforms. An SRT stream generated using FFmpeg, for instance, might not seamlessly harmonize with GStreamer without precise configuration. Even seemingly minor details, like a missing bitrate parameter, could disrupt streaming unexpectedly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser Support for WebRTC Codecs:&lt;/strong&gt; Navigating the nuances of browser support for WebRTC codecs presented another challenge. Widely-used video codecs like H.264 and H.265 thrived within tools like ffmpeg. However, aligning these codecs harmoniously with browser prerequisites was a complex endeavor. While the WebRTC standard embraced both H.264 and H.265 video streams, browser compatibility revolved around video profiles. Chrome exhibited versatility, supporting all profiles – baseline, main, and high – catering to diverse developer needs. On the contrary, Safari displayed exclusivity, embracing only the Baseline profile. This diversity necessitated strategic decisions, carefully balancing codec capabilities, WebRTC's potential, and browser preferences for a seamless union of streaming and browsing experiences.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-Platform Compatibility.&lt;/strong&gt; The pursuit of cross-platform compatibility emerged as a formidable challenge, encompassing devices, operating systems, and browser ecosystems. Seamlessly delivering content across this spectrum required a comprehensive understanding of browser intricacies and interactions with underlying operating systems. Variances in audio and video handling, network conditions, and user behaviors contributed to a complex tapestry.&lt;/p&gt;

&lt;p&gt;Realizing cross-platform compatibility demanded a harmonious fusion of technologies – from SRT streaming and WebRTC to GStreamer and Rust. Each component needed to align cohesively to ensure a uniform experience for users, irrespective of their chosen platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary: The Odyssey of Integration
&lt;/h2&gt;

&lt;p&gt;Our journey to seamlessly integrate SRT streaming with web browsers was rooted in a commitment to effective solutions and adaptability in the face of evolving technology. The convergence of WebRTC for seamless playback, browser-approved codecs, and cross-platform tools encapsulated our approach. This harmonization ensured that processes, testing, and accessibility converged harmoniously, underscoring our dedication to an interactive and universally accessible streaming solution.&lt;/p&gt;

</description>
      <category>srt</category>
      <category>webrtc</category>
      <category>rust</category>
      <category>gstreamer</category>
    </item>
  </channel>
</rss>
