<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://ossrs.io/lts/en-us/blog</id>
    <title>SRS Blog</title>
    <updated>2026-10-04T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://ossrs.io/lts/en-us/blog"/>
    <subtitle>SRS Blog</subtitle>
    <icon>https://ossrs.io/lts/en-us/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[SRS - Faster and Better, How AI Maintains SRS with Higher Quality Code than Humans]]></title>
        <id>https://ossrs.io/lts/en-us/blog/ai-autopilot</id>
        <link href="https://ossrs.io/lts/en-us/blog/ai-autopilot"/>
        <updated>2026-10-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[AI now develops SRS on its own for hours, and the code gets better, not worse. Most of]]></summary>
        <content type="html"><![CDATA[<p>AI now develops SRS on its own for hours, and the code gets better, not worse. Most of
what AI writes is tests, not features, and those tests are why we can trust it.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-bug-i-gave-up-on">A Bug I Gave Up On<a href="https://ossrs.io/lts/en-us/blog/ai-autopilot#a-bug-i-gave-up-on" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>About two years ago, I ported State Threads (ST), the coroutine library under SRS, to Windows with
Cygwin. Coroutine switching worked, but SRS crashed as soon as SRT was enabled. After two weeks I
found the cause: SRT uses C++ exceptions, and on Windows C++ exceptions are built on SEH, which
depends on registers that a coroutine switch must save and restore. I could not find enough
documentation about those registers, so I gave up.</p>
<p>Recently I asked AI about the same problem. In 6 minutes it wrote a test program and said it was
fixed. Then I let it run on its own with a new skill, <code>srs-autopilot</code>. Nine hours later it had
ported ST to native Windows, without Cygwin, and the C++ exception test passed.</p>
<p>This is the first time AI solved a problem that I could not. But speed is not the interesting
part.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-real-question-is-trust">The Real Question Is Trust<a href="https://ossrs.io/lts/en-us/blog/ai-autopilot#the-real-question-is-trust" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Running AI without supervision is easy. Claude has <code>--dangerously-skip-permissions</code> and Codex has
<code>--yolo</code>. You can ask AI to rewrite SRS in Go or Rust, and it might even run. But is it really
the same SRS? Can you maintain it? Would you put it in production?</p>
<p>Code written by people is usually safe to ship when the change is small, it is tested, and someone
reviews it. AI changes are never small, and nobody can review that much code line by line. The only
real guarantee left is very complete tests.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="most-of-what-ai-writes-is-tests">Most of What AI Writes Is Tests<a href="https://ossrs.io/lts/en-us/blog/ai-autopilot#most-of-what-ai-writes-is-tests" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Take a recent AI feature, RFC 4588 RTX for WebRTC, in commit
<a href="https://github.com/ossrs/srs/commit/3fc1810a46870d9bb5341986e16b26b70a91a58f" target="_blank" rel="noopener noreferrer" class="">3fc1810a4</a>
(<a href="https://github.com/ossrs/srs/pull/4746" target="_blank" rel="noopener noreferrer" class="">#4746</a>). It adds 8,928 lines:</p>
<table><thead><tr><th>Part</th><th style="text-align:right">Lines added</th><th style="text-align:right">Share</th></tr></thead><tbody><tr><td>Feature code in <code>trunk/src</code></td><td style="text-align:right">451</td><td style="text-align:right">5.1%</td></tr><tr><td>C++ unit tests in <code>trunk/src/utest</code></td><td style="text-align:right">2,245</td><td style="text-align:right">25.1%</td></tr><tr><td>Go integration tests in <code>trunk/3rdparty/srs-bench</code></td><td style="text-align:right">819</td><td style="text-align:right">9.2%</td></tr><tr><td>End-to-end test scripts in <code>skills/srs-develop/scripts</code></td><td style="text-align:right">1,823</td><td style="text-align:right">20.4%</td></tr><tr><td>WHIP and WHEP test tools in <code>tools/pion-whip</code> and <code>tools/pion-whep</code>, with their own unit tests</td><td style="text-align:right">3,423</td><td style="text-align:right">38.3%</td></tr><tr><td>Config, docs, and others</td><td style="text-align:right">167</td><td style="text-align:right">1.9%</td></tr></tbody></table>
<p>Tests and test tools are 8,310 lines, 93.1% of the change, to prove that 451 lines of feature code
are correct: about 18 lines of tests for every line of feature. No human maintainer
works like that. People write the feature and add a few tests if there is time. AI writes the
tests first and covers everything, because writing tests costs it almost nothing.</p>
<p>The same happened to ST: AI raised its test coverage from 45% to 96%, and added integration tests
for its key features.</p>
<p>These are not weak tests. When a person adds tests to existing code, the tests often repeat the
code's mistakes: the code is wrong and the test agrees with it. AI can check the code against the
documentation, the RFCs, and other implementations, so its tests actually find bugs. Many bugs in
SRS were found this way. Even a bug fix starts with a test that proves the bug exists; otherwise
you might fix a problem that is not there.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tests-must-be-local-and-fast">Tests Must Be Local and Fast<a href="https://ossrs.io/lts/en-us/blog/ai-autopilot#tests-must-be-local-and-fast" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>The tests that keep AI correct must run locally. A change tested by GitHub Actions takes at least
20 minutes per round. Locally, the whole suite takes about 1 minute, and AI sees every result,
so it finds and fixes its own mistakes quickly.</p>
<p>Unit tests are not enough, because features and APIs need real integration tests. SRS has
regression, black-box, and script tests that start a real SRS and drive it with tools like FFmpeg
and SRS Bench. A full run used to take 20 minutes; after we changed how ports are allocated, many
SRS instances can run in parallel and the full run takes 1 minute. When a tool is missing, AI writes
it. The WHIP and WHEP test tools in the RTX commit were written by AI.</p>
<p>With these tests, I can merge large AI changes with confidence. Without them, you can only hope the
model never makes a mistake.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="testable-code-is-maintainable-code">Testable Code Is Maintainable Code<a href="https://ossrs.io/lts/en-us/blog/ai-autopilot#testable-code-is-maintainable-code" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>To test everything, code must be mockable: depend on interfaces, not implementations. Every class in
SRS now implements an interface and depends only on other interfaces, so a test can replace any
dependency with a mock and fully control it.</p>
<p>This refactoring touched a huge amount of code. It is so boring that no person would volunteer for
it. AI did it. The result is a codebase that is easier to understand, test, and change, for AI
and for people.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="skills-turn-the-process-into-rules">Skills Turn the Process into Rules<a href="https://ossrs.io/lts/en-us/blog/ai-autopilot#skills-turn-the-process-into-rules" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Tests alone are not enough. AI also needs a defined workflow, and in SRS that workflow is written as
skills in the <a href="https://github.com/ossrs/srs/tree/develop/skills" target="_blank" rel="noopener noreferrer" class="">skills</a> directory:</p>
<ul>
<li class=""><code>srs-develop</code> is an index of the code and documents, so AI finds the right files without
searching the whole project and filling its context with unrelated text. It also requires
test-driven development: write the test first, then the code.</li>
<li class=""><code>srs-autopilot</code> runs a large task from a plan file. The main agent discusses the background and
goals with me, writes the plan, and then starts one subagent per task. Each subagent implements,
tests, and commits one task. The main agent stays small and only checks progress, so the loop can
run for hours.</li>
</ul>
<p>A skill is just a document. You could say all of it to AI every time, but a skill means you only
say it once.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-the-maintainer-still-does">What the Maintainer Still Does<a href="https://ossrs.io/lts/en-us/blog/ai-autopilot#what-the-maintainer-still-does" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>If AI can do the work correctly by itself, what is left for me?</p>
<ul>
<li class=""><strong>Read the plan.</strong> The plan explains the background and the steps, without much code. Reading
the RTX plan taught me what RTX is and how it works, and showed me whether AI understood the
problem. If something is missing or unclear, that is where bugs come from.</li>
<li class=""><strong>Make the choices.</strong> In theory RTX also works for audio, and the first plan included it. But
Chrome only uses RTX for video, so I chose video only. These choices come from experience, and
they are why the same model gives different results for different people.</li>
<li class=""><strong>Review asynchronously.</strong> I don't review most test code, because AI follows the test rules. I
always review core changes. AI commits each finished task and updates the plan; another agent
helps me review those commits on a separate review branch while the loop keeps running. I never
block the AI, and it never waits for me.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/ai-autopilot#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>AI is like an excavator. Once you have one, you no longer dig with a hoe. Before, I could only
maintain the Linux version of SRS. Now, in the same time, I can maintain a cross-platform server and
its clients, and the code is better tested than it ever was when I wrote it by hand.</p>]]></content>
        <category label="srs" term="srs"/>
        <category label="ai" term="ai"/>
        <category label="testing" term="testing"/>
        <category label="autopilot" term="autopilot"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[GSoC-2025]]></title>
        <id>https://ossrs.io/lts/en-us/blog/GSoC-2025</id>
        <link href="https://ossrs.io/lts/en-us/blog/GSoC-2025"/>
        <updated>2025-02-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Project Description]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="project-description">Project Description<a href="https://ossrs.io/lts/en-us/blog/GSoC-2025#project-description" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>SRS is a simple, high efficiency and realtime video server, supports RTMP/WebRTC/HLS/HTTP-FLV/SRT.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="information-for-students">Information for Students<a href="https://ossrs.io/lts/en-us/blog/GSoC-2025#information-for-students" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started">Getting Started<a href="https://ossrs.io/lts/en-us/blog/GSoC-2025#getting-started" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<ol>
<li class=""><strong>Get to know SRS.</strong> If you are a student interested in contributing to SRS, it is recommended to start by join to the SRS <a href="https://discord.gg/DfJFjpxmC7" target="_blank" rel="noopener noreferrer" class="">Discord</a> and exploring both the codebase and the development workflow. Feel free to contact us if you have any questions. Also do not hesitate to answer questions from other students on our <a href="https://discord.gg/DfJFjpxmC7" target="_blank" rel="noopener noreferrer" class="">Discord</a> channel if you know the answer to something.</li>
<li class=""><strong>Find a project.</strong> Listed on this page are mentored and un-mentored projects. Mentored projects are well-defined and mentor(s) have already volunteered. Un-mentored projects are additional ideas you may want to consider, but you will have to contact us to find a mentor. You can also propose your own project, if you can think of one that better fits your interest and skill level. If a project description is unclear or you have any questions, please get in touch with its mentor and/or join our <a href="https://discord.gg/DfJFjpxmC7" target="_blank" rel="noopener noreferrer" class="">Discord</a> channel at <em>#general</em>.</li>
<li class=""><strong>Contact us.</strong> If you decide on a project, get in touch with the community and let us know. If you want to work on a qualification task, let the respective mentor know so we can avoid duplicated efforts.</li>
<li class=""><strong>Apply.</strong> Students should apply definitely before deadline on April 8th. The "work" period begins on June 2th and ends in September. Take a look at <a href="https://developers.google.com/open-source/gsoc/timeline" target="_blank" rel="noopener noreferrer" class="">GSoC timeline</a> for additional information. Note, make sure you apply to Google before April 19th, even if you have not yet finished your qualification task. Please apply as soon as possible: Applications can be improved until the 19th but not afterwards!</li>
</ol>
<blockquote>
<p><strong>Note</strong>: A friendly reminder that while the application to GSoC is important for you and GSoC, SRS mentors will not base their decision solely on the GSoC application. We will judge applicants based on their qualification tasks to understand their abilities in coding, learning the tools, communication skills etc. So please do not worry about your application being perfect for us. Although it is very important to follow GSoC's application rules so they can pay you.</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="qualification-tasks">Qualification Tasks<a href="https://ossrs.io/lts/en-us/blog/GSoC-2025#qualification-tasks" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<p>In order to get accepted you have to complete a small qualification task which in all cases include sending a patch to the development mailing list. SRS development can be quite challenging and the qualification task helps us figure out whether you are motivated enough and have the potential to deliver successfully.</p>
<p>The qualification tasks are usually shown in the project description. Contact the respective mentor(s) for assistance on getting a related qualification task or if you want to propose your own. You can also browse the <a href="https://github.com/ossrs/srs" target="_blank" rel="noopener noreferrer" class="">SRS Bug Issue</a> for qualification task ideas. In general qualification tasks should include submitting a patch to the <a href="https://github.com/ossrs/srs" target="_blank" rel="noopener noreferrer" class="">SRS Bug Issue</a> which passes review and is accepted into the SRS codebase. It will be common for such patches to need multiple iterations of submissions and reviews, so don't wait too long with the first submission! Note, please avoid picking a qualification task which another student is already working on, each student should work on a different qualification task.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="development">Development<a href="https://ossrs.io/lts/en-us/blog/GSoC-2025#development" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<p>If you are selected for a particular project then you are not only expected to present a working implementation but you should also submit your work for inclusion for the SRS codebase. This should be done at least 2-3 weeks before the end of the second work period by sending patches to the <a href="https://github.com/ossrs/srs" target="_blank" rel="noopener noreferrer" class="">SRS Bug Issue</a>&amp;<a href="https://discord.gg/DfJFjpxmC7" target="_blank" rel="noopener noreferrer" class="">Discord</a> where the SRS community and your mentor will review your work. You will likely be asked to make some changes and resend improved versions. If you feel that no consensus is reached about how something should be done then follow the advice of your mentor.</p>
<p>In order to create good quality patches make sure to read the <a class="" href="https://ossrs.io/lts/en-us/docs/v5/doc/getting-started">Developer Documentation</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="contacting-srs">Contacting SRS<a href="https://ossrs.io/lts/en-us/blog/GSoC-2025#contacting-srs" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<p>If you have questions or comments feel free to contact us via our mail, Discord one of the SRS GSoC admins:</p>
<ul>
<li class=""><strong>Discord:</strong> <em>#general</em></li>
<li class=""><strong>SRS GSoC Admins:</strong> Winlin (winlin in #general on <a href="https://discord.gg/DfJFjpxmC7" target="_blank" rel="noopener noreferrer" class="">Discord</a>, winlinvip at gmail dot com ), Devin (Devin in <em>#general</em> on <a href="https://discord.gg/DfJFjpxmC7" target="_blank" rel="noopener noreferrer" class="">Discord</a>, devin at ossrs dot io), LiuQi (Steven in <em>#general</em> on <a href="https://discord.gg/DfJFjpxmC7" target="_blank" rel="noopener noreferrer" class="">Discord</a>, lq at chinaffmpeg dot org)
You may also contact a mentor directly if you have questions specifically related to one of the projects listed on this page.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="mentored-project-ideas">Mentored Project Ideas<a href="https://ossrs.io/lts/en-us/blog/GSoC-2025#mentored-project-ideas" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>This section lists well-defined projects that have one or more available mentors. If you are new to SRS, and have relatively little experience with multimedia, you should favor one of these ideas rather than propose your own. Contact the respective mentor(s) to get more information about the project and the requested qualification task.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-yaml-configuration-file-support">1. YAML Configuration File Support<a href="https://ossrs.io/lts/en-us/blog/GSoC-2025#1-yaml-configuration-file-support" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Name of project</th><th style="text-align:left">YAML Configuration File Support</th></tr></thead><tbody><tr><td style="text-align:left">Project Description</td><td style="text-align:left">SRS currently uses a proprietary configuration format similar to NGINX. YAML is a widely adopted configuration format, familiar to many users.</td></tr><tr><td style="text-align:left">Mentor</td><td style="text-align:left">Junqin Zhang(<a href="mailto:chundonglinlin@163.com" target="_blank" rel="noopener noreferrer" class="">chundonglinlin@163.com</a>)</td></tr><tr><td style="text-align:left">Backup Mentor</td><td style="text-align:left">Haibo Chen(<a href="mailto:495810242@qq.com" target="_blank" rel="noopener noreferrer" class="">495810242@qq.com</a>)</td></tr><tr><td style="text-align:left">Required Skills</td><td style="text-align:left">Familiar with yaml file format and its parsing method, skilled in C++ programming.</td></tr><tr><td style="text-align:left">Difficulty</td><td style="text-align:left">Beginner</td></tr><tr><td style="text-align:left">Expected Outcome</td><td style="text-align:left">Convert existing SRS configuration files to YAML format with proper parsing and execution.</td></tr><tr><td style="text-align:left">Qualification Task</td><td style="text-align:left">Implement YAML file parsing.</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-hls-llhls-mode">2. HLS LLHLS mode<a href="https://ossrs.io/lts/en-us/blog/GSoC-2025#2-hls-llhls-mode" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Name of project</th><th style="text-align:left">HLS support LLHLS mode</th></tr></thead><tbody><tr><td style="text-align:left">Project Description</td><td style="text-align:left">HLS, developed by Apple, is a method for file-based live streaming with high latency. LLHLS significantly reduces this latency.</td></tr><tr><td style="text-align:left">Mentor</td><td style="text-align:left">Zhihong Xiao(<a href="mailto:hondaxiao@tencent.com" target="_blank" rel="noopener noreferrer" class="">hondaxiao@tencent.com</a>)</td></tr><tr><td style="text-align:left">Backup Mentor</td><td style="text-align:left">Haibo Chen(<a href="mailto:495810242@qq.com" target="_blank" rel="noopener noreferrer" class="">495810242@qq.com</a>)</td></tr><tr><td style="text-align:left">Required Skills</td><td style="text-align:left">Familiarity with HLS and LLHLS, strong ability to read standards documentation, proficient in C++ programming</td></tr><tr><td style="text-align:left">Difficulty</td><td style="text-align:left">Advanced</td></tr><tr><td style="text-align:left">Expected Outcome</td><td style="text-align:left">Achieve playback on LLHLS-supported players with expected latency.</td></tr><tr><td style="text-align:left">Qualification Task</td><td style="text-align:left">Complete LLHLS encoding, re-muxing, and manifest file generation.</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-coroutine-based-dns-resolution-in-srs-network-library-st-state-thread">3. Coroutine-based DNS Resolution in SRS Network Library ST (State-Thread)<a href="https://ossrs.io/lts/en-us/blog/GSoC-2025#3-coroutine-based-dns-resolution-in-srs-network-library-st-state-thread" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Name of project</th><th style="text-align:left">Coroutine-based DNS Resolution in SRS Network Library ST (State-Thread)</th></tr></thead><tbody><tr><td style="text-align:left">Project Description</td><td style="text-align:left">ST (State-Thread) is a coroutine library with coroutine-based wrappers for common network interfaces. Currently, DNS resolution is not adapted to ST and needs full coroutine support.</td></tr><tr><td style="text-align:left">Mentor</td><td style="text-align:left">Zhihong Xiao (<a href="mailto:hondaxiao@tencent.com" target="_blank" rel="noopener noreferrer" class="">hondaxiao@tencent.com</a>)</td></tr><tr><td style="text-align:left">Backup Mentor</td><td style="text-align:left">Winlin (<a href="mailto:winlinvip@gmail.com" target="_blank" rel="noopener noreferrer" class="">winlinvip@gmail.com</a>)</td></tr><tr><td style="text-align:left">Required Skills</td><td style="text-align:left">Familiarity with DNS resolution process, understanding of coroutine principles, proficient in C++ programming</td></tr><tr><td style="text-align:left">Difficulty</td><td style="text-align:left">Intermediate</td></tr><tr><td style="text-align:left">Expected Outcome</td><td style="text-align:left">Implement coroutine-based DNS resolution for all DNS operations in the code.</td></tr><tr><td style="text-align:left">Qualification Task</td><td style="text-align:left">Develop a DNS resolution interface based on State-Thread.</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-hls-support-for-cmaf">4. HLS Support for CMAF<a href="https://ossrs.io/lts/en-us/blog/GSoC-2025#4-hls-support-for-cmaf" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Name of project</th><th style="text-align:left">HLS Support for CMAF</th></tr></thead><tbody><tr><td style="text-align:left">Project Description</td><td style="text-align:left">CMAF (Common Media Application Format) is an international standard proposed by industry leaders like Microsoft and Apple, approved in 2017. Implementing CMAF in SRS allows compatibility with more platforms.</td></tr><tr><td style="text-align:left">Mentor</td><td style="text-align:left">Zhihong Xiao(<a href="mailto:hondaxiao@tencent.com" target="_blank" rel="noopener noreferrer" class="">hondaxiao@tencent.com</a>)</td></tr><tr><td style="text-align:left">Backup Mentor</td><td style="text-align:left">Steven Liu(<a href="mailto:lq@chinaffmpeg.org" target="_blank" rel="noopener noreferrer" class="">lq@chinaffmpeg.org</a>)</td></tr><tr><td style="text-align:left">Required Skills</td><td style="text-align:left">Familiarity with HLS, CMAF, MP4 standards, strong ability to read standards documentation, proficient in C++ programming</td></tr><tr><td style="text-align:left">Difficulty</td><td style="text-align:left">Advanced</td></tr><tr><td style="text-align:left">Expected Outcome</td><td style="text-align:left">Output CMAF-HLS manifests and corresponding packaging formats.</td></tr><tr><td style="text-align:left">Qualification Task</td><td style="text-align:left">Complete CMAF packaging and CMAF-HLS manifest file generation.</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-enhanced-rtmp-v2">5. Enhanced RTMP (V2)<a href="https://ossrs.io/lts/en-us/blog/GSoC-2025#5-enhanced-rtmp-v2" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<table><thead><tr><th style="text-align:left">Name of project</th><th style="text-align:left">Enhanced RTMP (V2)</th></tr></thead><tbody><tr><td style="text-align:left">Project Description</td><td style="text-align:left">Implement Enhanced RTMP (V2) to support advanced streaming capabilities.</td></tr><tr><td style="text-align:left">Mentor</td><td style="text-align:left">Zhihong Xiao (<a href="mailto:hondaxiao@tencent.com" target="_blank" rel="noopener noreferrer" class="">hondaxiao@tencent.com</a>)</td></tr><tr><td style="text-align:left">Backup Mentor</td><td style="text-align:left">Winlin (<a href="mailto:winlinvip@gmail.com" target="_blank" rel="noopener noreferrer" class="">winlinvip@gmail.com</a>)</td></tr><tr><td style="text-align:left">Required Skills</td><td style="text-align:left">Familiarity with Enhanced RTMP (V2) standard, strong ability to read standards documentation, proficient in C++ programming</td></tr><tr><td style="text-align:left">Difficulty</td><td style="text-align:left">Advanced</td></tr><tr><td style="text-align:left">Expected Outcome</td><td style="text-align:left">Support streaming, playback, and relay using Enhanced RTMP (V2).</td></tr><tr><td style="text-align:left">Qualification Task</td><td style="text-align:left">Implement Enhanced RTMP (V2) features and successfully achieve streaming, playback, and relay.</td></tr></tbody></table>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/22-02-10-GSoC" alt="" class="img_ev3q"></p>]]></content>
        <category label="GSoC" term="GSoC"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[SRS - Fix Memory Leaks with Smart Pointers]]></title>
        <id>https://ossrs.io/lts/en-us/blog/smart-pointer</id>
        <link href="https://ossrs.io/lts/en-us/blog/smart-pointer"/>
        <updated>2024-06-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[After 8 years, we resolved the memory leak issue in SRS using our own implementation of basic Smart Pointers,]]></summary>
        <content type="html"><![CDATA[<p>After 8 years, we resolved the memory leak issue in SRS using our own implementation of basic Smart Pointers,
maintaining the project's manageability.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://ossrs.io/lts/en-us/blog/smart-pointer#introduction" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Each stream on the SRS server has a Source object that manages the stream's lifecycle. To keep the logic and code
simple, SRS did not release the Source object; with a large number of streams, such as constantly changing streaming
addresses, this led to continuous memory growth and leaks.</p>
<!-- -->
<p>Previously, the workaround was to restart the service late at night. SRS supports <a href="https://github.com/ossrs/srs/issues/1579#issuecomment-587414898" target="_blank" rel="noopener noreferrer" class="">Gracefully Quit</a>,
which restarts the service when there are no connections, but this did not completely solve the problem.</p>
<p>To address this issue, we introduced Smart Pointers to manage the lifecycle of Source objects. We did not use C++ 11
because SRS needs to compile in various environments. Instead, we implemented a simplified version of Smart Pointers,
supporting only some features.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="design">Design<a href="https://ossrs.io/lts/en-us/blog/smart-pointer#design" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Before any work addressing this issue, we need refine the shared ptr of SRS, which is used in RTMP shared message,
GB sessions, and in future source objects.</p>
<p>Refer to <a href="https://public.websites.umich.edu/~eecs381/handouts/C++11_smart_ptrs.pdf" target="_blank" rel="noopener noreferrer" class="">Using C++11’s Smart Pointers</a>,
there are three varieties of smart pointers:</p>
<ul>
<li class="">Shared ptr: Akin to <code>SrsSharedPtrMessage</code> used for RTMP message, and <code>SrsLazyObjectWrapper</code> for GB28181.</li>
<li class="">Weak ptr: No such ptr in SRS before 5.0 version. We can avoid this by removing any circle reference of pointer.</li>
<li class="">Unique ptr: The corresponding ptr is <code>SrsAutoFree</code> that free the ptr in the local scope.</li>
</ul>
<p>If we carefully design and limit the usage of smart ptr, such as no cycle link that means we do not need weak ptr,
we can archive a simple and easy to maintain smart ptr for SRS. We also consider bellow features:</p>
<ul>
<li class="">Inheritance: Do not use inheritance with smart pointer, although we can write correct code, but it's complex to discuss.</li>
<li class="">Comparing: Do not support comparing smart pointers, because we only need to manage the memory automatically.</li>
<li class="">make_shared: Do not support this helper function, because we do not consider performance issue by new operator.</li>
<li class="">shared_from_this: Do not support this helper template, because we do not need this feature.</li>
<li class="">make_unique: Do not support this, because we allow naked new operator, and carefully code review is required.</li>
</ul>
<p>Again, we don't want to switch to C++11 because I think the modern C++ 11/14/17/20 is really a horrible thing that
does not fix anything, but introduces a lot of bad grammar sugar. We do not want any grammar sugar, which is very
harmful for communication. We  have experienced a lot of disaster of smart pointers and sugars, so we want to keep
the usage very simple:</p>
<ol>
<li class="">No grammar sugar: No weak ptr, no make shared, no make unique, no inheritance, no comparing, no circle reference, no C++11/14/17/20/22 etc.</li>
<li class="">Follow the C++ standard API if any API is really required, do not invent new wheels, no new functions and names.</li>
<li class="">Carefully code review, programmer should take responsibility for code and memory issues.</li>
</ol>
<p>In the other hand, we should not reinvent wheels especially for smart ptr, so we must use almost the same API of
C++ standard library. That is why we should learn from C++11 and refactor the similar smart ptrs in SRS.</p>
<p>Smart pointers might seem simple when they’re just about memory management, but when you delve into inheritance,
copying, comparison, performance, circular references, pointer conversion, creation, and the purism of "no naked new",
their capabilities become significantly richer. In reality, the main issues with C++ programs stem from programmers
messing around, and this purism along with various syntactic sugar makes it hard to notice when they are.</p>
<p>Most problems can be addressed with something as straightforward as an AK47, yet there's an obsession with acquiring
more advanced weaponry, which leads to a situation where, on the battlefield, you can’t even fire a shot due to jams
and blowbacks. This is because it’s very hard to spot when programmers are messing about in companies, with large
amounts of code being submitted, the usage of various new features, and tight deadlines.</p>
<p>The true gates of hell in C++ are not the limited old features of C, but its plethora of new features.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="shared-ptr">Shared Ptr<a href="https://ossrs.io/lts/en-us/blog/smart-pointer#shared-ptr" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>We implemented a simple Shared Ptr that supports reference counting and automatic release, based on
<a href="https://github.com/ossrs/srs/commit/6834ec208d67fa47c21536d1f1041bb6d60c1834" target="_blank" rel="noopener noreferrer" class="">#6834ec2</a>.</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">template</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">T</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">SrsSharedPtr</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">private</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Pointer to the object.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    T</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> ptr_</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Reference count of the object.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">uint32_t</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> ref_count_</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Usage is similar to std::shared_ptr, but it supports fewer interfaces:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">SrsSharedPtr</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">MyClass</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">ptr</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">MyClass</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ptr</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">do_something</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">SrsSharedPtr</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">MyClass</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> cp </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ptr</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cp</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">do_something</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>It also involves copy constructor, assignment, and move constructor, as well as some operator overloading.
For details, refer to the code and the unit test examples. Overall, this part is relatively simple to implement.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="shared-resource">Shared Resource<a href="https://ossrs.io/lts/en-us/blog/smart-pointer#shared-resource" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>In addition to the Shared Ptr smart pointer, we also support Shared Resource, which mainly implements the
ISrsResource interface and can be released by the ResourceManager. Refer to <a href="https://github.com/ossrs/srs/commit/6834ec208d67fa47c21536d1f1041bb6d60c1834" target="_blank" rel="noopener noreferrer" class="">#6834ec2</a>.</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">template</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token keyword" style="color:#00009f">typename</span><span class="token plain"> </span><span class="token class-name">T</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">SrsSharedResource</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token base-clause keyword" style="color:#00009f">public</span><span class="token base-clause"> </span><span class="token base-clause class-name">ISrsResource</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">private</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SrsSharedPtr</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">T</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> ptr_</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>In fact, Shared Resource and Shared Ptr have exactly the same interface, but we did not use inheritance; instead,
we used composition. Using it is the same as using Shared Ptr, but it can be managed by a Manager:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">SrsSharedResource</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">MyClass</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> ptr </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token generic-function function" style="color:#d73a49">SrsSharedResource</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">MyClass</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">MyClass</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">ptr</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">do_something</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">ISrsResourceManager</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> manager </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">.</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">manager</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">remove</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ptr</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>In practical application scenarios, resources are often managed by a coroutine. For example, a GB SIP connection
will start a separate coroutine to serve this connection. Similarly, there are GB Media connections, GB Session
sessions, RTC TCP connections, etc. We created an Executor to implement this common logic:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token class-name">SrsExecutorCoroutine</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">SrsExecutorCoroutine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ISrsResourceManager</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> m</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ISrsResource</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    resource_ </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    manager_ </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> m</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    trd_ </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">SrsSTCoroutine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"ar"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> resource_</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">get_id</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token class-name">SrsExecutorCoroutine</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token operator" style="color:#393A34">~</span><span class="token function" style="color:#d73a49">SrsExecutorCoroutine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    manager_</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">remove</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">resource_</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">srs_freep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">trd_</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">srs_error_t </span><span class="token class-name">SrsExecutorCoroutine</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">cycle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    srs_error_t err </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> handler_</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">cycle</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    manager_</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">remove</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Therefore, we can easily use the Executor to manage this type of Resource:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">SrsGbSipTcpConn</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> raw_conn </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">SrsGbSipTcpConn</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">SrsSharedResource</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">SrsGbSipTcpConn</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> conn </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token generic-function function" style="color:#d73a49">SrsSharedResource</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">SrsGbSipTcpConn</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">raw_conn</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">SrsExecutorCoroutine</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> executor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">SrsExecutorCoroutine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">_srs_gb_manager</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> raw_conn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> raw_conn</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> executor</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">start</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> srs_success</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">srs_freep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">executor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">srs_error_wrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"gb sip"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>It is worth emphasizing that the Executor and Smart Ptr are not inherently related; they are designed as
a mechanism to solve a common scenario. Otherwise, multiple places would need to implement repetitive logic,
making it more complex. Additionally, since the Executor references ISrsResource, we use the Resource Ptr
pointer object instead of directly using the Shared Ptr pointer.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="gb28181">GB28181<a href="https://ossrs.io/lts/en-us/blog/smart-pointer#gb28181" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>GB28181's SIP and Media are two separate protocols and transmission channels. This involves independent lifecycles
and management of objects. Refer to <a href="https://github.com/ossrs/srs/pull/4080" target="_blank" rel="noopener noreferrer" class="">#4080</a> for details, as illustrated in
the diagram below:</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-06-15-01-1de19ee49c969c84a2b46d45daf83f5a.png" width="700" height="357" class="img_ev3q"></p>
<p>SIPTcpConn is the SIP object for GB, usually listening on TCP port 5060, responsible for device registration and
information collection. MediaTcpConn is the media transmission object for GB, transmitting PS streams. The GB
Session is created and managed by SIPTcpConn or MediaTcpConn objects.</p>
<p>In practice, Session, SIPTcpConn, and MediaTcpConn are managed as Shared Resource objects. The Session uses Shared
Resource to reference SIPTcpConn and MediaTcpConn. However, SIPTcpConn and MediaTcpConn reference the Session using
raw pointers, not Shared Resource, because we have not implemented Weak Ptr and do not support circular references.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="webrtc-over-tcp">WebRTC over TCP<a href="https://ossrs.io/lts/en-us/blog/smart-pointer#webrtc-over-tcp" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>WebRTC over UDP is the default transport method. Since UDP is connectionless, SRS only needs an RTC Connection
object to manage the RTC session. For WebRTC over TCP, an additional TCP connection is added, managed by <code>SrsRtcTcpConn</code>.
Refer to <a href="https://github.com/ossrs/srs/pull/4083" target="_blank" rel="noopener noreferrer" class="">#4083</a>.</p>
<p><code>SrsRtcConnection</code> uses a Shared Resource to reference the <code>SrsRtcTcpConn</code> object, while <code>SrsRtcTcpConn</code> directly
references the raw pointer of <code>SrsRtcConnection</code> because the lifecycle of <code>SrsRtcConnection</code> is longer.</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">SrsRtcTcpConn</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">private</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Since the session references this object, we should directly use the session pointer.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SrsRtcConnection</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> session_</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">SrsRtcTcpNetwork</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token base-clause keyword" style="color:#00009f">public</span><span class="token base-clause"> </span><span class="token base-clause class-name">ISrsRtcNetwork</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">private</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SrsSharedResource</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">SrsRtcTcpConn</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> owner_</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Since we have not implemented <code>shared_from_this</code>, we need to pass the Shared Resource to <code>SrsRtcTcpConn</code>,
which is ultimately managed by the Executor and <code>SrsRtcConnection</code>. As <code>SrsRtcTcpConn</code> starts a coroutine to
serve this object, we use the Executor to manage it:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">resource </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">SrsRtcTcpConn</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">SrsTcpConnection</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">stfd2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ip</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> port</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">SrsRtcTcpConn</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> raw_conn </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token generic-function function" style="color:#d73a49">dynamic_cast</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">SrsRtcTcpConn</span><span class="token generic-function generic class-name operator" style="color:#393A34">*</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">resource</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">SrsSharedResource</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">SrsRtcTcpConn</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> conn </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token generic-function function" style="color:#d73a49">SrsSharedResource</span><span class="token generic-function generic class-name operator" style="color:#393A34">&lt;</span><span class="token generic-function generic class-name">SrsRtcTcpConn</span><span class="token generic-function generic class-name operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">raw_conn</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">SrsExecutorCoroutine</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> executor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">SrsExecutorCoroutine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">_srs_rtc_manager</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> conn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> raw_conn</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> raw_conn</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> executor</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">start</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> srs_success</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">srs_freep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">executor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">srs_error_wrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"start executor"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Before using Smart Ptr, we needed to release the references between <code>SrsRtcConnection</code> and <code>SrsRtcTcpConn</code> when
either object was destroyed. With Smart Ptr, this logic is no longer needed; simply releasing <code>SrsRtcTcpConn</code> will
automatically handle the cleanup.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="srt-source">SRT Source<a href="https://ossrs.io/lts/en-us/blog/smart-pointer#srt-source" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>The SRT Source also involves cleanup, but it is relatively simple; just switch to using Shared Ptr. For details,
refer to <a href="https://github.com/ossrs/srs/pull/4084" target="_blank" rel="noopener noreferrer" class="">#4084</a>.</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">SrsSrtSourceManager</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">virtual</span><span class="token plain"> srs_error_t </span><span class="token function" style="color:#d73a49">fetch_or_create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">SrsRequest</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> SrsSharedPtr</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">SrsSrtSource</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> pps</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">virtual</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">eliminate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">SrsRequest</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">SrsSharedPtr</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">SrsSrtSource</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> srt</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> _srs_srt_sources</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">fetch_or_create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">r</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> srt</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> srs_success</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">srs_error_wrap</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">err</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"create source"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>It is important to note that the Source actually manages the Consumer, so in the Consumer, we use the raw pointer
of the Source:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">SrsSrtConsumer</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">private</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Because source references to this object, so we should directly use the source ptr.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SrsSrtSource</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> source_</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Release the Source object when there is no streaming or playback:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token class-name">SrsSrtSource</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">on_consumer_destroy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">SrsSrtConsumer</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> consumer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Destroy and cleanup source when no publishers and consumers.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">can_publish_ </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> consumers</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">empty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        _srs_srt_sources</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">eliminate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">req</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token class-name">SrsSrtSource</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">on_unpublish</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Destroy and cleanup source when no publishers and consumers.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">can_publish_ </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> consumers</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">empty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        _srs_srt_sources</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">eliminate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">req</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The logic for releasing the Live Source is slightly different (it will be the same in the future), but the use of
smart pointers is consistent.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="webrtc-source">WebRTC Source<a href="https://ossrs.io/lts/en-us/blog/smart-pointer#webrtc-source" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Similar to SRT, the WebRTC Source is also relatively simple and only needs to be modified to use a shared pointer.
For more details, refer to <a href="https://github.com/ossrs/srs/pull/4085" target="_blank" rel="noopener noreferrer" class="">#4085</a>.</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">SrsRtcSourceManager</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">virtual</span><span class="token plain"> srs_error_t </span><span class="token function" style="color:#d73a49">fetch_or_create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">SrsRequest</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> SrsSharedPtr</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">SrsRtcSource</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> pps</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">virtual</span><span class="token plain"> SrsSharedPtr</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">SrsRtcSource</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">SrsRequest</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">virtual</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">eliminate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">SrsRequest</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>It is important to note that the Source actually manages the Consumer, so in the Consumer, we use the raw pointer
of the Source:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">SrsRtcConsumer</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">private</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Because source references to this object, so we should directly use the source ptr.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SrsRtcSource</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> source_</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>The WebRTC Source Manager supports a <code>fetch</code> API, which might return a null pointer, for example:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">SrsSharedPtr</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">SrsRtcSource</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> source </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> _srs_rtc_sources</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ruc</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain">req_</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">is_rtc_stream_active </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">source</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">!</span><span class="token plain">source</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">can_publish</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>When there is no publishing or playing, release the Source object:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token class-name">SrsRtcSource</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">on_consumer_destroy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">SrsRtcConsumer</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> consumer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Destroy and cleanup source when no publishers and consumers.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">is_created_ </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> consumers</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">empty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        _srs_rtc_sources</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">eliminate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">req</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">void</span><span class="token plain"> </span><span class="token class-name">SrsRtcSource</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">on_unpublish</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Destroy and cleanup source when no publishers and consumers.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">is_created_ </span><span class="token operator" style="color:#393A34">&amp;&amp;</span><span class="token plain"> consumers</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">empty</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        _srs_rtc_sources</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">eliminate</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">req</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The logic for releasing the Live Source is slightly different (it will be made the same in the future), but the
use of smart pointers is consistent.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="live-source">Live Source<a href="https://ossrs.io/lts/en-us/blog/smart-pointer#live-source" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Live Source is the most complex improvement, primarily because HTTP Streaming also uses Source. For more details,
refer to <a href="https://github.com/ossrs/srs/pull/4089" target="_blank" rel="noopener noreferrer" class="">#4089</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-06-15-02-13e3ab7f95118dfbe40010d4b5e554b7.png" width="1024" height="506" class="img_ev3q"></p>
<p>Therefore, we need to remove some unnecessary references to Source and instead get it from the manager:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">srs_error_t </span><span class="token class-name">SrsLiveStream</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">do_serve_http</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ISrsHttpResponseWriter</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> w</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ISrsHttpMessage</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SrsSharedPtr</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">SrsLiveSource</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> live_source </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> _srs_sources</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">req</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">live_source</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">srs_error_new</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ERROR_NO_SOURCE</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"no source for %s"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> req</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">get_stream_url</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">c_str</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>The manager is defined as follows. Note that it uses a Timer to check and release Source, which is different from the
logic in SRT/RTC. This will be unified in the future:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">SrsLiveSourceManager</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token base-clause keyword" style="color:#00009f">public</span><span class="token base-clause"> </span><span class="token base-clause class-name">ISrsHourGlass</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">public</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">virtual</span><span class="token plain"> srs_error_t </span><span class="token function" style="color:#d73a49">fetch_or_create</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">SrsRequest</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ISrsLiveSourceHandler</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> h</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> SrsSharedPtr</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">SrsLiveSource</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> pps</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">virtual</span><span class="token plain"> SrsSharedPtr</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">SrsLiveSource</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">SrsRequest</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> r</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>It is important to note that Source actually manages objects like Consumer/OriginHub/Edge, so we use raw pointers to
Source in these objects:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">SrsEdgeIngester</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token base-clause keyword" style="color:#00009f">public</span><span class="token base-clause"> </span><span class="token base-clause class-name">ISrsCoroutineHandler</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">private</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Because source references this object, we should directly use the source ptr.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SrsLiveSource</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> source_</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">SrsEdgeForwarder</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token base-clause keyword" style="color:#00009f">public</span><span class="token base-clause"> </span><span class="token base-clause class-name">ISrsCoroutineHandler</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">private</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Because source references this object, we should directly use the source ptr.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SrsLiveSource</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> source_</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">SrsLiveConsumer</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token base-clause keyword" style="color:#00009f">public</span><span class="token base-clause"> </span><span class="token base-clause class-name">ISrsWakable</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">private</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Because source references this object, we should directly use the source ptr.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SrsLiveSource</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> source_</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">SrsOriginHub</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token base-clause keyword" style="color:#00009f">public</span><span class="token base-clause"> </span><span class="token base-clause class-name">ISrsReloadHandler</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">private</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Because source references this object, we should directly use the source ptr.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    SrsLiveSource</span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> source_</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>The manager uses a timer to check and release Source:</p>
<div class="language-cpp codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-cpp codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">srs_error_t </span><span class="token class-name">SrsLiveSourceManager</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token function" style="color:#d73a49">notify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token plain"> event</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> srs_utime_t interval</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> srs_utime_t tick</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    srs_error_t err </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> srs_success</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">map</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> std</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">string</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> SrsSharedPtr</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">SrsLiveSource</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token double-colon punctuation" style="color:#393A34">::</span><span class="token plain">iterator it</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">it </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> pool</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">begin</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> it </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> pool</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">end</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        SrsSharedPtr</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">SrsLiveSource</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> source </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> it</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token plain">second</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">source</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">stream_is_dead</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> SrsContextId</span><span class="token operator" style="color:#393A34">&amp;</span><span class="token plain"> cid </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> source</span><span class="token operator" style="color:#393A34">-&gt;</span><span class="token function" style="color:#d73a49">source_id</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token function" style="color:#d73a49">srs_trace</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"cleanup dead source, id=[%s], total=%d"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> cid</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">c_str</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">int</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">pool</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">size</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            pool</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">erase</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">it</span><span class="token operator" style="color:#393A34">++</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token operator" style="color:#393A34">++</span><span class="token plain">it</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> err</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>This release logic is different from SRT/RTC, but it will be unified in the future. However, the use of smart
pointers is consistent.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/smart-pointer#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>To simplify the process, SRS initially did not release the Source object. By introducing Smart Pointers, this issue
was finally resolved. By applying business constraints and combining raw pointers with Smart Pointers, we avoided the
complexity of multiple Smart Pointer functionalities. Overall, the complexity introduced by this change is manageable,
and future maintainability is also good.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://ossrs.io/lts/en-us/blog/smart-pointer#contact" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Welcome for more discussion at <a href="https://discord.gg/bQUPDRqy79" target="_blank" rel="noopener noreferrer" class="">discord</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/24-06-15-SRS-Smart-Pointer" alt="" class="img_ev3q"></p>]]></content>
        <category label="srs" term="srs"/>
        <category label="memory" term="memory"/>
        <category label="smart-pointer" term="smart-pointer"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Oryx - Leveraging OpenAI for OCR and Object Recognition in Video Streams]]></title>
        <id>https://ossrs.io/lts/en-us/blog/ocr-video-streams</id>
        <link href="https://ossrs.io/lts/en-us/blog/ocr-video-streams"/>
        <updated>2024-05-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Introduction]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://ossrs.io/lts/en-us/blog/ocr-video-streams#introduction" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>In today's digital world, videos are everywhere. From social media clips to live broadcasts, we consume a
vast amount of video content daily. But have you ever wondered how we can make sense of all the information
in these videos? This is where AI comes in. With the help of artificial intelligence, we can now recognize
text, identify objects, and even describe scenes in video streams.</p>
<!-- -->
<p>One powerful tool that makes this process easy is Oryx. In this blog, we'll explore how Oryx can help you
perform OCR (Optical Character Recognition) on video streams, allowing you to extract valuable information
in real-time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-create-oryx-by-one-click">Step 1: Create Oryx by One Click<a href="https://ossrs.io/lts/en-us/blog/ocr-video-streams#step-1-create-oryx-by-one-click" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Creating an Oryx is simple and can be done with just one click if you use Digital Ocean droplet.
Please see <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-Tutorial">How to Setup a Video Streaming Service by 1-Click</a> for detail.</p>
<p>You can also use Docker to create an Oryx with a single command line:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker run --restart always -d -it --name oryx -v $HOME/data:/data \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -p 80:2022 -p 443:2443 -p 1935:1935 -p 8000:8000/udp -p 10080:10080/udp \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ossrs/oryx:5</span><br></div></code></pre></div></div>
<p>After creating the Oryx, you can access it through <code>http://your-server-ip/mgmt</code> via a browser.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-publish-a-live-stream-to-oryx">Step 2: Publish a Live Stream to Oryx<a href="https://ossrs.io/lts/en-us/blog/ocr-video-streams#step-2-publish-a-live-stream-to-oryx" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>You can use OBS or FFmpeg to publish a live stream to Oryx. You can also set up HTTPS and publish via WebRTC.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-05-20-01-c6773235f6e5c1ad37004aa2d0c75d13.png" width="576" height="438" class="img_ev3q"></p>
<p>Once the stream is published, you can preview it using an H5 player or VLC.
Please see <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-Tutorial">How to Setup a Video Streaming Service by 1-Click</a> for detail.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-setup-openai-secret-key-for-ocr">Step 3: Setup OpenAI Secret Key for OCR<a href="https://ossrs.io/lts/en-us/blog/ocr-video-streams#step-3-setup-openai-secret-key-for-ocr" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>To use OCR, you must obtain a secret key from OpenAI. Please open the <a href="https://platform.openai.com/api-keys" target="_blank" rel="noopener noreferrer" class="">API keys</a>
page in your browser and click the <code>Create new secret key</code> button. Once the key is created, copy it and set it in Oryx.
Then, click the <code>Test OpenAI Service</code> button, as shown in the picture below.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-05-20-02-47e28b2f18e5fe858b80796846e8ae41.png" width="720" height="498" class="img_ev3q"></p>
<p>If the test is successful, you can click the <code>Start OCR</code> button to start the OCR process.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-setup-ai-instructions-for-ocr">Step 4: Setup AI Instructions for OCR<a href="https://ossrs.io/lts/en-us/blog/ocr-video-streams#step-4-setup-ai-instructions-for-ocr" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Once you've configured your GPT AI assistant, you can update the bellow prompt at the setting webpage
<code>Service Settings &gt; AI Instructions &gt; Instructions</code>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-05-20-03-ad0479c6b249b3f1c8918d99c4474d72.png" width="720" height="532" class="img_ev3q"></p>
<p>To recognize text in video streams, you can use the following instructions:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Recognize the text in the image. Output the identified text directly.</span><br></div></code></pre></div></div>
<p>Please remember to restart the OCR after updating the AI settings.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-5-view-ocr-results-by-callback">Step 5: View OCR Results by Callback<a href="https://ossrs.io/lts/en-us/blog/ocr-video-streams#step-5-view-ocr-results-by-callback" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Once the OCR process is complete, you can view the results by setting up a callback URL in Oryx.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-05-20-04-1c1aad3bf94c1cfe4377f21bba3f46db.png" width="720" height="273" class="img_ev3q"></p>
<p>You can also view the last OCR result in the dashboard.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-05-20-05-9e60b9d21085a0a7aef8c873149f2575.png" width="720" height="496" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service">Cloud Service<a href="https://ossrs.io/lts/en-us/blog/ocr-video-streams#cloud-service" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>At SRS, our goal is to establish a non-profit, open-source community dedicated to creating an all-in-one,
out-of-the-box, open-source video solution for live streaming and WebRTC online services.</p>
<p>Additionally, we offer a <a class="" href="https://ossrs.io/lts/en-us/cloud">Cloud</a> service for those who prefer to use cloud service instead of building from
scratch. Our cloud service features global network acceleration, enhanced congestion control algorithms,
client SDKs for all platforms, and some free quota.</p>
<p>To learn more about our cloud service, click <a class="" href="https://ossrs.io/lts/en-us/cloud">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/ocr-video-streams#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>In conclusion, using AI to recognize text and objects in video streams is a game-changer. It helps us quickly
and accurately extract valuable information from videos. Tools like Oryx make this process simple and efficient,
allowing you to publish live streams and get real-time OCR results with ease. Whether you're looking to identify
people, read text, or describe scenes, AI-powered OCR can transform how you interact with video content. By
leveraging these technologies, you can unlock new possibilities and insights from the videos you encounter
every day.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://ossrs.io/lts/en-us/blog/ocr-video-streams#contact" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Welcome for more discussion at <a href="https://discord.gg/bQUPDRqy79" target="_blank" rel="noopener noreferrer" class="">discord</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/24-05-20-OCR-Video-Streams" alt="" class="img_ev3q"></p>]]></content>
        <category label="ocr" term="ocr"/>
        <category label="ai" term="ai"/>
        <category label="gpt" term="gpt"/>
        <category label="srs" term="srs"/>
        <category label="oryx" term="oryx"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Oryx - Revolutionize Video Content with Oryx - Effortless Dubbing and Translating to Multiple Languages Using OpenAI]]></title>
        <id>https://ossrs.io/lts/en-us/blog/dubbing-translating</id>
        <link href="https://ossrs.io/lts/en-us/blog/dubbing-translating"/>
        <updated>2024-02-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Introduction]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://ossrs.io/lts/en-us/blog/dubbing-translating#introduction" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>In today's globalized world, content creation is no longer limited by geographical boundaries. As a result,
engaging a diverse, international audience has become increasingly important for video creators. Whether
you're a YouTuber, filmmaker, or e-learning content provider, being able to make your content accessible in
multiple languages can greatly enhance its impact. That's where Oryx comes in – with its advanced
multilingual dubbing and translation services powered by OpenAI, breaking language barriers is now simpler
and more cost-effective than ever.</p>
<!-- -->
<p>In this blog, we will discuss how Oryx supports dubbing and translating video files from one language to
another, such as converting a video with English speech to Chinese subtitles and speech. We will explore how
this technology can help you appeal to a broader audience and unlock the full potential of your content, all
while being incredibly easy to use and wallet-friendly. So, buckle up as we dive into the world of multilingual
video content with Oryx!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-create-oryx-by-one-click">Step 1: Create Oryx by One Click<a href="https://ossrs.io/lts/en-us/blog/dubbing-translating#step-1-create-oryx-by-one-click" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Creating an Oryx is simple and can be done with just one click if you use Digital Ocean droplet.
Please see <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-Tutorial">How to Setup a Video Streaming Service by 1-Click</a> for detail.</p>
<p>You can also use Docker to create an Oryx with a single command line:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker run --restart always -d -it --name oryx -v $HOME/data:/data \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -p 80:2022 -p 443:2443 -p 1935:1935 -p 8000:8000/udp -p 10080:10080/udp \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ossrs/oryx:5</span><br></div></code></pre></div></div>
<p>After creating the Oryx, you can access it through <code>http://your-server-ip/mgmt</code> via a browser.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-upload-video-source-file">Step 2: Upload Video Source File<a href="https://ossrs.io/lts/en-us/blog/dubbing-translating#step-2-upload-video-source-file" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>First, please upload the video source file, click the <code>Dubbing &gt; Video Source &gt; Upload local file &gt; Upload File</code> to upload.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-02-21-01-c41178ffdde3754cfb586428dee869e2.png" width="830" height="415" class="img_ev3q"></p>
<blockquote>
<p>Note: You can also use other tools to upload the file under the <code>/data</code> directory, and use the <code>Use server file</code> to directly use it.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-setup-openai-secret-key-for-dubbing">Step 3: Setup OpenAI Secret Key for Dubbing<a href="https://ossrs.io/lts/en-us/blog/dubbing-translating#step-3-setup-openai-secret-key-for-dubbing" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>To use AI services, you must obtain a secret key from OpenAI. Please open the <a href="https://platform.openai.com/api-keys" target="_blank" rel="noopener noreferrer" class="">API keys</a>
page in your browser and click the <code>Create new secret key</code> button. Once the key is created, copy it and set it in Oryx.</p>
<p>Next, configure the OpenAI secret key in <code>Dubbing Settings &gt; ASR Settings</code>. Afterward, click on the
<code>Test OpenAI Service</code> button, and if no errors are detected during testing, click on <code>Update</code> button.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-02-21-02-713f221fff5eb3d4fe23d800977e3708.png" width="830" height="656" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-setup-the-language-to-translate">Step 4: Setup the Language to Translate<a href="https://ossrs.io/lts/en-us/blog/dubbing-translating#step-4-setup-the-language-to-translate" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Setup the video source language from <code>Dubbing Settings &gt; ASR Settings &gt; Language</code>, and set the target language
to translate in <code>Dubbing Settings &gt; Multilingual Translation &gt; Instructions</code> by setting the prompts, click on
<code>Update</code> button.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-02-21-03-cdc4015ae51e744e54b8828f429364ab.png" width="830" height="720" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-5-start-dubbing-and-download-translated-video">Step 5: Start Dubbing and Download Translated Video<a href="https://ossrs.io/lts/en-us/blog/dubbing-translating#step-5-start-dubbing-and-download-translated-video" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Click the <code>Start Dubbing</code> button, as bellow described.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-02-21-04-3668e760722b383dae77a0c26ed1c295.png" width="830" height="625" class="img_ev3q"></p>
<p>If translated audio segment is longer than the original audio, you can click the <code>Rephrase</code> or <code>Merge next</code> to
make it shorter, as bellow described.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-02-21-05-a693084180706a39d9e41e8593beee37.png" width="830" height="339" class="img_ev3q"></p>
<p>After all segments are ready, no red color background segments, you will be able to download the translated video,
click the <code>Download Dubbing Video</code> button.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-02-21-06-df55d4cc59bc7e7d417fbb6fcd2846ec.png" width="830" height="545" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service">Cloud Service<a href="https://ossrs.io/lts/en-us/blog/dubbing-translating#cloud-service" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>At SRS, our goal is to establish a non-profit, open-source community dedicated to creating an all-in-one,
out-of-the-box, open-source video solution for live streaming and WebRTC online services.</p>
<p>Additionally, we offer a <a class="" href="https://ossrs.io/lts/en-us/cloud">Cloud</a> service for those who prefer to use cloud service instead of building from
scratch. Our cloud service features global network acceleration, enhanced congestion control algorithms,
client SDKs for all platforms, and some free quota.</p>
<p>To learn more about our cloud service, click <a class="" href="https://ossrs.io/lts/en-us/cloud">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/dubbing-translating#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>In conclusion, Oryx's support for dubbing and translating video files to multiple languages, including the
conversion of English speech to Chinese subtitles and speech, is a game-changing solution for content creators
looking to engage a wider audience. By leveraging the advanced capabilities of OpenAI services, Oryx ensures
an efficient, cost-effective, and user-friendly approach to video localization. This remarkable technology not only
breaks language barriers but also fosters cultural exchange and global communication, propelling your content into
new horizons and opening doors to endless possibilities.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://ossrs.io/lts/en-us/blog/dubbing-translating#contact" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Welcome for more discussion at <a href="https://discord.gg/bQUPDRqy79" target="_blank" rel="noopener noreferrer" class="">discord</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/2024-02-21-dubbing-translating" alt="" class="img_ev3q"></p>]]></content>
        <category label="dubbing" term="dubbing"/>
        <category label="translating" term="translating"/>
        <category label="ai" term="ai"/>
        <category label="gpt" term="gpt"/>
        <category label="voice" term="voice"/>
        <category label="srs" term="srs"/>
        <category label="oryx" term="oryx"/>
        <category label="multilingual" term="multilingual"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Oryx - Speak to the Future - Transform Your Browser into a Personal Voice-Driven GPT AI Assistant with Oryx]]></title>
        <id>https://ossrs.io/lts/en-us/blog/browser-voice-driven-gpt</id>
        <link href="https://ossrs.io/lts/en-us/blog/browser-voice-driven-gpt"/>
        <updated>2024-01-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Imagine engaging with GPT in your browser through voice alone, sharing this capability with friends, or accessing]]></summary>
        <content type="html"><![CDATA[<p>Imagine engaging with GPT in your browser through voice alone, sharing this capability with friends, or accessing
it from any location. Picture an AI assistant that makes learning spoken English enjoyable and straightforward, or
that enables seamless conversation between you and a friend speaking a different language by translating everything
instantly. Discover how to turn these exciting possibilities into reality!</p>
<!-- -->
<p>Introducing a cutting-edge to technology: our easy to build, browser-based, voice-driven GPT AI assistant,
a transformative tool in interaction. Built with the user-friendly Oryx, which effortlessly enables
HTTPS with a single click, this AI assistant is accessible on any device equipped with a browser, including PCs and
mobile phones. Its convenience allows you to communicate with your private GPT AI assistant effortlessly, anytime
and anywhere, making it the perfect solution for hands-free use and quick input. Ideal for improving your spoken
English, acting as a real-time translator, or simply serving as a smart companion, this voice-driven AI assistant
works well through conversation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-create-oryx-by-one-click">Step 1: Create Oryx by One Click<a href="https://ossrs.io/lts/en-us/blog/browser-voice-driven-gpt#step-1-create-oryx-by-one-click" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Creating an Oryx is simple and can be done with just one click if you use Digital Ocean droplet.
Please see <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-Tutorial">How to Setup a Video Streaming Service by 1-Click</a> for detail.</p>
<p>You can also use Docker to create an Oryx with a single command line:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker run --restart always -d -it --name oryx -v $HOME/data:/data \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -p 80:2022 -p 443:2443 -p 1935:1935 -p 8000:8000/udp -p 10080:10080/udp \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ossrs/oryx:5</span><br></div></code></pre></div></div>
<p>After creating the Oryx, you can access it through <code>http://your-server-ip/mgmt</code> via a browser.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-setup-https-for-voice-driven-gpt">Step 2: Setup HTTPS for Voice-Driven GPT<a href="https://ossrs.io/lts/en-us/blog/browser-voice-driven-gpt#step-2-setup-https-for-voice-driven-gpt" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>When integrating voice functionality into your browser-based GPT AI assistant, security becomes paramount.
Browsers require the use of HTTPS when accessing the microphone to capture voice inputs as part of their
security strategies. This might sound complex, but with Oryx, enabling HTTPS on your site is
straightforward and hassle-free. Here's how to secure your voice-driven AI assistant with HTTPS:</p>
<ol>
<li class="">
<p><strong>DNS Configuration</strong>: Begin by adding a DNS A record for your domain. This step directs your domain name to your Oryx server. To verify that the DNS setup is correct, try accessing your Oryx with your domain name via http, like <code>http://your_domain_name</code>. If the setup is correct, this should work without any issues.</p>
</li>
<li class="">
<p><strong>Enable HTTPS</strong>: Navigate to the <code>System &gt; HTTPS &gt; Let's Encrypt</code> section in your Oryx dashboard. Here, you'll simply input your domain name and hit the <code>Submit</code> button. This process initiates the automatic generation and installation of a Let's Encrypt SSL certificate for your domain, making the setup of HTTPS as easy as a single click.</p>
</li>
<li class="">
<p><strong>Verification</strong>: With HTTPS enabled, you can now access your Oryx site securely by using <code>https://your_domain_name</code>. This secure connection ensures the security of your interactions with the GPT AI assistant.</p>
</li>
</ol>
<p>For more details, please see <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-HTTPS">Setup HTTPS for Oryx</a>. By following these
steps, you'll ensure that your voice-driven GPT AI assistant is not only innovative and useful but also secure
and compliant with browser security standards.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-setup-openai-secret-key-in-live-room">Step 3: Setup OpenAI Secret Key in Live Room<a href="https://ossrs.io/lts/en-us/blog/browser-voice-driven-gpt#step-3-setup-openai-secret-key-in-live-room" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>To use AI services, you must obtain a secret key from OpenAI. Please open the <a href="https://platform.openai.com/api-keys" target="_blank" rel="noopener noreferrer" class="">API keys</a>
page in your browser and click the <code>Create new secret key</code> button. Once the key is created, copy it and set it in Oryx.</p>
<p>Next, as illustrated in the image below, navigate to <code>Scenarios &gt; LiveRoom &gt; Create Live Room</code> and press the
<code>Create</code> button to create a live room for conversing with the GPT AI assistant. Alternatively, select the link to
join an existing live room.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-01-31-01-ccf8d1bacf1cd7d56ab4d151aeb1d39a.png" width="820" height="462" class="img_ev3q"></p>
<p>Next, configure the OpenAI secret key in <code>LiveRoom &gt; AI Assistant &gt; AI Provider</code>. Afterward, click on the
<code>Test OpenAI Service</code> button, and if no errors are detected during testing, click on <code>Update AI Assistant</code>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-01-31-02-b23a7c25ee5eb15dab57d50655e3052a.png" width="820" height="599" class="img_ev3q"></p>
<p>All you need to set up! It's quite user-friendly.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-open-gpt-ai-assistant-in-browser">Step 4: Open GPT AI Assistant in Browser<a href="https://ossrs.io/lts/en-us/blog/browser-voice-driven-gpt#step-4-open-gpt-ai-assistant-in-browser" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Now, click the <code>Assistant Link</code> button to create a link. You can either click the link to open the browser-based,
voice-driven GPT AI assistant. You can also right-click the link to copy and share the URL with other devices or
friends. You can use this on your mobile device as well.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-01-31-03-9bf2b67df58e15e3e91d338127358781.png" width="820" height="600" class="img_ev3q"></p>
<p>Upon opening the AI assistant webpage, press the <code>Allow</code> button to grant microphone access to the AI assistant.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-01-31-04-caf69e53ebf11d2dac0a18fc77442231.png" width="500" height="165" class="img_ev3q"></p>
<p>Press the <code>Start Chatting</code> button to interact with it.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-01-31-05-5784407add92310364146fcfc808226c.png" width="820" height="291" class="img_ev3q"></p>
<p>Your AI assistant is now prepared; let's explore how to communicate with her.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-5-how-to-interact-with-gpt-ai-assistant">Step 5: How to Interact with GPT AI Assistant<a href="https://ossrs.io/lts/en-us/blog/browser-voice-driven-gpt#step-5-how-to-interact-with-gpt-ai-assistant" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>When using a browser-based voice-driven GPT AI assistant on a computer, such as an Apple Mac or a Windows PC,
click on the microphone icon on the webpage. Press and hold either the <code>SPACE</code> or <code>R</code> key to begin speaking,
and release the key to stop speaking.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-01-31-06-9036c3c5f04a40448f30837d360ce699.png" width="820" height="489" class="img_ev3q"></p>
<p>When utilizing the AI assistant on a mobile device browser, like iPhone or Android, press and hold the microphone
for speaking, and release to finish speaking.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-01-31-07-e232bbf3019f0d4b51b4d95e55d632b6.png" width="360" height="640" class="img_ev3q"></p>
<p>Once you've submitted your message to the AI assistant, please wait briefly. The AI assistant will respond to you
using text and voice as well.</p>
<blockquote>
<p>Note: Moreover, a text input feature permits you to enter text by typing or pasting from the clipboard. Upon using
voice input, the input text field auto-fills, enabling you to edit and resend it to the AI assistant.</p>
</blockquote>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-01-31-08-64fdb97e024d0b241a12526df367b0b2.png" width="820" height="484" class="img_ev3q"></p>
<p>That's it! Now, let me present some intriguing and practical real-world examples and how to do it via your
browser-based voice-driven GTP AI assistant.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-create-an-english-speaking-coach-with-a-voice-driven-gpt-ai-assistant">How to Create an English Speaking Coach with a Voice-Driven GPT AI Assistant<a href="https://ossrs.io/lts/en-us/blog/browser-voice-driven-gpt#how-to-create-an-english-speaking-coach-with-a-voice-driven-gpt-ai-assistant" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Once you've configured your voice-driven GPT AI assistant, you can update the bellow prompt at the setting webpage
<code>AI Assistant &gt; AI Instructions &gt; Instructions</code>. You can get an excellent language coach who is tireless, humble,
doesn't lose temper, and patiently accompanies you in your spoken language practice. After using it for a month,
I progressed from speaking word by word to speaking sentence by sentence.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">I want you to act as a spoken English teacher and improver. </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">I will speak to you in English and you will reply to me in English to practice my spoken English. </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">I want you to strictly correct my grammar mistakes, typos, and factual errors. </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">I want you to ask me a question in your reply. </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Now let's start practicing, you could ask me a question first. </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Remember, I want you to strictly correct my grammar mistakes, typos, and factual errors.</span><br></div></code></pre></div></div>
<blockquote>
<p>Note: Discover additional prompts at <a href="https://github.com/f/awesome-chatgpt-prompts?#perform-as-a-spoken-english-instructor-and-enhancer" target="_blank" rel="noopener noreferrer" class="">awesome-chatgpt-prompts</a>.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-create-a-simultaneous-translator-for-multilingual-users">How to Create a Simultaneous Translator for Multilingual Users<a href="https://ossrs.io/lts/en-us/blog/browser-voice-driven-gpt#how-to-create-a-simultaneous-translator-for-multilingual-users" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>By sharing your voice-activated GPT AI assistant to more than one user, allowing them to converse with the same AI
assistant, then you get a simultaneous translator. You need to prompt the AI assistant to convert text into various
languages.</p>
<p>Please change the languages in the prompt to yours, updat the prompt at <code>AI Assistant &gt; AI Instructions &gt; Instructions</code>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">I want you to act as a language translator.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">I want you to translate my text in conversational tone.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">I want you to strictly translate to English and Chinese.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Keep in mind that you must translate to English and Chinese.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Remember, never answer questions but only translate.</span><br></div></code></pre></div></div>
<blockquote>
<p>Note: Discover additional prompts at <a href="https://github.com/f/awesome-chatgpt-prompts" target="_blank" rel="noopener noreferrer" class="">awesome-chatgpt-prompts</a>.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service">Cloud Service<a href="https://ossrs.io/lts/en-us/blog/browser-voice-driven-gpt#cloud-service" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>At SRS, our goal is to establish a non-profit, open-source community dedicated to creating an all-in-one,
out-of-the-box, open-source video solution for live streaming and WebRTC online services.</p>
<p>Additionally, we offer a <a class="" href="https://ossrs.io/lts/en-us/cloud">Cloud</a> service for those who prefer to use cloud service instead of building from
scratch. Our cloud service features global network acceleration, enhanced congestion control algorithms,
client SDKs for all platforms, and some free quota.</p>
<p>To learn more about our cloud service, click <a class="" href="https://ossrs.io/lts/en-us/cloud">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/browser-voice-driven-gpt#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>In wrapping up, the journey to creating a personal, browser-based, voice-driven GPT AI assistant with the SRS
Stack is remarkably straightforward. From setting up HTTPS for secure communication to integrating OpenAI's
powerful GPT capabilities, each step is designed to be user-friendly and accessible. Whether aiming to improve
language abilities, enable multi-language discussions, or simply enjoy the convenience of a voice-driven GPT
AI assistant, it offers numerous possibilities for living room and streaming hosts with AI assistance. In the future,
support for connecting live audience chats to the AI assistant will also be available. You can discover more
beneficial use cases for this GPT AI assistant in real-world.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://ossrs.io/lts/en-us/blog/browser-voice-driven-gpt#contact" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Welcome for more discussion at <a href="https://discord.gg/bQUPDRqy79" target="_blank" rel="noopener noreferrer" class="">discord</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/2024-01-31-browser-voice-driven-gpt" alt="" class="img_ev3q"></p>]]></content>
        <category label="ai" term="ai"/>
        <category label="gpt" term="gpt"/>
        <category label="voice" term="voice"/>
        <category label="srs" term="srs"/>
        <category label="oryx" term="oryx"/>
        <category label="streaming" term="streaming"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Oryx - Unlock Universal Ultra-Low Latency - Achieving 5-Second HLS Live Streams for All - No Special Equipment Needed]]></title>
        <id>https://ossrs.io/lts/en-us/blog/hls-5s-low-latency</id>
        <link href="https://ossrs.io/lts/en-us/blog/hls-5s-low-latency"/>
        <updated>2024-01-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Introduction]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://ossrs.io/lts/en-us/blog/hls-5s-low-latency#introduction" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>In the dynamic world of live streaming, latency is a critical factor that can make or break the viewer experience.
Traditionally, achieving low latency has been a challenge, especially when striving for broad compatibility across
devices and platforms. This is where HLS comes into play, a widely adopted format known for its reliability and
compatibility. However, HLS is often associated with higher latency about 30 seconds, which can be a drawback for
real-time interactions.</p>
<!-- -->
<p>Enter the realm of low-latency HLS streaming, a game-changer for live broadcasts. In this blog, we'll explore how
you can drastically reduce HLS stream latency to as low as 5 seconds. The best part? This can be achieved using
common, highly compatible technologies, without the need for specialized equipment. We'll delve into the use of
the Oryx, a powerful yet straightforward tool that simplifies the process, making ultra-low latency HLS
streaming accessible with just a click.</p>
<p>If you need even lower latencies and can compromise on compatibility, there are options. For latencies between
1 to 3 seconds, HTTP-FLV is a great choice. For ultra-low latencies of about 0.5 to 1 second, WebRTC is ideal.
Each technology is suitable for different requirements and content types.</p>
<p>In this blog, we aim to provide you with a comprehensive guide on choosing the right streaming technology for your
business, focusing on HLS for achieving the optimal balance between low latency and high compatibility. Whether
you're streaming a live sports event, an interactive webinar, or a real-time gaming session, understanding these
technologies will empower you to deliver the best possible live streaming experience to your audience.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="key-points">Key Points<a href="https://ossrs.io/lts/en-us/blog/hls-5s-low-latency#key-points" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>To achieve the widest compatibility, we use the most common HLS protocol, not HTTP-FLV, WebRTC, or even the LLHLS
protocol, but the most standard HLS protocol.</p>
<p>However, we need to change some settings at critical points, such as:</p>
<ul>
<li class="">For OBS encoder, select the x264 encoder and in the advanced settings, set the <code>GOP (Keyframe interval)</code> to <code>1 s</code>. Choose <code>Preset</code> as <code>fast</code>, <code>Profile</code> as <code>baseline</code>, and <code>Tune</code> as <code>zerolatency</code>. These settings allow OBS to generate shorter segments while maintaining compatibility.</li>
<li class="">For Oryx, enable the HLS low latency mode. This will generate HLS segments as short as possible, around 2 seconds each. The minimum delay for HLS is about two segments, allowing for an approximate 5-second delay.</li>
<li class="">For HLS player, such as hls.js, set it to start playing from the last segment and configure the maximum buffer time. When the accumulated delay reaches a certain threshold, enable accelerated playback to maintain a stable low latency.</li>
</ul>
<p>The entire workflow, from streaming to the server to the player, needs optimization to achieve a 5-second low
latency. Common mistakes in this process include:</p>
<ul>
<li class="">Inability to set the encoder, like OBS, with a large GOP, such as 10 seconds, or having an excessively large encoder buffer, leading to significant overall delay.</li>
<li class="">The Oryx is not set to low latency mode. In normal mode, the generated segment durations are longer, or some servers may not produce segments of accurate duration, preferring larger segments instead.</li>
<li class="">Using an incorrect player, such as VLC, which has significant delay regardless of the protocol used. Not all players are suitable; we have tested that both hls.js and mpegts.js players have low latency. In the future, we will test and ensure compatibility with more players.</li>
</ul>
<p>Let's begin achieving a 5-second HLS latency with a few simple setup steps and clicks.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-create-oryx-by-one-click">Step 1: Create Oryx by One Click<a href="https://ossrs.io/lts/en-us/blog/hls-5s-low-latency#step-1-create-oryx-by-one-click" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Creating an Oryx is simple and can be done with just one click if you use Digital Ocean droplet.
Please see <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-Tutorial">How to Setup a Video Streaming Service by 1-Click</a> for detail.</p>
<p>You can also use Docker to create an Oryx with a single command line:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker run --restart always -d -it --name oryx -v $HOME/data:/data \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -p 80:2022 -p 443:2443 -p 1935:1935 -p 8000:8000/udp -p 10080:10080/udp \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ossrs/oryx:5</span><br></div></code></pre></div></div>
<p>After creating the Oryx, you can access it through <code>http://your-server-ip/mgmt</code> via a browser.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-setup-obs-for-hls-low-latency">Step 2: Setup OBS for HLS Low Latency<a href="https://ossrs.io/lts/en-us/blog/hls-5s-low-latency#step-2-setup-obs-for-hls-low-latency" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>I suggest using OBS to publish the stream. It's a popular and powerful streaming tool that's easy to set up.
You should configure OBS as follows:</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-01-06-01-6c5092daf4cf519e685ad97140d17d9e.png" width="720" height="818" class="img_ev3q"></p>
<p>Click the <code>Settings</code> button, then go to the <code>Output</code> tab and apply the following settings:</p>
<ul>
<li class="">Set the <code>Output Mode</code> to <code>Advanced</code>. The <code>Simple</code> mode does not work for low latency HLS.</li>
<li class="">Set the <code>Video Encoder</code> to <code>x264</code>. Note that the hardware encoder may have a larger delay.</li>
<li class="">Set the <code>Keyframe interval</code> to <code>1 s</code>. Please note that this is the most critical setting for achieving low latency.</li>
<li class="">Set the <code>CPU Usage Preset</code> to <code>fast</code>. This setting is helpful for reducing the delay.</li>
<li class="">Set the <code>Profile</code> to <code>baseline</code>. This setting is helpful for reducing the delay.</li>
<li class="">Set the <code>Tune</code> to <code>zerolatency</code>. This setting is helpful for reducing the delay.</li>
</ul>
<p>Next, open the <code>Stream</code> tab and follow the instructions provided by the Oryx to set the server and
stream key for publishing the stream.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-setup-oryx-in-hls-low-latency-mode">Step 3: Setup Oryx in HLS Low Latency Mode<a href="https://ossrs.io/lts/en-us/blog/hls-5s-low-latency#step-3-setup-oryx-in-hls-low-latency-mode" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Open the Oryx and navigate to <code>System &gt; HLS Low Latency</code>. Enable the HLS low latency mode and
click the <code>Submit</code> button.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-01-06-02-74dc65b90c62c8c78b9969e7b7f76045.png" width="576" height="400" class="img_ev3q"></p>
<p>After that, you can obtain the publish server and stream key for OBS to stream to the Oryx.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-01-06-03-c6773235f6e5c1ad37004aa2d0c75d13.png" width="576" height="438" class="img_ev3q"></p>
<p>Please configure OBS and begin publishing the RTMP stream to the Oryx.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-setup-the-hls-player">Step 4: Setup the HLS Player<a href="https://ossrs.io/lts/en-us/blog/hls-5s-low-latency#step-4-setup-the-hls-player" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Open the Oryx <code>Simple Player</code> in the browser, and you can see the HLS stream with a 5-second delay.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2024-01-06-04-4458f5f2e3d9e6283f61c2a4d7474ea9.png" width="720" height="411" class="img_ev3q"></p>
<p>The Oryx has configured the HLS player using hls.js for low latency mode. We have applied the following
settings. If you need to use your own HLS player, please configure it similarly:</p>
<ul>
<li class="">Enable <code>enableWorker</code> by setting it to <code>true</code>. This improves performance and helps avoid lag or frame drops.</li>
<li class="">Activate <code>lowLatencyMode</code> by setting it to <code>true</code>. This enables Low-Latency HLS part playlist and segment loading.</li>
<li class="">Set <code>liveSyncDurationCount</code> to <code>0</code> to start playback from the last segment.</li>
<li class="">Set <code>maxBufferLength</code> to <code>5</code> to set the maximum buffer length in seconds.</li>
<li class="">Set <code>maxLiveSyncPlaybackRate</code> to <code>2</code> to catch up if the latency is large.</li>
</ul>
<p>For detailed information, please refer to <a href="https://github.com/ossrs/oryx/commit/a6b709f516da3c7f36f5c3c599142296148187ee#diff-06095ca53f7d88e4f592f1a432030f541adf2060cb2dfc6c4efd86cd9f074820R40" target="_blank" rel="noopener noreferrer" class="">this commit</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service">Cloud Service<a href="https://ossrs.io/lts/en-us/blog/hls-5s-low-latency#cloud-service" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>At SRS, our goal is to establish a non-profit, open-source community dedicated to creating an all-in-one,
out-of-the-box, open-source video solution for live streaming and WebRTC online services.</p>
<p>Additionally, we offer a <a class="" href="https://ossrs.io/lts/en-us/cloud">Cloud</a> service for those who prefer to use cloud service instead of building from
scratch. Our cloud service features global network acceleration, enhanced congestion control algorithms,
client SDKs for all platforms, and some free quota.</p>
<p>To learn more about our cloud service, click <a class="" href="https://ossrs.io/lts/en-us/cloud">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/hls-5s-low-latency#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Harnessing the Oryx, OBS, and hls.js, we've made 5-second latency HLS streaming a reality, breaking barriers in live
broadcast low latency and compatibility. This advancement marks a new era for interactive and engaging
live events, available to all without specialized equipment, setting a new experience in the streaming world.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://ossrs.io/lts/en-us/blog/hls-5s-low-latency#contact" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Join us for further conversation on <a href="https://discord.gg/bQUPDRqy79" target="_blank" rel="noopener noreferrer" class="">Discord</a>. If you'd like to help, please
feel free to support us through donations on <a href="https://opencollective.com/srs-server" target="_blank" rel="noopener noreferrer" class="">OpenCollective</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/2024-01-06-HLS-5s-Low-Latency" alt="" class="img_ev3q"></p>]]></content>
        <category label="hls" term="hls"/>
        <category label="llhls" term="llhls"/>
        <category label="live-streaming" term="live-streaming"/>
        <category label="low-latency-streaming" term="low-latency-streaming"/>
        <category label="low-latency-hls" term="low-latency-hls"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[SRS 10th Anniversary and 2023 Year-end Review]]></title>
        <id>https://ossrs.io/lts/en-us/blog/srs-ten-years</id>
        <link href="https://ossrs.io/lts/en-us/blog/srs-ten-years"/>
        <updated>2023-12-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[As we reach the end of 2023, it's time for an annual summary, which we can look back on and laugh at]]></summary>
        <content type="html"><![CDATA[<p>As we reach the end of 2023, it's time for an annual summary, which we can look back on and laugh at
our immaturity in the coming years.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="srs-server">SRS Server<a href="https://ossrs.io/lts/en-us/blog/srs-ten-years#srs-server" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>SRS 5.0 will be officially released as a stable version in the next two weeks. After a year of feature
freeze and six months of stability improvement, 5.0 is now ready for production use.</p>
<p>5.0 started development in March 2021, with key changes as follows:</p>
<ul>
<li class="">ST (State-Threads): Supports Windows/RISCV/LOONGARCH/MIPS/AppleM1 chips and multi-threading capabilities.</li>
<li class="">SRT: Rewritten based on ST, aligning APIs and callbacks, supporting direct IP streaming, upgrading libsrt, improving latency, and completing configuration options.</li>
<li class="">WebRTC: Supports WHIP and WHEP protocols, TCP transmission, Unity, improved error reporting, MP3 to OPUS conversion, and native OPUS support in FFmpeg.</li>
<li class="">WHIP: Supports WHIP protocol, adapts to Larix and OBS WHIP, improves security, and supports resource deletion.</li>
<li class="">GB28181: Supports 2016/TCP protocol, stress testing tools, and regression testing.</li>
<li class="">Live: Fixes RBSP parsing issues, compatibility with FFmpeg timecode, ignores empty NALUs, supports HLS pseudo-streams, HLS client kicking, and resolves DASH crash issues.</li>
</ul>
<p>There are also some bug fixes. For a detailed list of changes, please refer to the official
website's Changelog.</p>
<p>Looking back, it seems not much has been done in two years.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="oryx">Oryx<a href="https://ossrs.io/lts/en-us/blog/srs-ten-years#oryx" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Oryx is an integrated video cloud that includes multiple audio and video projects, centered around
audio and video application scenarios, and offers out-of-the-box solutions.</p>
<p>This year, Oryx was revamped, with major changes as follows:</p>
<ul>
<li class="">Transitioned from microservices architecture to monolithic application, reducing image size by 90%, increasing development speed by 10 times, and making microservices architecture the most misleading.</li>
<li class="">Supports Docker and script installations, DigitalOcean and Lighthouse images, BT and aaPanel plugin installations, and HELM installations.</li>
<li class="">Tests cover all installation methods, features, and APIs.</li>
<li class="">Supports new scenarios such as virtual live streaming, AI-generated subtitles, transcoding, callbacks, HLS clusters, and stream pulling and pushing.</li>
</ul>
<p>If SRS is simple and easy to use, Oryx truly simplifies building audio and video businesses.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="community">Community<a href="https://ossrs.io/lts/en-us/blog/srs-ten-years#community" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>SRS started as an open-source project in 2013, officially began building an open-source community in
2020, and expanded to a global community in 2022. This year, the community has grown rapidly and is
now self-sustaining.</p>
<p>The number of monthly paying users worldwide and OpenCollective subscribers has increased from around
5 to 41. It is expected that in three to five years, dedicated time can be invested in supporting community
development.</p>
<p>This year, we also began offering paid support to the community, with overseas users paying $5 per month,
which has been well received by users.</p>
<p>We maintain open-source projects while also benefiting from other audio and video open-source projects.
Therefore, we will donate half of our revenue to other audio and video open-source projects we depend on,
such as FFmpeg and OBS.</p>
<p>Additionally, we will continue to enhance the community's AI capabilities. For example, we use GPT to
automatically translate community Issues and Pull Requests, reducing communication barriers. We also
deployed AI Talk on the official website, making it easy for everyone to experience the new capabilities
of audio, video, and AI integration.</p>
<p>We are grateful for the global developer support and recognition of SRS, and our development will continue
to improve.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service">Cloud Service<a href="https://ossrs.io/lts/en-us/blog/srs-ten-years#cloud-service" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>At SRS, our goal is to establish a non-profit, open-source community dedicated to creating an all-in-one,
out-of-the-box, open-source video solution for live streaming and WebRTC online services.</p>
<p>Additionally, we offer a <a class="" href="https://ossrs.io/lts/en-us/cloud">Cloud</a> service for those who prefer to use cloud service instead of building from
scratch. Our cloud service features global network acceleration, enhanced congestion control algorithms,
client SDKs for all platforms, and some free quota.</p>
<p>To learn more about our cloud service, click <a class="" href="https://ossrs.io/lts/en-us/cloud">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/srs-ten-years#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>No matter how the open-source wind blows, understanding the value of what we do will ensure longevity.</p>
<p>Numerous open-source projects provide a never-ending foundation for the global software ecosystem. Being
a contributor to this system is a programmer's pride.</p>
<p>Providing paid support to users is valuable. While some regions may not appreciate it as much, we can
offer more services where it is more recognized, such as overseas.</p>
<p>As for professional open-source and custom development, some community developers are already doing
this on Upwork, and flexible employment is a good option.</p>
<p>Lastly, regarding commercialization, at least SRS won't pursue it. SRS aims to become a widely used
audio and video open-source project globally, and commercialization would hinder this goal.</p>
<p>In the open-source community, there is no winter in sight.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/2023-12-15-SRS-Ten-Years" alt="" class="img_ev3q"></p>]]></content>
        <category label="srs" term="srs"/>
        <category label="community" term="community"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Oryx - Effortlessly Create a Public Internet WHIP Service for OBS - A Comprehensive Guide to Sub-Second Streaming]]></title>
        <id>https://ossrs.io/lts/en-us/blog/obs-whip-internet-service</id>
        <link href="https://ossrs.io/lts/en-us/blog/obs-whip-internet-service"/>
        <updated>2023-12-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Introduction]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://ossrs.io/lts/en-us/blog/obs-whip-internet-service#introduction" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Are you tired of struggling with complicated setups and technical jargon when trying to create a public
internet WHIP service for OBS? Look no further! In this comprehensive guide, we will walk you through the
process of effortlessly building your own WHIP service using the Oryx, all with just a single click.
Say goodbye to the complexities of security, authentication, and WebRTC, and embrace the future of sub-second
live streaming and seamless OBS-RTC room connections.</p>
<!-- -->
<p>Join us as we break down the barriers of online streaming and help you unlock the full potential of OBS's
WHIP support. Our easy-to-understand, step-by-step tutorial will empower you to create a secure and efficient
WHIP service, revolutionizing your online meeting and live streaming experience. Don't let technical
challenges hold you back any longer - dive into our guide and start streaming like a pro today!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-create-oryx-by-one-click">Step 1: Create Oryx by One Click<a href="https://ossrs.io/lts/en-us/blog/obs-whip-internet-service#step-1-create-oryx-by-one-click" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Creating an Oryx is simple and can be done with just one click if you use Digital Ocean droplet.
Please see <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-Tutorial">How to Setup a Video Streaming Service by 1-Click</a> for detail.</p>
<p>You can also use Docker to create an Oryx with a single command line:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker run --restart always -d -it --name oryx -v $HOME/data:/data \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -p 80:2022 -p 443:2443 -p 1935:1935 -p 8000:8000/udp -p 10080:10080/udp \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ossrs/oryx:5</span><br></div></code></pre></div></div>
<p>After creating the Oryx, you can access it through <code>http://your-server-ip/mgmt</code> via a browser.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-get-the-whip-url-from-oryx">Step 2: Get the WHIP URL from Oryx<a href="https://ossrs.io/lts/en-us/blog/obs-whip-internet-service#step-2-get-the-whip-url-from-oryx" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Please download OBS version 30 or higher from <a href="https://github.com/obsproject/obs-studio/releases" target="_blank" rel="noopener noreferrer" class="">this link</a>
and proceed with the installation.</p>
<p>Open the Oryx, select <code>Scenarios &gt; Streaming &gt; WebRTC: WHIP OBS</code>, and follow the instructions to
get a WHIP URL for OBS.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-12-12-01-c5794d74912fcd34ee2add46162f792e.png" width="720" height="614" class="img_ev3q"></p>
<p>Please copy the WHIP URL as we will use it in OBS. Be aware that the WHIP stream can be played using the
WHEP player or embedded into your WordPress website.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-publish-whip-via-obs-to-oryx">Step 3: Publish WHIP via OBS to Oryx<a href="https://ossrs.io/lts/en-us/blog/obs-whip-internet-service#step-3-publish-whip-via-obs-to-oryx" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Next, launch OBS and select <code>Settings &gt; Stream</code>. Choose <code>WHIP</code> from the <code>Service</code> drop-down menu, and set
the WHIP URL into the <code>Server</code> field.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-12-12-02-67cffb90b54f2c770d920ecc6306cdd2.png" width="720" height="431" class="img_ev3q"></p>
<blockquote>
<p>Note: If the latency is large, setup the OBS Output by: For OBS encoder, select the x264 encoder and in the
advanced settings, set the GOP (Keyframe interval) to 1 s. Choose Preset as fast, Profile as baseline, and
Tune as zerolatency.</p>
</blockquote>
<p>Now you can click the <code>Start Streaming</code> button to publish the WHIP stream to the Oryx.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-use-whep-to-view-the-stream">Step 4: Use WHEP to View the Stream<a href="https://ossrs.io/lts/en-us/blog/obs-whip-internet-service#step-4-use-whep-to-view-the-stream" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>After publishing the stream, you can view it with a WebRTC HTML5 player. Access the WHEP player from the
Oryx dashboard.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-12-12-03-0cf70d9f6a2a23ff73c204ee5944c11a.png" width="720" height="329" class="img_ev3q"></p>
<p>Additionally, integrate the WHEP player within your WordPress website. Kindly adhere to the guidelines
provided on the Oryx dashboard.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service">Cloud Service<a href="https://ossrs.io/lts/en-us/blog/obs-whip-internet-service#cloud-service" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>At SRS, our goal is to establish a non-profit, open-source community dedicated to creating an all-in-one,
out-of-the-box, open-source video solution for live streaming and WebRTC online services.</p>
<p>Additionally, we offer a <a class="" href="https://ossrs.io/lts/en-us/cloud">Cloud</a> service for those who prefer to use cloud service instead of building from
scratch. Our cloud service features global network acceleration, enhanced congestion control algorithms,
client SDKs for all platforms, and some free quota.</p>
<p>To learn more about our cloud service, click <a class="" href="https://ossrs.io/lts/en-us/cloud">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/obs-whip-internet-service#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>In conclusion, our comprehensive guide has provided you with a simple and efficient method to create a public
internet WHIP service for OBS using the Oryx. By following our easy-to-understand, step-by-step tutorial,
you can now effortlessly build your own WHIP service with just a single click, eliminating the need to grapple
with complex security, authentication, and WebRTC issues. With this newfound knowledge, you can revolutionize
your online meeting and live streaming experience, fully harnessing the power of OBS's WHIP support for
sub-second streaming and seamless OBS-RTC room connections.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://ossrs.io/lts/en-us/blog/obs-whip-internet-service#contact" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Welcome for more discussion at <a href="https://discord.gg/bQUPDRqy79" target="_blank" rel="noopener noreferrer" class="">discord</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/2023-12-12-Oryx-OBS-WHIP-Service" alt="" class="img_ev3q"></p>]]></content>
        <category label="live" term="live"/>
        <category label="obs" term="obs"/>
        <category label="whip" term="whip"/>
        <category label="streaming" term="streaming"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Oryx - Revolutionizing Live Streams with AI Transcription - Creating Accessible, Multilingual Subtitles for Diverse Audiences]]></title>
        <id>https://ossrs.io/lts/en-us/blog/live-streams-transcription</id>
        <link href="https://ossrs.io/lts/en-us/blog/live-streams-transcription"/>
        <updated>2023-11-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Introduction]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://ossrs.io/lts/en-us/blog/live-streams-transcription#introduction" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>In this blog, we're diving into an exciting advancement in live streaming: using Automatic Speech
Recognition (ASR) to create real-time subtitles. Have you ever wondered how live streams can be more
inclusive, especially for people with hearing disabilities or those who are non-native speakers?
The answer lies in an innovative technology that’s reshaping how we experience live content.</p>
<!-- -->
<p>We'll focus on a game-changing tool in ASR – OpenAI's Whisper. This isn't just any technology; it's
a powerful AI service that understands almost every language in the world and transcripts speech
with remarkable accuracy. Forget the old days of needing expensive professionals for live translation
and transcription. With OpenAI's Whisper, this process becomes automated, efficient, and cost-effective.</p>
<p>Designed for beginners, our guide will take you through integrating Whisper AI into your live streams
to recognize and transcribe speech. Then, we'll show you how to use FFmpeg, to overlay these subtitles
onto your stream. All of this is made simple using the Oryx, which seamlessly connects these
technologies with just one click.</p>
<p>Join us as we step into the AI-powered future of live streaming, where accessibility and inclusivity
are key, making your content enjoyable and accessible to a much wider audience.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-create-oryx-by-one-click">Step 1: Create Oryx by One Click<a href="https://ossrs.io/lts/en-us/blog/live-streams-transcription#step-1-create-oryx-by-one-click" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Creating an Oryx is simple and can be done with just one click if you use Digital Ocean droplet.
Please see <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-Tutorial">How to Setup a Video Streaming Service by 1-Click</a> for detail.</p>
<p>You can also use Docker to create an Oryx with a single command line:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker run --restart always -d -it --name oryx -v $HOME/data:/data \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -p 80:2022 -p 443:2443 -p 1935:1935 -p 8000:8000/udp -p 10080:10080/udp \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ossrs/oryx:5</span><br></div></code></pre></div></div>
<p>After creating the Oryx, you can access it through <code>http://your-server-ip/mgmt</code> via a browser.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-publish-a-live-stream-to-oryx">Step 2: Publish a Live Stream to Oryx<a href="https://ossrs.io/lts/en-us/blog/live-streams-transcription#step-2-publish-a-live-stream-to-oryx" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>You can use OBS or FFmpeg to publish a live stream to Oryx. You can also set up HTTPS and publish via WebRTC.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-11-28-01-c6773235f6e5c1ad37004aa2d0c75d13.png" width="576" height="438" class="img_ev3q"></p>
<p>Once the stream is published, you can preview it using an H5 player or VLC.
Please see <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-Tutorial">How to Setup a Video Streaming Service by 1-Click</a> for detail.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-setup-openai-secret-key-for-whisper-asr">Step 3: Setup OpenAI Secret Key for Whisper ASR<a href="https://ossrs.io/lts/en-us/blog/live-streams-transcription#step-3-setup-openai-secret-key-for-whisper-asr" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>To use Whisper ASR, you must obtain a secret key from OpenAI. Please open the <a href="https://platform.openai.com/api-keys" target="_blank" rel="noopener noreferrer" class="">API keys</a>
page in your browser and click the <code>Create new secret key</code> button. Once the key is created, copy it and set it in Oryx.
Then, click the <code>Test OpenAI Service</code> button, as shown in the picture below.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-11-28-03-2f1d85c96ced532884e59d64a373c247.png" width="720" height="695" class="img_ev3q"></p>
<p>If the test is successful, you can click the <code>Start Transcription</code> button to start the transcription process.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-view-live-stream-with-subtitles">Step 4: View Live Stream with Subtitles<a href="https://ossrs.io/lts/en-us/blog/live-streams-transcription#step-4-view-live-stream-with-subtitles" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>When HLS segments are generated, Oryx uses FFmpeg to transcode the TS segment into an audio MP4 file.
It then utilizes OpenAI's Whisper service to convert this into an SRT subtitle. Following this, the subtitle
is overlaid onto the original TS file, resulting in the creation of a new live stream.</p>
<p>A link is available to play the newly generated live stream with subtitles. You can open this link directly
in your browser, as shown in the picture below.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-11-28-05-8c13ff69aab0ae811baef7a20b845b44.png" width="720" height="601" class="img_ev3q"></p>
<p>Open the HLS stream link in the browser to view the live stream with subtitles.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-11-28-07-4fddafac5c9c470aa8f4c8770c2657ff.png" width="576" height="333" class="img_ev3q"></p>
<p>You can also use the HTTP API to obtain ASR results for each HLS segment and perform actions like translation
or integration with your AI systems.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hls-with-webvtt">HLS with WebVTT<a href="https://ossrs.io/lts/en-us/blog/live-streams-transcription#hls-with-webvtt" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>You can enable Web Video Text Tracks (WebVTT) for HLS. First, enable WebVTT in <code>Transcript &gt; Service Settings &gt; WebVTT Subtitle</code>,
click the checkbox <code>Enable WebVTT Subtitle</code>.</p>
<p>Then, open the <code>Stream Operations</code> tab, you will get a HLS stream with WebVTT subtitles.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service">Cloud Service<a href="https://ossrs.io/lts/en-us/blog/live-streams-transcription#cloud-service" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>At SRS, our goal is to establish a non-profit, open-source community dedicated to creating an all-in-one,
out-of-the-box, open-source video solution for live streaming and WebRTC online services.</p>
<p>Additionally, we offer a <a class="" href="https://ossrs.io/lts/en-us/cloud">Cloud</a> service for those who prefer to use cloud service instead of building from
scratch. Our cloud service features global network acceleration, enhanced congestion control algorithms,
client SDKs for all platforms, and some free quota.</p>
<p>To learn more about our cloud service, click <a class="" href="https://ossrs.io/lts/en-us/cloud">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/live-streams-transcription#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Oryx is now integrated with OpenAI's Whisper and FFmpeg to transcript live streaming, enhancing the
audience experience by providing AI-driven subtitles. This shift from manual to automated transcription is
cost-effective and broadens global accessibility, overcoming language and hearing barriers. We're entering
a future where AI enhances digital inclusivity, enriching how we share and consume content online.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://ossrs.io/lts/en-us/blog/live-streams-transcription#contact" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Welcome for more discussion at <a href="https://discord.gg/bQUPDRqy79" target="_blank" rel="noopener noreferrer" class="">discord</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/23-11-28-Oryx-Live-Streams-Transcription" alt="" class="img_ev3q"></p>]]></content>
        <category label="live" term="live"/>
        <category label="ai" term="ai"/>
        <category label="transcription" term="transcription"/>
        <category label="asr" term="asr"/>
        <category label="subtitles" term="subtitles"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[SRS - Unlock the Power of HEVC via RTMP - Boost Your Live Streaming with OBS and FFmpeg]]></title>
        <id>https://ossrs.io/lts/en-us/blog/unlock-the-power-of-hevc-via-rtmp</id>
        <link href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-hevc-via-rtmp"/>
        <updated>2023-10-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Introduction]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-hevc-via-rtmp#introduction" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>HEVC, or H.265, can reduce bandwidth usage by about 50% compared to the widely used H.264 codec, which has the
best compatibility. Over the past 10 years, HEVC has grown slowly because a new codec needs an ecosystem to
support it, including decoders and device hardware. Now, both RTMP and FLV support HEVC in OBS and FFmpeg,
which are the standard tools in the live streaming industry.</p>
<!-- -->
<p>In live streaming, all the necessary tools are ready for HEVC. For encoding, FFmpeg and OBS are the most commonly
used streaming tools. OBS 29+ supports RTMP with HEVC, while FFmpeg 6 supports RTMP with HEVC. For HTML5 players,
mpegts.js 1.7.3 already supports HEVC via HTTP-FLV or HTTP-TS. VLC and ffplay also support HEVC via HTTP-TS, SRT,
and HLS. For media servers, SRS 6 supports HEVC via RTMP, FLV, TS, HLS, SRT, WebRTC, and more.</p>
<p>In this tutorial, we introduce FFmpeg 6, which added HEVC support just a few months ago. This is a significant
development, as many tools that use FFmpeg can now utilize HEVC via RTMP without any patches.</p>
<blockquote>
<p>Note: If you are interested in learning about OBS support for HEVC via RTMP, please read
<a class="" href="https://ossrs.io/lts/en-us/blog/push-hevc-via-rtmp-by-obs">How to Push HEVC via RTMP by OBS</a>.</p>
</blockquote>
<blockquote>
<p>Note: Please note that SRS 6.0 had already HEVC(H.265) support for RTMP, HTTP-FLV, SRT, HTTP-TS, HLS, MPEG-DASH
and WebRTC(Safari), please refer to <a class="" href="https://ossrs.io/lts/en-us/blog/lets-do-h265-live-streaming">H.265 Live Streaming Saving 50% Cost</a>.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-run-srs-media-server">Step 1: Run SRS Media Server<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-hevc-via-rtmp#step-1-run-srs-media-server" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>YouTube supports HEVC through RTMP, allowing you to directly publish HEVC via RTMP streams to YouTube using
OBS or FFmpeg. If you need to create your own live streaming platform, you can use the SRS media server, which
also supports HEVC via RTMP.</p>
<p>To run SRS, you can use Docker with the following command:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker run --rm -it -p 1935:1935 -p 8080:8080 ossrs/srs:6 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ./objs/srs -c conf/docker.conf</span><br></div></code></pre></div></div>
<p>To check if it started successfully, open your browser and visit
<a href="http://localhost:8080/" target="_blank" rel="noopener noreferrer" class="">http://localhost:8080</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-publish-by-ffmpeg-6">Step 2: Publish by FFmpeg 6<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-hevc-via-rtmp#step-2-publish-by-ffmpeg-6" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>If you have compiled FFmpeg 6 from source code using the instructions from this <a class="" href="https://ossrs.io/lts/en-us/docs/v6/doc/hevc#ffmpeg-tools">post</a>,
you can now utilize FFmpeg to publish RTMP HEVC streams:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">ffmpeg -stream_loop -1 -re -i doc/source.flv -acodec copy \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -vcodec libx265 -f flv rtmp://localhost/live/livestream</span><br></div></code></pre></div></div>
<p>Keep in mind that FFmpeg 6.0 does not support HEVC over RTMP until the following commit
<a href="https://github.com/FFmpeg/FFmpeg/commit/637c761be1bf9c3e1f0f347c5c3a390d7c32b282" target="_blank" rel="noopener noreferrer" class="">637c761b</a>:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">commit 637c761be1bf9c3e1f0f347c5c3a390d7c32b282</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Author: Steven Liu &lt;liuqi05@kuaishou.com&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Date:   Mon Aug 28 09:59:24 2023 +0800</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    avformat/rtmpproto: support enhanced rtmp</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    add option named rtmp_enhanced_codec,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    it would support hvc1,av01,vp09 now,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    the fourcc is using Array of strings.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    Signed-off-by: Steven Liu &lt;lq@chinaffmpeg.org&gt;</span><br></div></code></pre></div></div>
<p>SRS offers Docker support for FFmpeg versions 4 and 5, which enable HEVC streaming through RTMP. You can
conveniently use Docker to directly publish your live stream.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># For macOS</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker run --rm -it ossrs/srs:encoder \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ffmpeg -stream_loop -1 -re -i doc/source.flv -acodec copy \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    -vcodec libx265 -f flv rtmp://host.docker.internal/live/livestream</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># For Linux</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker run --net=host --rm -it ossrs/srs:encoder \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ffmpeg -stream_loop -1 -re -i doc/source.flv -acodec copy \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    -vcodec libx265 -f flv rtmp://127.0.0.1/live/livestream</span><br></div></code></pre></div></div>
<blockquote>
<p>Note: If want to use OBS, please download OBS 29+ from <a href="https://github.com/obsproject/obs-studio/releases" target="_blank" rel="noopener noreferrer" class="">here</a>,
select the HEVC codec, please see <a class="" href="https://ossrs.io/lts/en-us/blog/push-hevc-via-rtmp-by-obs">How to Push HEVC via RTMP by OBS</a>
for detail.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-play-by-html5-player">Step 3: Play by HTML5 Player<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-hevc-via-rtmp#step-3-play-by-html5-player" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>To play HEVC streams in your web browser, you can utilize mpegts.js version 1.7.3+ for playing HTTP-FLV or
HTTP-TS.</p>
<p>The SRS player has mpegts.js integrated, so all you need to do is open the URL to play the HEVC stream:</p>
<ul>
<li class="">HTTP-FLV(by H5):  <a href="http://localhost:8080/players/srs_player.html?autostart=true" target="_blank" rel="noopener noreferrer" class="">http://localhost:8080/live/livestream.flv</a></li>
</ul>
<p>When it comes to HLS streaming, hls.js doesn't support HEVC via TS. As a result, you should use VLC or ffplay
to play the HLS stream instead:</p>
<ul>
<li class="">HLS(by VLC or fflay): <code>http://localhost:8080/live/livestream.m3u8</code></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service">Cloud Service<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-hevc-via-rtmp#cloud-service" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>At SRS, our goal is to establish a non-profit, open-source community dedicated to creating an all-in-one,
out-of-the-box, open-source video solution for live streaming and WebRTC online services.</p>
<p>Additionally, we offer a <a class="" href="https://ossrs.io/lts/en-us/cloud">Cloud</a> service for those who prefer to use cloud service instead of building from
scratch. Our cloud service features global network acceleration, enhanced congestion control algorithms,
client SDKs for all platforms, and some free quota.</p>
<p>To learn more about our cloud service, click <a class="" href="https://ossrs.io/lts/en-us/cloud">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-hevc-via-rtmp#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>In summary, using HEVC for live streaming has become more accessible thanks to essential tools like OBS, FFmpeg,
and SRS media server, making it simpler for users to benefit from the bandwidth savings provided by this codec.
By following the steps in this guide, you can create your own live streaming platform with HEVC and RTMP, and
play the streams using HTML5 players like mpegts.js, or VLC and ffplay for HLS streaming.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-hevc-via-rtmp#contact" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Welcome for more discussion at <a href="https://discord.gg/bQUPDRqy79" target="_blank" rel="noopener noreferrer" class="">discord</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/23-10-26-Unlock-the-Power-of-HEVC-via-RTMP" alt="" class="img_ev3q"></p>]]></content>
        <category label="hevc" term="hevc"/>
        <category label="rtmp" term="rtmp"/>
        <category label="obs" term="obs"/>
        <category label="ffmpeg" term="ffmpeg"/>
        <category label="live" term="live"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Oryx - Efficient Live Streaming Transcoding for Reducing Bandwidth and Saving Costs]]></title>
        <id>https://ossrs.io/lts/en-us/blog/Live-Transcoding</id>
        <link href="https://ossrs.io/lts/en-us/blog/Live-Transcoding"/>
        <updated>2023-10-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Introduction]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://ossrs.io/lts/en-us/blog/Live-Transcoding#introduction" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>In today's digital world, live streaming has become an essential tool for businesses, content creators, and
individuals alike. With the increasing number of viewers tuning in to watch live streams, it's crucial to optimize
the streaming experience and cost for everyone, regardless of their internet speed or device capabilities. One
effective way to achieve this is through live streaming transcoding, a process that can help reduce bandwidth
and save costs without compromising on video quality. In this blog, we'll explore the benefits of using Oryx
for efficient live streaming transcoding and how it can lead to significant cost savings.</p>
<!-- -->
<p>Live streaming transcoding involves converting a live stream from Oryx using FFmpeg into various bitrates and
resolutions, before pushing it back to Oryx. This process allows for a reduction in bandwidth while maintaining
the same quality, simply by lowering the bitrate of the stream. As a result, the overall viewing bandwidth is
decreased, leading to cost savings for both the streamer and the viewer.</p>
<p>For instance, consider a live streaming scenario with 10,000 viewers all watching the same 2Mbps bitrate stream.
By transcoding the stream to 1Mbps, the required bandwidth is reduced to 10Gbps, resulting in a 50% cost saving.
This not only benefits the content provider but also ensures a smoother streaming experience for viewers with
varying internet speeds and devices.</p>
<p>Stay tuned as we delve deeper into the world of live streaming transcoding, and learn how to harness the power
of Oryx to optimize your streaming experience and save costs.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-create-oryx-by-one-click">Step 1: Create Oryx by One Click<a href="https://ossrs.io/lts/en-us/blog/Live-Transcoding#step-1-create-oryx-by-one-click" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Creating an Oryx is simple and can be done with just one click if you use Digital Ocean droplet.
Please see <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-Tutorial">How to Setup a Video Streaming Service by 1-Click</a> for detail.</p>
<p>You can also use Docker to create an Oryx with a single command line:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker run --restart always -d -it --name oryx -v $HOME/data:/data \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -p 80:2022 -p 443:2443 -p 1935:1935 -p 8000:8000/udp -p 10080:10080/udp \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ossrs/oryx:5</span><br></div></code></pre></div></div>
<p>After creating the Oryx, you can access it through <code>http://your-server-ip/mgmt</code> via a browser.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-publish-a-live-stream-to-oryx">Step 2: Publish a Live Stream to Oryx<a href="https://ossrs.io/lts/en-us/blog/Live-Transcoding#step-2-publish-a-live-stream-to-oryx" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>You can use OBS or FFmpeg to publish a live stream to Oryx. You can also set up HTTPS and publish via WebRTC.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-10-21-01-c6773235f6e5c1ad37004aa2d0c75d13.png" width="576" height="438" class="img_ev3q"></p>
<p>Once the stream is published, you can preview it using an H5 player or VLC.
Please see <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-Tutorial">How to Setup a Video Streaming Service by 1-Click</a> for detail.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-transcode-the-live-stream-to-lower-bitrate">Step 3: Transcode the Live Stream to Lower Bitrate<a href="https://ossrs.io/lts/en-us/blog/Live-Transcoding#step-3-transcode-the-live-stream-to-lower-bitrate" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Suppose you've sent an 8Mbps stream to Oryx using OBS, and you can't adjust the bitrate in OBS. This could
be because the stream is published by a vendor you can't control, or you need to record the original high-resolution
stream, or some devices like 4K/8K TVs require the high-resolution stream.</p>
<p>However, most of your viewers watch the live stream on mobile devices, and they don't need an 8Mbps stream. A 2Mbps
stream is sufficient for mobile devices, and their bandwidth may only support a 2Mbps bitrate. In this case, you can
use transcoding to convert the 8Mbps stream into a 2Mbps live stream.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-10-21-02-6ff4da73a786e3ce3cdbc52782f44dc5.png" width="720" height="830" class="img_ev3q"></p>
<p>After transcoding the stream, you can preview the 2Mbps version or forward it to another live streaming platform.
See <a class="" href="https://ossrs.io/lts/en-us/blog/Stream-IP-Camera-Events">Easily Stream Your RTSP IP Camera to YouTube, Twitch, or Facebook</a>
for more information. You can also pull the RTMP stream from Oryx and forward it elsewhere.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="check-transcoding-status">Check Transcoding Status<a href="https://ossrs.io/lts/en-us/blog/Live-Transcoding#check-transcoding-status" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>You can check the transcoding status in the Oryx dashboard.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-10-21-03-e47ad5e2b69397b63b67c6c77d7793d2.png" width="720" height="352" class="img_ev3q"></p>
<p>You can click the preview link to check the transcoded stream, or forward it to another live streaming platform.
See <a class="" href="https://ossrs.io/lts/en-us/blog/Stream-IP-Camera-Events">Easily Stream Your RTSP IP Camera to YouTube, Twitch, or Facebook</a>
for more information.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service">Cloud Service<a href="https://ossrs.io/lts/en-us/blog/Live-Transcoding#cloud-service" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>At SRS, our goal is to establish a non-profit, open-source community dedicated to creating an all-in-one,
out-of-the-box, open-source video solution for live streaming and WebRTC online services.</p>
<p>Additionally, we offer a <a class="" href="https://ossrs.io/lts/en-us/cloud">Cloud</a> service for those who prefer to use cloud service instead of building from
scratch. Our cloud service features global network acceleration, enhanced congestion control algorithms,
client SDKs for all platforms, and some free quota.</p>
<p>To learn more about our cloud service, click <a class="" href="https://ossrs.io/lts/en-us/cloud">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/Live-Transcoding#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>In summary, we discussed the benefits of live streaming transcoding using Oryx and FFmpeg. Transcoding optimizes
streaming for viewers with different internet speeds and devices, reduces bandwidth usage, and saves costs. We
covered setting up Oryx and FFmpeg, creating a configuration file, and pushing transcoded streams back to
Oryx. Monitoring and adjusting settings is crucial for optimal viewer experience, and transcoding can also
convert high-resolution streams to lower resolutions for mobile devices.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://ossrs.io/lts/en-us/blog/Live-Transcoding#contact" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Welcome for more discussion at <a href="https://discord.gg/bQUPDRqy79" target="_blank" rel="noopener noreferrer" class="">discord</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/2023-10-21-Live-Transcoding" alt="" class="img_ev3q"></p>]]></content>
        <category label="live streaming" term="live streaming"/>
        <category label="transcode" term="transcode"/>
        <category label="srs" term="srs"/>
        <category label="ffmpeg" term="ffmpeg"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Oryx - Easily Stream Your RTSP IP Camera to YouTube, Twitch, or Facebook]]></title>
        <id>https://ossrs.io/lts/en-us/blog/Stream-IP-Camera-Events</id>
        <link href="https://ossrs.io/lts/en-us/blog/Stream-IP-Camera-Events"/>
        <updated>2023-10-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Introduction]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://ossrs.io/lts/en-us/blog/Stream-IP-Camera-Events#introduction" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Do you have an IP camera that supports only the RTSP protocol and want to stream it to YouTube, Twitch,
or Facebook? The simplest solution is to use Oryx. With just one click, you can stream your IP
camera to these platforms for continuous 24/7 streaming.</p>
<!-- -->
<p>How to change IP Camera's RTSP stream to RTMP/RTMPS for live streaming platforms? You can use OBS or
Oryx. OBS requires a device, while Oryx works on a cloud server and in the backend. See the
workflow below.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">IP Camera ---RTSP---&gt; OBS or Oryx ---RTMP/RTMPS---&gt; YouTube, Twitch, or Facebook</span><br></div></code></pre></div></div>
<p>Oryx helps you connect multiple IP cameras and stream live to various platforms, making your live
streaming experience stronger.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-create-oryx-by-one-click">Step 1: Create Oryx by One Click<a href="https://ossrs.io/lts/en-us/blog/Stream-IP-Camera-Events#step-1-create-oryx-by-one-click" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Creating an Oryx is simple and can be done with just one click if you use Digital Ocean droplet.
Please see <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-Tutorial">How to Setup a Video Streaming Service by 1-Click</a> for detail.</p>
<p>You can also use Docker to create an Oryx with a single command line:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker run --rm -it -p 80:2022 -p 443:2443 -p 1935:1935 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -p 8080:8080 -p 8000:8000/udp -p 10080:10080/udp --name oryx \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -v $HOME/data:/data ossrs/oryx:5</span><br></div></code></pre></div></div>
<p>After creating the Oryx, you can access it through <code>http://your-server-ip/mgmt</code> via a browser.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-pull-rtsp-stream-from-ip-camera">Step 2: Pull RTSP Stream from IP Camera<a href="https://ossrs.io/lts/en-us/blog/Stream-IP-Camera-Events#step-2-pull-rtsp-stream-from-ip-camera" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Once you've created your Oryx, open the dashboard and navigate to <code>Scenarios &gt; Camera &gt; YouTube</code>.
Click on <code>Live Stream Source</code>, input the RTSP url, and then click <code>Submit</code>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-10-11-01-530c53268084d43c5f0066c2d7bb75fd.png" width="720" height="366" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-21-optional-enable-extra-silent-audio-track">Step 2.1: (Optional) Enable Extra Silent Audio Track<a href="https://ossrs.io/lts/en-us/blog/Stream-IP-Camera-Events#step-21-optional-enable-extra-silent-audio-track" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>If your camera only provides a video stream, you should enable an additional silent audio track,
otherwise, publishing to live platforms like YouTube will fail. Oryx can automatically generate
a silent audio track for you. Please choose the <code>Silent Audio Stream</code> option.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-10-11-14-ff65d788fc1793fdae37511cb4dd47a5.png" width="720" height="434" class="img_ev3q"></p>
<p>Oryx will automatically generate a silent audio track, when forwarding the RTSP stream.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-stream-ip-camera-to-youtube">Step 3: Stream IP Camera to YouTube<a href="https://ossrs.io/lts/en-us/blog/Stream-IP-Camera-Events#step-3-stream-ip-camera-to-youtube" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>To stream your file to YouTube, copy the Stream URL and Stream key from your YouTube <a href="https://studio.youtube.com/channel/UC/livestreaming" target="_blank" rel="noopener noreferrer" class="">Go live</a> page.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-10-11-02-4acf62b6f8d896373f3d58a72a6c9169.png" width="720" height="442" class="img_ev3q"></p>
<p>Open the Oryx dashboard and click on <code>Scenarios &gt; Camera &gt; YouTube</code>. And click <code>Start Camera Live</code> in Oryx.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-10-11-03-37a63c68c62981585e0998385afeee68.png" width="720" height="559" class="img_ev3q"></p>
<p>Your stream will now be published on YouTube.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-10-11-04-9203688c0ad1e7114fdb42609c9d1a1c.png" width="720" height="441" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-check-camera-live-status">Step 4: Check Camera Live Status<a href="https://ossrs.io/lts/en-us/blog/Stream-IP-Camera-Events#step-4-check-camera-live-status" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>To monitor the status of your camera live event, simply check the dashboard. You'll be able to see the status of all your camera live events, ensuring that everything is running smoothly.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-10-11-05-93287260a982cb3e4a56650b4721f6e4.png" width="720" height="347" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-5-stream-ip-camera-to-twitch">Step 5: Stream IP Camera to Twitch<a href="https://ossrs.io/lts/en-us/blog/Stream-IP-Camera-Events#step-5-stream-ip-camera-to-twitch" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>After setup RTSP stream, you can stream your IP Camera to Twitch, copy the Stream key from your
Twitch <a href="https://www.twitch.tv/dashboard/settings" target="_blank" rel="noopener noreferrer" class="">Dashboard</a> under <code>Settings &gt; Stream</code>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-10-11-06-d98d9b64ee6cc645b6343d31b7c4c46a.png" width="720" height="366" class="img_ev3q"></p>
<p>Open the Oryx dashboard and click on <code>Scenarios &gt; Camera &gt; Twitch</code>. Click <code>Start Camera Live</code> in Oryx.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-10-11-07-0661177d62ad692247cff7a6706fce47.png" width="720" height="595" class="img_ev3q"></p>
<p>And your stream will be published on Twitch in the <a href="https://www.twitch.tv/dashboard/stream" target="_blank" rel="noopener noreferrer" class="">Stream Manager</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-10-11-08-e274bf92865ebe7bf1fb008f64b7fc92.png" width="720" height="437" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-5-stream-ip-camera-to-facebook">Step 5: Stream IP Camera to Facebook<a href="https://ossrs.io/lts/en-us/blog/Stream-IP-Camera-Events#step-5-stream-ip-camera-to-facebook" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>After setup RTSP stream, you can stream your IP Camera to Facebook, copy the Stream key from your
Facebook <a href="https://www.facebook.com/live/producer?ref=OBS" target="_blank" rel="noopener noreferrer" class="">Live Producer</a> page,
then click <code>Go live</code>, and select <code>Streaming software</code>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-10-11-09-a88f9f0e022808d16b0de7920ed00c6d.png" width="720" height="452" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-10-11-10-85cad508082e8b5afd4916d1b4ddafa4.png" width="720" height="578" class="img_ev3q"></p>
<p>Open the Oryx dashboard and click on <code>Scenarios &gt; Camera &gt; Facebook</code>. Click <code>Start Camera Live</code> in Oryx, and your stream will be published on Facebook.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-10-11-11-5fd4a3aef2a87509d0a7435ce2daf9c4.png" width="720" height="560" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-10-11-12-ab6c40047a8772367e2ffd018d0d3a2a.png" width="720" height="319" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-10-11-13-7e6373b1cd09328ae31f86a115b72100.png" width="720" height="572" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service">Cloud Service<a href="https://ossrs.io/lts/en-us/blog/Stream-IP-Camera-Events#cloud-service" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>At SRS, our goal is to establish a non-profit, open-source community dedicated to creating an all-in-one,
out-of-the-box, open-source video solution for live streaming and WebRTC online services.</p>
<p>Additionally, we offer a <a class="" href="https://ossrs.io/lts/en-us/cloud">Cloud</a> service for those who prefer to use cloud service instead of building from
scratch. Our cloud service features global network acceleration, enhanced congestion control algorithms,
client SDKs for all platforms, and some free quota.</p>
<p>To learn more about our cloud service, click <a class="" href="https://ossrs.io/lts/en-us/cloud">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/Stream-IP-Camera-Events#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>In conclusion, streaming your RTSP IP camera to popular platforms like YouTube, Twitch, or Facebook has never
been easier, thanks to Oryx. With just a few simple steps, you can set up your IP camera for continuous
24/7 streaming on these platforms. By utilizing Oryx, you can also connect multiple IP cameras and stream
live to various platforms, enhancing your live streaming experience. So, go ahead and give Oryx a try, and
enjoy the convenience and flexibility it offers for your IP camera streaming needs.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://ossrs.io/lts/en-us/blog/Stream-IP-Camera-Events#contact" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Welcome for more discussion at <a href="https://discord.gg/bQUPDRqy79" target="_blank" rel="noopener noreferrer" class="">discord</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/2023-10-11-Stream-IP-Camera-Events" alt="" class="img_ev3q"></p>]]></content>
        <category label="live streaming" term="live streaming"/>
        <category label="virual live events" term="virual live events"/>
        <category label="srs" term="srs"/>
        <category label="ip camera" term="ip camera"/>
        <category label="rtsp" term="rtsp"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Oryx - Virtual Live Events - Harness the Power of Pre-Recorded Content for Seamless and Engaging Live Streaming Experiences]]></title>
        <id>https://ossrs.io/lts/en-us/blog/Virtual-Live-Events</id>
        <link href="https://ossrs.io/lts/en-us/blog/Virtual-Live-Events"/>
        <updated>2023-09-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Introduction]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://ossrs.io/lts/en-us/blog/Virtual-Live-Events#introduction" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Virtual live events refers to converting recorded video files, devices, or network streams into live
broadcasts and pushing them to live streaming platforms. For example, in e-commerce live streaming,
you can pre-record product explanations and demonstrations. In educational live streaming, you can
pre-record lessons and play them in the live classroom. For online speeches and sharing, you can
play pre-recorded content in the live room.</p>
<p>Virtual live events allows streamers to have plenty of preparation time, making the content more polished.
It helps reduce anxiety for inexperienced streamers, prevents network issues, enables 24/7 live streaming,
reaches a wider audience, and offers more possibilities for live broadcasts.</p>
<!-- -->
<p>Oryx enables you to create virtual live events with just one click, broadcasting them to multiple platforms
like YouTube, Twitch, and Facebook. In this blog post, we'll walk you through the steps to create a virtual live
event using Oryx.</p>
<p>In today's fast-paced world, virtual live events are becoming increasingly popular due to the convenience
they offer. Whether it's a concert, a soccer game, or an online course, you can now create a virtual live
event with your video files, making them more interactive and accessible to a wider audience.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-create-oryx-by-one-click">Step 1: Create Oryx by One Click<a href="https://ossrs.io/lts/en-us/blog/Virtual-Live-Events#step-1-create-oryx-by-one-click" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Creating an Oryx is simple and can be done with just one click if you use Digital Ocean droplet.
Please see <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-Tutorial">How to Setup a Video Streaming Service by 1-Click</a> for detail.</p>
<p>You can also use Docker to create an Oryx with a single command line:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker run --rm -it -p 80:2022 -p 443:2443 -p 1935:1935 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -p 8080:8080 -p 8000:8000/udp -p 10080:10080/udp --name oryx \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -v $HOME/data:/data ossrs/oryx:5</span><br></div></code></pre></div></div>
<p>After creating the Oryx, you can access it through <code>http://your-server-ip/mgmt</code> via a browser.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-upload-your-video-file">Step 2: Upload your video file<a href="https://ossrs.io/lts/en-us/blog/Virtual-Live-Events#step-2-upload-your-video-file" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Once you've created your Oryx, open the dashboard and navigate to <code>Scenarios &gt; VirtualLive &gt; YouTube</code>.
Click on <code>Choose File</code>, select your video file, and then click <code>Upload File</code>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-11-01-514a6b39952eb64d3c8924454c0ee220.png" width="720" height="702" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-stream-file-to-youtube">Step 3: Stream file to YouTube<a href="https://ossrs.io/lts/en-us/blog/Virtual-Live-Events#step-3-stream-file-to-youtube" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>To stream your file to YouTube, copy the Stream URL and Stream key from your YouTube <a href="https://studio.youtube.com/channel/UC/livestreaming" target="_blank" rel="noopener noreferrer" class="">Go live</a> page.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-11-02-4acf62b6f8d896373f3d58a72a6c9169.png" width="720" height="442" class="img_ev3q"></p>
<p>Open the Oryx dashboard and click on <code>Scenarios &gt; VirtualLive &gt; YouTube</code>. And click <code>Start Virtual Live</code> in Oryx.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-11-03-220cbec343d02215054e492f7f70ba05.png" width="720" height="707" class="img_ev3q"></p>
<p>Your stream will now be published on YouTube.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-11-04-9203688c0ad1e7114fdb42609c9d1a1c.png" width="720" height="441" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-check-virtual-live-status">Step 4: Check virtual live status<a href="https://ossrs.io/lts/en-us/blog/Virtual-Live-Events#step-4-check-virtual-live-status" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>To monitor the status of your virtual live event, simply check the dashboard. You'll be able to see the status of all your virtual live events, ensuring that everything is running smoothly.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-11-05-1d675edacc69c4c356395222130f4572.png" width="720" height="435" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-5-stream-file-to-twitch">Step 5: Stream file to Twitch<a href="https://ossrs.io/lts/en-us/blog/Virtual-Live-Events#step-5-stream-file-to-twitch" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>After uploading file, you can stream your file to Twitch, copy the Stream key from your
Twitch <a href="https://www.twitch.tv/dashboard/settings" target="_blank" rel="noopener noreferrer" class="">Dashboard</a> under <code>Settings &gt; Stream</code>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-11-06-d98d9b64ee6cc645b6343d31b7c4c46a.png" width="720" height="366" class="img_ev3q"></p>
<p>Open the Oryx dashboard and click on <code>Scenarios &gt; VirtualLive &gt; Twitch</code>. Click <code>Start Virtual Live</code> in Oryx.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-11-07-82da822648b8875dfbb9feac2773e489.png" width="720" height="712" class="img_ev3q"></p>
<p>And your stream will be published on Twitch in the <a href="https://www.twitch.tv/dashboard/stream" target="_blank" rel="noopener noreferrer" class="">Stream Manager</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-11-08-e274bf92865ebe7bf1fb008f64b7fc92.png" width="720" height="437" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-5-stream-file-to-facebook">Step 5: Stream file to Facebook<a href="https://ossrs.io/lts/en-us/blog/Virtual-Live-Events#step-5-stream-file-to-facebook" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>After uploading file, you can stream your file to Facebook, copy the Stream key from your
Facebook <a href="https://www.facebook.com/live/producer?ref=OBS" target="_blank" rel="noopener noreferrer" class="">Live Producer</a> page,
then click <code>Go live</code>, and select <code>Streaming software</code>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-11-09-a88f9f0e022808d16b0de7920ed00c6d.png" width="720" height="452" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-11-10-85cad508082e8b5afd4916d1b4ddafa4.png" width="720" height="578" class="img_ev3q"></p>
<p>Open the Oryx dashboard and click on <code>Scenarios &gt; VirtualLive &gt; Facebook</code>. Click <code>Start Virtual Live</code> in Oryx, and your stream will be published on Facebook.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-11-11-cc18219b18f7784311235ba64f46fa0d.png" width="720" height="712" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-11-12-ab6c40047a8772367e2ffd018d0d3a2a.png" width="720" height="319" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-11-13-7e6373b1cd09328ae31f86a115b72100.png" width="720" height="572" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="optional-upload-video-file-by-other-tools">(Optional) Upload Video File by Other Tools<a href="https://ossrs.io/lts/en-us/blog/Virtual-Live-Events#optional-upload-video-file-by-other-tools" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>You can also upload the video file to the <code>/data/upload</code> folder using tools like FTP or SCP. After that, choose
<code>Use server file</code>, enter the video file's path, and utilize it as a virtual live source.</p>
<p>This method enables you to upload very large files, particularly when webpage-based uploads fail. By using professional
upload tools, you can resume uploads or accelerate the process with multi-threading and other features.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service">Cloud Service<a href="https://ossrs.io/lts/en-us/blog/Virtual-Live-Events#cloud-service" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>At SRS, our goal is to establish a non-profit, open-source community dedicated to creating an all-in-one,
out-of-the-box, open-source video solution for live streaming and WebRTC online services.</p>
<p>Additionally, we offer a <a class="" href="https://ossrs.io/lts/en-us/cloud">Cloud</a> service for those who prefer to use cloud service instead of building from
scratch. Our cloud service features global network acceleration, enhanced congestion control algorithms,
client SDKs for all platforms, and some free quota.</p>
<p>To learn more about our cloud service, click <a class="" href="https://ossrs.io/lts/en-us/cloud">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/Virtual-Live-Events#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>In conclusion, virtual live events provide a convenient and efficient way to broadcast pre-recorded content on
various platforms, making it more polished and accessible to a wider audience. By reducing anxiety for
inexperienced streamers and enabling 24/7 streaming, virtual live events offer numerous possibilities for
various industries. Oryx simplifies the process of creating and broadcasting these events, catering
to the increasing demand for such interactive experiences in today's fast-paced world.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://ossrs.io/lts/en-us/blog/Virtual-Live-Events#contact" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Welcome for more discussion at <a href="https://discord.gg/bQUPDRqy79" target="_blank" rel="noopener noreferrer" class="">discord</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/2023-09-11-Virtual-Live-Events" alt="" class="img_ev3q"></p>]]></content>
        <category label="live streaming" term="live streaming"/>
        <category label="virual live events" term="virual live events"/>
        <category label="srs" term="srs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Oryx - Effortless Live Stream Recording with Oryx - A Step-by-Step Guide to Server-Side Recording and AWS S3 Integration]]></title>
        <id>https://ossrs.io/lts/en-us/blog/Record-Live-Streaming</id>
        <link href="https://ossrs.io/lts/en-us/blog/Record-Live-Streaming"/>
        <updated>2023-09-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Introduction]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://ossrs.io/lts/en-us/blog/Record-Live-Streaming#introduction" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>With Oryx, you can easily record your live streaming and publish it on a web page for your audience
to access. In this blog, we will guide you through the process of recording live streaming to an MP4 file
using Oryx.</p>
<!-- -->
<p>Live streaming has become increasingly popular, and many content creators want to record their live streams
for later use or to provide their audience with video-on-demand (VoD) content. While there are various
methods to record live streams, such as using OBS, some embedded devices may not support recording or
may be difficult to control. In such cases, server-side recording can be a more efficient solution.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-create-oryx-by-one-click">Step 1: Create Oryx by One Click<a href="https://ossrs.io/lts/en-us/blog/Record-Live-Streaming#step-1-create-oryx-by-one-click" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<p>Creating an Oryx is simple and can be done with just one click if you use Digital Ocean droplet.
Please see <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-Tutorial">How to Setup a Video Streaming Service by 1-Click</a> for detail.</p>
<p>You can also use Docker to create an Oryx with a single command line:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker run --rm -it -p 80:2022 -p 443:2443 -p 1935:1935 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -p 8080:8080 -p 8000:8000/udp -p 10080:10080/udp --name oryx \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -v $HOME/data:/data ossrs/oryx:5</span><br></div></code></pre></div></div>
<p>After creating the Oryx, you can access it through <code>http://your-server-ip/mgmt</code> via a browser.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-publish-a-live-stream-to-oryx">Step 2: Publish a live stream to Oryx<a href="https://ossrs.io/lts/en-us/blog/Record-Live-Streaming#step-2-publish-a-live-stream-to-oryx" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<p>You can use OBS or FFmpeg to publish a live stream to Oryx. You can also set up HTTPS and publish via WebRTC.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2022-04-09-01-c6773235f6e5c1ad37004aa2d0c75d13.png" width="576" height="438" class="img_ev3q"></p>
<p>Once the stream is published, you can preview it using an H5 player or VLC.
Please see <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-Tutorial">How to Setup a Video Streaming Service by 1-Click</a> for detail.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-record-the-live-stream-by-oryx">Step 3: Record the Live Stream by Oryx<a href="https://ossrs.io/lts/en-us/blog/Record-Live-Streaming#step-3-record-the-live-stream-by-oryx" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Once your live stream is published, you can start recording it using Oryx. To do this, open the
<code>Scenarios &gt; Record &gt; Setup Record Rules</code> section and click the <code>Start Record</code> button.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-10-01-4371a288e800cc855edfdc351a9c0a9c.png" width="720" height="358" class="img_ev3q"></p>
<p>The recording process will begin, and you can monitor the progress of your recording tasks.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-10-02-474210cac1b8b0869940cbdb57e8d4c6.png" width="720" height="437" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-stop-and-download-mp4-file">Step 4: Stop and Download MP4 File<a href="https://ossrs.io/lts/en-us/blog/Record-Live-Streaming#step-4-stop-and-download-mp4-file" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>When you want to stop recording, click the <code>Stop Record</code> button in the <code>Setup Record Rules</code> section. Wait for
a few seconds for the recording to stop. If the live stream is no longer being published, Oryx will
automatically stop the recording task after a few minutes (e.g., 5 minutes).</p>
<p>After the recording has stopped, Oryx will transmux the recorded file to MP4 format. You can then preview
and download the MP4 file for further use or distribution.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-10-03-1e27aadc1e7fac9a3804d89cca567bfa.png" width="720" height="363" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-record-specific-streams">How to Record Specific Streams?<a href="https://ossrs.io/lts/en-us/blog/Record-Live-Streaming#how-to-record-specific-streams" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>See <a class="" href="https://ossrs.io/lts/en-us/faq-oryx#how-to-record-a-specific-stream">How to Record a Specific Stream</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-record-to-s3-cloud-storage">How to Record to S3 Cloud Storage?<a href="https://ossrs.io/lts/en-us/blog/Record-Live-Streaming#how-to-record-to-s3-cloud-storage" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>See <a class="" href="https://ossrs.io/lts/en-us/faq-oryx#how-to-record-to-s3-cloud-storage">How to Record to S3 Cloud Storage</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-merge-to-one-mp4-file">How to Merge to One Mp4 File?<a href="https://ossrs.io/lts/en-us/blog/Record-Live-Streaming#how-to-merge-to-one-mp4-file" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>See <a class="" href="https://ossrs.io/lts/en-us/faq-oryx#recording-doesnt-stop-when-the-stream-is-stopped">Recording Doesn't Stop When the Stream is Stopped</a>
and <a class="" href="https://ossrs.io/lts/en-us/faq-oryx#how-to-quickly-generate-a-recorded-file">How to Quickly Generate a Recorded File</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service">Cloud Service<a href="https://ossrs.io/lts/en-us/blog/Record-Live-Streaming#cloud-service" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>At SRS, our goal is to establish a non-profit, open-source community dedicated to creating an all-in-one,
out-of-the-box, open-source video solution for live streaming and WebRTC online services.</p>
<p>Additionally, we offer a <a class="" href="https://ossrs.io/lts/en-us/cloud">Cloud</a> service for those who prefer to use cloud service instead of building from
scratch. Our cloud service features global network acceleration, enhanced congestion control algorithms,
client SDKs for all platforms, and some free quota.</p>
<p>To learn more about our cloud service, click <a class="" href="https://ossrs.io/lts/en-us/cloud">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/Record-Live-Streaming#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Recording live streaming to an MP4 file is a valuable feature for content creators who want to provide
their audience with video-on-demand content. With Oryx, the process of recording, stopping, and
downloading your live streams is simplified, making it easy for you to manage and distribute your recorded
content. By following the steps outlined in this blog, you can quickly and efficiently record your live
streams and make them available for your audience to access whenever they want.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://ossrs.io/lts/en-us/blog/Record-Live-Streaming#contact" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Welcome for more discussion at <a href="https://discord.gg/bQUPDRqy79" target="_blank" rel="noopener noreferrer" class="">discord</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/2023-09-10-Record-Live-Streaming" alt="" class="img_ev3q"></p>]]></content>
        <category label="live streaming" term="live streaming"/>
        <category label="record" term="record"/>
        <category label="dvr" term="dvr"/>
        <category label="srs" term="srs"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Oryx - Maximize Audience Engagement - Effortlessly Restream Live Content Across Multiple Platforms with Oryx]]></title>
        <id>https://ossrs.io/lts/en-us/blog/Multi-Platform-Streaming</id>
        <link href="https://ossrs.io/lts/en-us/blog/Multi-Platform-Streaming"/>
        <updated>2023-09-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In today's digital world, live streaming has become an essential tool for businesses, content creators, and individuals to engage with their audiences. With the increasing popularity of various live streaming platforms like YouTube, Twitch, and Facebook, it has become crucial to stream your content on multiple platforms simultaneously to reach a wider audience. This blog will guide you through the process of live streaming to multiple platforms using Oryx.]]></summary>
        <content type="html"><![CDATA[<p>In today's digital world, live streaming has become an essential tool for businesses, content creators, and individuals to engage with their audiences. With the increasing popularity of various live streaming platforms like YouTube, Twitch, and Facebook, it has become crucial to stream your content on multiple platforms simultaneously to reach a wider audience. This blog will guide you through the process of live streaming to multiple platforms using Oryx.</p>
<!-- -->
<p>Oryx is a powerful and easy-to-use solution that allows you to live stream to multiple platforms with just a few clicks. It also enables you to stream to your own platform or even set up an intranet live stream within your company. Let's dive into the steps to set up live streaming on multiple platforms using Oryx.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-create-oryx-by-one-click">Step 1: Create Oryx by One Click<a href="https://ossrs.io/lts/en-us/blog/Multi-Platform-Streaming#step-1-create-oryx-by-one-click" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<p>Creating an Oryx is simple and can be done with just one click if you use Digital Ocean droplet.
Please see <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-Tutorial">How to Setup a Video Streaming Service by 1-Click</a> for detail.</p>
<p>You can also use Docker to create an Oryx with a single command line:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">docker run --rm -it -p 80:2022 -p 443:2443 -p 1935:1935 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -p 8080:8080 -p 8000:8000/udp -p 10080:10080/udp --name oryx \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -v $HOME/data:/data ossrs/oryx:5</span><br></div></code></pre></div></div>
<p>After creating the Oryx, you can access it through <code>http://your-server-ip/mgmt</code> via a browser.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-publish-a-live-stream-to-oryx">Step 2: Publish a live stream to Oryx<a href="https://ossrs.io/lts/en-us/blog/Multi-Platform-Streaming#step-2-publish-a-live-stream-to-oryx" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<p>You can use OBS or FFmpeg to publish a live stream to Oryx. You can also set up HTTPS and publish via WebRTC.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2022-04-09-01-c6773235f6e5c1ad37004aa2d0c75d13.png" width="576" height="438" class="img_ev3q"></p>
<p>Once the stream is published, you can preview it using an H5 player or VLC.
Please see <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-Tutorial">How to Setup a Video Streaming Service by 1-Click</a> for detail.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-forward-to-youtube">Step 3: Forward to YouTube<a href="https://ossrs.io/lts/en-us/blog/Multi-Platform-Streaming#step-3-forward-to-youtube" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<p>To forward your stream to YouTube, copy the Stream URL and Stream key from your YouTube <a href="https://studio.youtube.com/channel/UC/livestreaming" target="_blank" rel="noopener noreferrer" class="">Go live</a> page.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-09-01-4acf62b6f8d896373f3d58a72a6c9169.png" width="720" height="442" class="img_ev3q"></p>
<p>Open the Oryx dashboard and click on <code>Scenarios &gt; Forward &gt; YouTube</code>. And click <code>Start Forward</code> in Oryx.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-09-02-93e8b1fc2ce89170e49a541c0f6f0c5d.png" width="720" height="578" class="img_ev3q"></p>
<p>Your stream will now be published on YouTube.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-09-03-9203688c0ad1e7114fdb42609c9d1a1c.png" width="720" height="441" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-forward-to-twitch">Step 4: Forward to Twitch<a href="https://ossrs.io/lts/en-us/blog/Multi-Platform-Streaming#step-4-forward-to-twitch" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<p>To forward your stream to Twitch, copy the Stream key from your Twitch <a href="https://www.twitch.tv/dashboard/settings" target="_blank" rel="noopener noreferrer" class="">Dashboard</a> under <code>Settings &gt; Stream</code>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-09-04-d98d9b64ee6cc645b6343d31b7c4c46a.png" width="720" height="366" class="img_ev3q"></p>
<p>Open the Oryx dashboard and click on <code>Scenarios &gt; Forward &gt; Twitch</code>. Click <code>Start Forward</code> in Oryx.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-09-05-edaf5489dc75f84c57497625f9924d67.png" width="720" height="580" class="img_ev3q"></p>
<p>And your stream will be published on Twitch in the <a href="https://www.twitch.tv/dashboard/stream" target="_blank" rel="noopener noreferrer" class="">Stream Manager</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-09-06-e274bf92865ebe7bf1fb008f64b7fc92.png" width="720" height="437" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-5-forward-to-facebook">Step 5: Forward to Facebook<a href="https://ossrs.io/lts/en-us/blog/Multi-Platform-Streaming#step-5-forward-to-facebook" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<p>To forward your stream to Facebook, copy the Stream key from your Facebook <a href="https://www.facebook.com/live/producer?ref=OBS" target="_blank" rel="noopener noreferrer" class="">Live Producer</a> page,
then click <code>Go live</code>, and select <code>Streaming software</code>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-09-07-a88f9f0e022808d16b0de7920ed00c6d.png" width="720" height="452" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-09-08-85cad508082e8b5afd4916d1b4ddafa4.png" width="720" height="578" class="img_ev3q"></p>
<p>Open the Oryx dashboard and click on <code>Scenarios &gt; Forward &gt; Facebook</code>. Click <code>Start Forward</code> in Oryx, and your stream will be published on Facebook.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-09-09-eb7f377ba73ba464682ead2b82587edf.png" width="720" height="586" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-09-10-ab6c40047a8772367e2ffd018d0d3a2a.png" width="720" height="319" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-09-11-7e6373b1cd09328ae31f86a115b72100.png" width="720" height="572" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-6-check-multiple-streaming-status">Step 6: Check Multiple Streaming Status<a href="https://ossrs.io/lts/en-us/blog/Multi-Platform-Streaming#step-6-check-multiple-streaming-status" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<p>After publishing your stream on all platforms, you can check the multiple streaming status in the Oryx dashboard.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-09-09-12-bea044d59e3ff80b672dcfc650e6fb52.png" width="720" height="514" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service">Cloud Service<a href="https://ossrs.io/lts/en-us/blog/Multi-Platform-Streaming#cloud-service" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>At SRS, our goal is to establish a non-profit, open-source community dedicated to creating an all-in-one,
out-of-the-box, open-source video solution for live streaming and WebRTC online services.</p>
<p>Additionally, we offer a <a class="" href="https://ossrs.io/lts/en-us/cloud">Cloud</a> service for those who prefer to use cloud service instead of building from
scratch. Our cloud service features global network acceleration, enhanced congestion control algorithms,
client SDKs for all platforms, and some free quota.</p>
<p>To learn more about our cloud service, click <a class="" href="https://ossrs.io/lts/en-us/cloud">here</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/Multi-Platform-Streaming#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h3>
<p>Live streaming to multiple platforms is an effective way to reach a broader audience and increase engagement.
Oryx makes this process simple and efficient, allowing you to focus on creating quality content while it takes
care of the technical aspects. By following the steps outlined in this blog, you can easily set up live streaming
on multiple platforms like YouTube, Twitch, and Facebook, and take your content to the next level.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://ossrs.io/lts/en-us/blog/Multi-Platform-Streaming#contact" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Welcome for more discussion at <a href="https://discord.gg/bQUPDRqy79" target="_blank" rel="noopener noreferrer" class="">discord</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/2023-09-09-Multi-Platform-Streaming" alt="" class="img_ev3q"></p>]]></content>
        <category label="live streaming" term="live streaming"/>
        <category label="multi-platform streaming" term="multi-platform streaming"/>
        <category label="restreaming" term="restreaming"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Oryx - Ensuring Authentication in Live Streaming Publishing]]></title>
        <id>https://ossrs.io/lts/en-us/blog/Ensuring-Authentication-in-Live-Streaming-Publishing</id>
        <link href="https://ossrs.io/lts/en-us/blog/Ensuring-Authentication-in-Live-Streaming-Publishing"/>
        <updated>2023-08-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[In today's digital age, live streaming has become increasingly popular, with platforms like YouTube and]]></summary>
        <content type="html"><![CDATA[<p>In today's digital age, live streaming has become increasingly popular, with platforms like YouTube and
Twitch offering users the ability to broadcast their content in real-time. However, with this growing
popularity comes the need for enhanced security and authentication measures to protect both streamers
and viewers. In this comprehensive guide, we will delve into the importance of security and authentication
in live streaming, discuss the Oryx solution for secure publishing, and provide a step-by-step guide
on setting up the Oryx for your own live streaming service.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-importance-of-authentication-in-live-streaming">The Importance of Authentication in Live Streaming<a href="https://ossrs.io/lts/en-us/blog/Ensuring-Authentication-in-Live-Streaming-Publishing#the-importance-of-authentication-in-live-streaming" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>When publishing a live stream on platforms like YouTube or Twitch, users need to obtain a stream key
and use broadcasting software like OBS to publish the live stream to the platform. Maintaining the
confidentiality of your stream key is essential, as anyone who obtains it can stream on your behalf,
potentially publishing prohibited content and resulting in your account being blocked by the platform.</p>
<p>For those looking to build their own live streaming service, ensuring security and authentication
becomes even more critical. This is where the Oryx comes in, offering a solution for secure
publishing through the use of a publish secret.</p>
<p>However, an overly complex security design can also lead to confusion and difficulty for users,
making the streaming platform challenging to use. Therefore, it is crucial to implement a secure
yet straightforward solution for authenticating live streaming publishing.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-oryx-solution-for-secure-publishing">The Oryx Solution for Secure Publishing<a href="https://ossrs.io/lts/en-us/blog/Ensuring-Authentication-in-Live-Streaming-Publishing#the-oryx-solution-for-secure-publishing" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>The Oryx is a powerful tool that helps users build their own live streaming service with enhanced
security and authentication features. By utilizing a publish secret, the Oryx ensures that only
authorized users can publish streams, preventing unauthorized access and protecting your content.</p>
<p>To set up the Oryx for secure publishing, follow these steps:</p>
<ol>
<li class="">
<p>Create an Oryx with just one click. For detailed instructions, visit <a class="" href="https://ossrs.io/lts/en-us/blog/Oryx-Tutorial">How to Setup a Video Streaming Service by 1-Click</a></p>
</li>
<li class="">
<p>Upon creation, the Oryx will automatically generate a publish secret, such as <code>5181a08ee6eab86597e913e1f9e4c294</code>. You can set it from <code>System / Authentication / Update Stream Secret</code>.</p>
</li>
<li class="">
<p>Copy the OBS settings from <code>Scenarios / Streaming</code>, including the Server and StreamKey. For example, the Server might be <code>rtmp://135.98.31.15/live/</code>, and the StreamKey could be <code>livestream?secret=5181a08ee6eab86597e913e1f9e4c294</code>.</p>
</li>
<li class="">
<p>Open the HLS player to play the stream, such as <code>http://135.98.31.15/live/livestream.m3u8</code>.</p>
</li>
</ol>
<p>For example, you will get the following URLs:</p>
<ul>
<li class="">Publish URL: <code>rtmp://135.98.31.15/live/livestream?secret=5181a08ee6eab86597e913e1f9e4c294</code></li>
<li class="">Play URL: <code>http://135.98.31.15/live/livestream.m3u8</code></li>
</ul>
<p>Note that the secret is not included in the play stream URL, preventing viewers from knowing the publish
secret and ensuring they can only watch the stream, not publish it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="supporting-multiple-streams">Supporting Multiple Streams<a href="https://ossrs.io/lts/en-us/blog/Ensuring-Authentication-in-Live-Streaming-Publishing#supporting-multiple-streams" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>The Oryx allows users to support multiple streams by simply changing the resource name (stream name) as
needed. For example, change stream name from <code>livestream</code> to <code>movie</code>:</p>
<ul>
<li class="">Publish URL: <code>rtmp://135.98.31.15/live/movie?secret=5181a08ee6eab86597e913e1f9e4c294</code></li>
<li class="">Play URL: <code>http://135.98.31.15/live/movie.m3u8</code></li>
</ul>
<p>Or you can change <code>livestream</code> to <code>sport</code>:</p>
<ul>
<li class="">Publish URL: <code>rtmp://135.98.31.15/live/sport?secret=5181a08ee6eab86597e913e1f9e4c294</code></li>
<li class="">Play URL: <code>http://135.98.31.15/live/sport.m3u8</code></li>
</ul>
<p>You can use any name you prefer, for example, <code>the-10-years-anually-for-you</code>:</p>
<ul>
<li class="">Publish URL: <code>rtmp://135.98.31.15/live/the-10-years-anually-for-you?secret=5181a08ee6eab86597e913e1f9e4c294</code></li>
<li class="">Play URL: <code>http://135.98.31.15/live/the-10-years-anually-for-you.m3u8</code></li>
</ul>
<blockquote>
<p>Note: Please note that all streams share the same publish secret.</p>
</blockquote>
<p>The Oryx allows for an unlimited number of simultaneous streams, with the only constraint being your
server's bandwidth capacity. Additionally, you have the freedom to choose any desired stream name.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="limitations-of-the-oryx">Limitations of the Oryx<a href="https://ossrs.io/lts/en-us/blog/Ensuring-Authentication-in-Live-Streaming-Publishing#limitations-of-the-oryx" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Nevertheless, the Oryx has a few limitations.</p>
<p>As of now, it only supports authentication for publishing streams using a global secret applicable to
all streams. It does not provide individual secrets for each stream in an effort to maintain simplicity.</p>
<p>Additionally, unlike YouTube and Twitch, the Oryx does not support changing stream names, which use
different names for publishing and playing. This can be confusing and complex, as it requires an additional
system to manage the mapping of filenames.</p>
<p>Finally, the Oryx does not have authentication support for playing streams at the moment, making the
stream view public and accessible to anyone. If you would like to limit the playback of the stream, please
let us know. This feature is included in the milestone, but there is no specific timeline for its
implementation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service">Cloud Service<a href="https://ossrs.io/lts/en-us/blog/Ensuring-Authentication-in-Live-Streaming-Publishing#cloud-service" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>At SRS, our goal is to establish a non-profit, open-source community dedicated to creating an all-in-one,
out-of-the-box, open-source video solution for live streaming and WebRTC online services.</p>
<p>Additionally, we offer a <a class="" href="https://ossrs.io/lts/en-us/cloud">Cloud</a> service for those who prefer to use cloud service instead of building from
scratch. Our cloud service features global network acceleration, enhanced congestion control algorithms,
client SDKs for all platforms, and some free quota.</p>
<p>To learn more about our cloud service, click <a class="" href="https://ossrs.io/lts/en-us/cloud">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/Ensuring-Authentication-in-Live-Streaming-Publishing#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>In summary, security and authentication are vital aspects of live streaming, and the Oryx provides a
straightforward solution for those building their own streaming services. By following the steps outlined
in this guide, you can ensure that your live streaming service remains secure and accessible only to
authorized users.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://ossrs.io/lts/en-us/blog/Ensuring-Authentication-in-Live-Streaming-Publishing#contact" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Welcome for more discussion at <a href="https://discord.gg/bQUPDRqy79" target="_blank" rel="noopener noreferrer" class="">discord</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/2023-08-29-Ensuring-Authentication-for-Live-Streaming-Publishing" alt="" class="img_ev3q"></p>]]></content>
        <category label="live streaming" term="live streaming"/>
        <category label="security" term="security"/>
        <category label="authentication" term="authentication"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[SRS - Experience Ultra-Low Latency Live Streaming with OBS WHIP!]]></title>
        <id>https://ossrs.io/lts/en-us/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP</id>
        <link href="https://ossrs.io/lts/en-us/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP"/>
        <updated>2023-06-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[OBS now features WHIP support, with the patch having been recently merged. This enables]]></summary>
        <content type="html"><![CDATA[<p>OBS now features WHIP support, with the patch having been recently merged. This enables
various new functions and possibilities with OBS WHIP, as the latency drops from 1 second
to 200 milliseconds.</p>
<p>Without OBS WHIP, you can employ RTMP+WebRTC for live streaming, which results in a latency
of approximately 500ms. However, by using OBS WHIP, you can achieve low-latency live
streaming with a latency of around 200ms.</p>
<!-- -->
<p>Furthermore, even in situations with poor network connections or when streaming over the
internet, OBS WHIP maintains a consistently low and stable latency.</p>
<p>In this tutorial, I will demonstrate how to effortlessly utilize OBS WHIP with SRS in just
three simple steps.</p>
<p>The Oryx also supports OBS WHIP, enabling you to establish a WHIP service with just one click.
Refer to <a class="" href="https://ossrs.io/lts/en-us/blog/obs-whip-internet-service">Effortlessly Create a Public Internet WHIP Service for OBS</a>.</p>
<p>You can also watch the video on YouTube: <a href="https://youtu.be/SqrazCPWcV0" target="_blank" rel="noopener noreferrer" class="">Ultra Low Latency Streaming with OBS WHIP</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://ossrs.io/lts/en-us/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP#prerequisites" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Please install the following software before proceeding:</p>
<ul>
<li class=""><a href="https://obsproject.com/download" target="_blank" rel="noopener noreferrer" class="">OBS Studio</a></li>
</ul>
<blockquote>
<p>Note: OBS WHIP has been merged into the master branch and will be released in OBS 30.
You can download it from <a href="https://github.com/obsproject/obs-studio/releases/tag/30.0.0-rc1" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
</blockquote>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-run-srs">Step 1: Run SRS<a href="https://ossrs.io/lts/en-us/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP#step-1-run-srs" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Run the following command to start SRS:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">CANDIDATE="192.168.1.10"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">docker run --rm -it -p 1935:1935 -p 1985:1985 -p 8080:8080 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    --env CANDIDATE=$CANDIDATE -p 8000:8000/udp \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ossrs/srs:5 ./objs/srs -c conf/rtmp2rtc.conf</span><br></div></code></pre></div></div>
<blockquote>
<p>Note: Please set the CANDIDATE to your own IP. About CANDIDATE, please read <a class="" href="https://ossrs.io/lts/en-us/docs/v5/doc/webrtc#config-candidate">CANDIDATE</a></p>
</blockquote>
<p>For configuration details, refer to <a class="" href="https://ossrs.io/lts/en-us/docs/v5/doc/getting-started#webrtc-for-live-streaming">this post</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-run-obs">Step 2: Run OBS<a href="https://ossrs.io/lts/en-us/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP#step-2-run-obs" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Open OBS and click <code>Settings</code> to configure the following:</p>
<ol>
<li class="">Open OBS and click <strong>Settings</strong>.</li>
<li class="">Click <strong>Stream</strong> on the left sidebar.</li>
<li class="">Select <code>WHIP</code> for <strong>Service</strong>.</li>
<li class="">Set the <strong>Server</strong> to <code>http://localhost:1985/rtc/v1/whip/?app=live&amp;stream=livestream</code>.</li>
<li class="">Click <strong>OK</strong> to save the settings.</li>
<li class="">Click <strong>Start Streaming</strong> to start streaming.</li>
<li class="">If the latency is large, setup the OBS Output by: For OBS encoder, select the x264 encoder and in the advanced settings, set the GOP (Keyframe interval) to 1 s. Choose Preset as fast, Profile as baseline, and Tune as zerolatency.</li>
</ol>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-06-15-011-deacec98d951b217c462e98045fe9d88.png" width="576" height="159" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-play-the-stream">Step 3: Play the Stream<a href="https://ossrs.io/lts/en-us/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP#step-3-play-the-stream" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Open the following URL in your browser to play the stream:</p>
<p><a href="http://localhost:8080/players/whep.html" target="_blank" rel="noopener noreferrer" class="">http://localhost:8080/players/whep.html</a></p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-06-15-012-abe1b2c571cf5b9ebb287d0565d89d7a.png" width="720" height="450" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service-and-support">Cloud Service and Support<a href="https://ossrs.io/lts/en-us/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP#cloud-service-and-support" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>I tested the TRTC cloud service and it works great with OBS WHIP. If you're looking for
a WHIP cloud service that has 24/7 support, I definitely suggest trying TRTC. To see a
demo, click <a href="https://tencent-rtc.github.io/obs-trtc/" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service">Cloud Service<a href="https://ossrs.io/lts/en-us/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP#cloud-service" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>At SRS, our goal is to establish a non-profit, open-source community dedicated to creating an all-in-one,
out-of-the-box, open-source video solution for live streaming and WebRTC online services.</p>
<p>Additionally, we offer a <a class="" href="https://ossrs.io/lts/en-us/cloud">Cloud</a> service for those who prefer to use cloud service instead of building from
scratch. Our cloud service features global network acceleration, enhanced congestion control algorithms,
client SDKs for all platforms, and some free quota.</p>
<p>To learn more about our cloud service, click <a class="" href="https://ossrs.io/lts/en-us/cloud">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>In this tutorial, we explored the ultra-low latency live streaming capabilities of OBS WHIP and
demonstrated how to set it up with SRS in just three simple steps. OBS WHIP significantly reduces
latency, making it an excellent option for low-latency live streaming.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://ossrs.io/lts/en-us/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP#contact" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>If you're interested in discussing SRS, feel free to join us on <a href="https://discord.gg/yZ4BnPmHAd" target="_blank" rel="noopener noreferrer" class="">Discord</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/2023-06-15-Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP" alt="" class="img_ev3q"></p>]]></content>
        <category label="srs" term="srs"/>
        <category label="obs" term="obs"/>
        <category label="whip" term="whip"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[SRS - Unlock the Power of SRS, Real-World Use Cases.]]></title>
        <id>https://ossrs.io/lts/en-us/blog/unlock-the-power-of-srs-real-world-use-cases</id>
        <link href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-srs-real-world-use-cases"/>
        <updated>2023-05-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Discover SRS, the all-in-one open-source media server solution for seamless live streaming, content creation, and AI integration, simplifying broadcasting across platforms like YouTube, Facebook, Twitch, and TikTok.]]></summary>
        <content type="html"><![CDATA[<p>Discover SRS, the all-in-one open-source media server solution for seamless live streaming, content creation, and AI integration, simplifying broadcasting across platforms like YouTube, Facebook, Twitch, and TikTok.</p>
<!-- -->
<p>You can also watch the video on YouTube: <a href="https://youtu.be/WChYr6z7EpY" target="_blank" rel="noopener noreferrer" class="">Unlock the Power of SRS: Real-World Use Cases and Boosting Your Business with Simple Realtime Server.</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-srs-real-world-use-cases#introduction" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-05-22-001-da3c07638ea6857d97435f0c7583d0d4.png" width="1280" height="720" class="img_ev3q"></p>
<p>Hello, I'm Winlin!</p>
<p>I founded SRS, which stands for Simple Realtime Server, or "SARS" for short.</p>
<p>SRS is an easy-to-use, efficient, real-time video server that supports various protocols like RTMP, WebRTC, HLS, HTTP-FLV, SRT, and MPEG-DASH.</p>
<p>In this video, I'll talk about some common ways people use SRS.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="project-compare-an-open-source-media-gateway-server">Project Compare, an open-source media gateway server.<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-srs-real-world-use-cases#project-compare-an-open-source-media-gateway-server" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-05-22-002-87ade753517e7ea0390c98aa62c388aa.png" width="1280" height="720" class="img_ev3q"></p>
<p>There are several well-known open-source media servers out there, like NginxRTMP for live streaming, Janus and Mediasoup for WebRTC, and of course, SRS for everything.</p>
<p>We started the SRS project back in 2013, initially supporting RTMP and HLS with latencies of 1-3 seconds and 5-10 seconds, respectively. SRS also worked with HTTP-FLV and HTTP-TS, which are similar to RTMP.</p>
<p>In 2020, we expanded our community and added support for WebRTC and SRT, allowing for sub-second latency. SRT latency is around 300-500 ms, while WebRTC latency is between 80-200 ms.</p>
<p>SRS acts as a media gateway, converting between RTMP, SRT, and WebRTC, so you don't need three separate servers.</p>
<p>We've also updated our documentation and website, which you can check out at ossrs.io. SRS has come a long way, but there's still more to do. We're building a global community on Discord, helping many developers and earning their gratitude.</p>
<p>Now, let me introduce you to some of the ways people use SRS.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="live-origin-cluter-converting-streams-is-essential">Live Origin Cluter, converting streams is essential.<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-srs-real-world-use-cases#live-origin-cluter-converting-streams-is-essential" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-05-22-003-de69950c66117cf1b7d5068021558809.png" width="1280" height="720" class="img_ev3q"></p>
<p>The first use case is the origin cluster, which is a group of origin servers.</p>
<p>An origin server is a fundamental and essential server that works as an SRS gateway, receiving and converting streams from publishers.</p>
<p>Unlike Edge or Proxy servers that scale out the origin server, the origin server is critical. By default, an SRS server acts as an origin server, serving as a streaming hub that collects streams from various publishers.</p>
<p>You can send live streams via RTMP, SRT, or WebRTC to the origin server, which then converts them to HLS, HTTP-FLV, RTMP, SRT, and WebRTC.</p>
<p>You can also pull streams from the origin server, transcode, DVR, or forward them to other servers, and even deliver them to a CDN or create a CDN using SRS.</p>
<p>In short, this is a key feature of SRS.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vrtual-live-streaming-boosting-business-with-virtual-live-streaming">Vrtual Live Streaming, boosting business with virtual live streaming.<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-srs-real-world-use-cases#vrtual-live-streaming-boosting-business-with-virtual-live-streaming" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-05-22-004-532a8a3cecd249d56ac279bf0fe94c9f.png" width="1280" height="720" class="img_ev3q"></p>
<p>Are you a video blogger with lots of high-quality videos? Have you thought about setting up a live room to grow your business?</p>
<p>With Oryx, you can easily turn your video files into live streams and engage your audience without having to live-stream yourself.</p>
<p>Oryx lets you create virtual live-streaming 24/7 in just three steps: upload your videos, set up a live room (like a YouTube live room), and copy-paste the stream key to start live streaming.</p>
<p>It's easy, doesn't require any media streaming expertise, and Oryx can even restream your live streams to other platforms for free since it's open source.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="video-blogger-empower-video-bloggers-with-live-streaming">Video Blogger, empower video bloggers with live streaming.<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-srs-real-world-use-cases#video-blogger-empower-video-bloggers-with-live-streaming" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-05-22-005-109ac59d77750e9f7fae89c354f88fa7.png" width="1280" height="720" class="img_ev3q"></p>
<p>If you own a WordPress site, you may have considered adding live streaming, which was previously not possible due to WordPress's limitations.</p>
<p>But now, with the SRS Player WordPress plugin, you can incorporate live streaming using HTTP-FLV, HLS, and WebRTC, as well as video-on-demand streaming via HTTP-MP4.</p>
<p>Simply embed the live-streaming player with a WordPress shortcode, which you can find in the Oryx console.</p>
<p>This powerful plugin makes live streaming accessible to everyone, even in WooCommerce, a widely-used e-commerce plugin for WordPress, showcasing the impact of open source technology.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="unity-webrtc-streaming-make-unity-work-with-webrtc-sfu">Unity WebRTC Streaming, make Unity work with WebRTC SFU.<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-srs-real-world-use-cases#unity-webrtc-streaming-make-unity-work-with-webrtc-sfu" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-05-22-006-f04344b2a4d626b46538da8bb3990097.png" width="1280" height="720" class="img_ev3q"></p>
<p>SRS Unity shows how Unity developers can integrate live streaming with a WebRTC SDK that's compatible with SRS.</p>
<p>You can send the Unity Camera feed to SRS and play the stream in a browser, retrieve the stream from SRS and display it in a Unity game, or enable multiple Unity games to interact using WebRTC.</p>
<p>In this scenario, SRS serves as a WebRTC SFU server, which is essential for WebRTC Unity clients in a production setting.</p>
<p>WebRTC P2P isn't reliable in real-world situations, but an SFU server provides improved network quality, scalability, and support for WebRTC-RTMP conversion.</p>
<p>Plus, you can record WebRTC streams as video-on-demand files, and SRS works with the Unity WebRTC SDK, Unity AR, and VR.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="remote-broadcasting--content-creator-enables-remote-content-creation-in-broadcasting">Remote Broadcasting &amp; Content Creator, enables remote content creation in broadcasting.<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-srs-real-world-use-cases#remote-broadcasting--content-creator-enables-remote-content-creation-in-broadcasting" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-05-22-007-f4f3cbef84ab1629c45b8cbea945234a.png" width="1280" height="720" class="img_ev3q"></p>
<p>SRS can be employed in the broadcast industry to develop a remote content creation system.</p>
<p>The original camera feed is sent to SRS and accessed remotely by an editor, who adds watermarks and logos to the edited stream.</p>
<p>With SRT, latency is around 300-500 ms, enabling real-time editing and switching between camera feeds.</p>
<p>Low latency ensures all streams are synchronized, making it a powerful tool for remote content creation.</p>
<p>You can edit from a distance without being on location and produce multiple streams at once, even generating HDR content using HEVC or AV1.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="video--audio-ai-process-real-time-ai-processing-makes-more-possibilities">Video &amp; Audio AI Process, real-time AI processing makes more possibilities.<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-srs-real-world-use-cases#video--audio-ai-process-real-time-ai-processing-makes-more-possibilities" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-05-22-008-9dc2b5529391c5ea553e772c19cc6d3d.png" width="1280" height="720" class="img_ev3q"></p>
<p>SRS is also useful in the AI field for video and audio processing. Receive streams from SRS and process them with AI models, like using deepfake for face swapping.</p>
<p>SRS is compatible with AI models for audio processing, as shown by the srs-k2 project, which demonstrates how to use SRS with k2-fsa for ASR (Kaldi 2.0, a popular open-source ASR toolkit).</p>
<p>The end-to-end latency of srs-k2 is around 400-800 ms, and it can be used in WebRTC for multi-language real-time communication systems. This allows for conversations with people in various languages and integration with the AIGC system.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="hevcav1-for-avar8k-reduce-the-cost-significantly">HEVC/AV1 for AV/AR/8K, reduce the cost significantly.<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-srs-real-world-use-cases#hevcav1-for-avar8k-reduce-the-cost-significantly" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-05-22-009-75998bf2d4be942d3c0b8af8443a834e.png" width="1280" height="720" class="img_ev3q"></p>
<p>To cut your live-streaming expenses by half, think about using HEVC or AV1.</p>
<p>AV1 is a new, open-source, royalty-free video codec, but its hardware decoder isn't as common as HEVC. However, it's quickly gaining traction and looks promising for the future.</p>
<p>HEVC is a widely adopted codec in the industry, supported by OBS through RTMP and SRT. Send the HEVC stream to SRS using OBS, and play the stream with H5 player, mpegjs.js, VLC, or ffplay.</p>
<p>HEVC or AV1 is essential for 8K live-streaming and is becoming popular in the VR/AR field.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="restream-to-multiple-platforms-restream-to-multiple-platforms-without-extra-cost">Restream to Multiple Platforms, restream to multiple platforms without extra cost.<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-srs-real-world-use-cases#restream-to-multiple-platforms-restream-to-multiple-platforms-without-extra-cost" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-05-22-010-356af7c3c5c366acb960ec46829babf3.png" width="1280" height="720" class="img_ev3q"></p>
<p>Do you want to broadcast your live streams on multiple platforms like YouTube, Facebook, Twitch, and TikTok?</p>
<p>The Oryx simplifies this task and doesn't use up your bandwidth since it takes care of the restreaming for you.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="srs-prometheus-exporter-make-srs-an-operatable-online-product">SRS Prometheus Exporter, make SRS an operatable online product.<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-srs-real-world-use-cases#srs-prometheus-exporter-make-srs-an-operatable-online-product" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-05-22-011-06f22497bcc6b4af8cf48dee95b2fa7c.png" width="1280" height="720" class="img_ev3q"></p>
<p>Prometheus, a well-known open-source monitoring system, is natively supported by SRS through its exporter, letting you keep an eye on the SRS server.</p>
<p>Visualize metrics with Grafana, and look forward to Prometheus and Grafana being integrated into the Oryx in the future.</p>
<p>To back the project, think about donating via OpenCollective.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service">Cloud Service<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-srs-real-world-use-cases#cloud-service" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>At SRS, our goal is to establish a non-profit, open-source community dedicated to creating an all-in-one,
out-of-the-box, open-source video solution for live streaming and WebRTC online services.</p>
<p>Additionally, we offer a <a class="" href="https://ossrs.io/lts/en-us/cloud">Cloud</a> service for those who prefer to use cloud service instead of building from
scratch. Our cloud service features global network acceleration, enhanced congestion control algorithms,
client SDKs for all platforms, and some free quota.</p>
<p>To learn more about our cloud service, click <a class="" href="https://ossrs.io/lts/en-us/cloud">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="support-contributions-and-donations-are-welcome">Support, contributions and donations are welcome.<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-srs-real-world-use-cases#support-contributions-and-donations-are-welcome" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-05-22-012-42ee2d44cd9265f8bc014565d00bbff5.png" width="1280" height="720" class="img_ev3q"></p>
<p>Thanks for watching this video on SRS (Simple Realtime Server). If you found it helpful, please give it a thumbs up
and subscribe to our channel for more short videos like this. See you in the next one!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://ossrs.io/lts/en-us/blog/unlock-the-power-of-srs-real-world-use-cases#contact" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Welcome for more discussion at <a href="https://discord.gg/bQUPDRqy79" target="_blank" rel="noopener noreferrer" class="">discord</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/2023-05-22-Unlock-the-Power-of-SRS-Real-World-Use-Cases" alt="" class="img_ev3q"></p>]]></content>
        <category label="srs" term="srs"/>
        <category label="use-case" term="use-case"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[SRS - How to Stream YouTube Using a Web Browser]]></title>
        <id>https://ossrs.io/lts/en-us/blog/how-to-stream-youtube-using-a-web-browser</id>
        <link href="https://ossrs.io/lts/en-us/blog/how-to-stream-youtube-using-a-web-browser"/>
        <updated>2023-05-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Written by Winlin and GPT4]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p>Written by <a href="https://github.com/winlinvip" target="_blank" rel="noopener noreferrer" class="">Winlin</a> and GPT4</p>
</blockquote>
<p>While Open Broadcaster Software (OBS) is a widely used solution for live-streaming to YouTube via RTMP or RTMPS, there is an alternative approach that leverages a web browser.</p>
<p>This method involves streaming your camera using WebRTC within a webpage, then employing Simple Realtime Server (SRS) to convert WebRTC to RTMP, and using FFmpeg to publish the RTMP stream to YouTube. For those who prefer RTMPS, FFmpeg can be utilized to extract the stream from SRS via RTMP, transcode it to RTMPS, and subsequently publish it to YouTube.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-setting-up-srs">Step 1: Setting Up SRS<a href="https://ossrs.io/lts/en-us/blog/how-to-stream-youtube-using-a-web-browser#step-1-setting-up-srs" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>First, obtain SRS by cloning it from the GitHub repository:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">git clone https://github.com/ossrs/srs.git</span><br></div></code></pre></div></div>
<p>Then, compile SRS by executing:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">./configure &amp;&amp; make</span><br></div></code></pre></div></div>
<p>Lastly, launch SRS with the command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">./objs/srs -c conf/rtc2rtmp.conf</span><br></div></code></pre></div></div>
<p>To confirm the successful installation, access <a href="http://localhost:8080/" target="_blank" rel="noopener noreferrer" class="">http://localhost:8080</a> in your web browser.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-streaming-webrtc-to-srs">Step 2: Streaming WebRTC to SRS<a href="https://ossrs.io/lts/en-us/blog/how-to-stream-youtube-using-a-web-browser#step-2-streaming-webrtc-to-srs" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Open the webpage <a href="http://localhost:8080/players/whip.html" target="_blank" rel="noopener noreferrer" class="">http://localhost:8080/players/whip.html</a> to transmit your camera stream to SRS via WebRTC.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-05-16-001-2d0c7f99e59339f83f8d9efafb9c4d77.png" width="720" height="400" class="img_ev3q"></p>
<p>To preview the RTMP stream, utilize VLC to play <code>rtmp://localhost/live/livestream</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-routing-rtmp-to-youtube">Step 3: Routing RTMP to YouTube<a href="https://ossrs.io/lts/en-us/blog/how-to-stream-youtube-using-a-web-browser#step-3-routing-rtmp-to-youtube" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Access the YouTube live-streaming dashboard at <a href="https://youtube.com/livestreaming/dashboard" target="_blank" rel="noopener noreferrer" class="">https://youtube.com/livestreaming/dashboard</a>.</p>
<p>Acquire the stream server (e.g., <code>rtmp://a.rtmp.youtube.com/live2</code>) and stream key (e.g., <code>9xxx-8yyy-3zzz-3iii-7jjj</code>).</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-05-16-002-18ec54002497e911a0df182b58f978d3.png" width="720" height="447" class="img_ev3q"></p>
<p>Use FFmpeg to extract the RTMP stream from SRS and forward it to YouTube with this command:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">ffmpeg -i rtmp://localhost/live/livestream -c copy \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -f flv rtmp://a.rtmp.youtube.com/live2/9xxx-8yyy-3zzz-3iii-7jjj</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/lts/en-us/assets/images/blog-2023-05-16-003-5d6cb0bf2548f1b78da0b79920c33548.png" width="720" height="515" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-routing-rtmps-to-youtube">Step 4: Routing RTMPS to YouTube<a href="https://ossrs.io/lts/en-us/blog/how-to-stream-youtube-using-a-web-browser#step-4-routing-rtmps-to-youtube" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>To transmit the stream via RTMPS, modify the RTMP URL from <code>rtmp://a.rtmp.youtube.com/live2/9xxx-8yyy-3zzz-3iii-7jjj</code> to the RTMPS URL, such as <code>rtmps://a.rtmp.youtube.com:443/live2/9xxx-8yyy-3zzz-3iii-7jjj</code>.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">ffmpeg -i rtmp://localhost/live/livestream -c copy \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -f flv rtmps://a.rtmp.youtube.com:443/live2/9xxx-8yyy-3zzz-3iii-7jjj</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cloud-service">Cloud Service<a href="https://ossrs.io/lts/en-us/blog/how-to-stream-youtube-using-a-web-browser#cloud-service" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>At SRS, our goal is to establish a non-profit, open-source community dedicated to creating an all-in-one,
out-of-the-box, open-source video solution for live streaming and WebRTC online services.</p>
<p>Additionally, we offer a <a class="" href="https://ossrs.io/lts/en-us/cloud">Cloud</a> service for those who prefer to use cloud service instead of building from
scratch. Our cloud service features global network acceleration, enhanced congestion control algorithms,
client SDKs for all platforms, and some free quota.</p>
<p>To learn more about our cloud service, click <a class="" href="https://ossrs.io/lts/en-us/cloud">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://ossrs.io/lts/en-us/blog/how-to-stream-youtube-using-a-web-browser#conclusion" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>By adhering to these instructions, you can effectively live stream to YouTube via RTMP or RTMPS using a web browser.
This technique offers a practical alternative to OBS, enabling you to harness the power of WebRTC, SRS, and FFmpeg
for a smooth and efficient streaming experience.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="contact">Contact<a href="https://ossrs.io/lts/en-us/blog/how-to-stream-youtube-using-a-web-browser#contact" class="hash-link" aria-label="Direct link to heading" title="Direct link to heading" translate="no">​</a></h2>
<p>Welcome for more discussion at <a href="https://discord.gg/bQUPDRqy79" target="_blank" rel="noopener noreferrer" class="">discord</a>.</p>
<p><img decoding="async" loading="lazy" src="https://ossrs.io/gif/v1/sls.gif?site=ossrs.io&amp;path=/lts/blog-en/2023-05-16-Stream-YouTube-Using-Web-Browser" alt="" class="img_ev3q"></p>]]></content>
        <category label="youtube" term="youtube"/>
        <category label="rtmp" term="rtmp"/>
        <category label="rtmps" term="rtmps"/>
        <category label="webrtc" term="webrtc"/>
        <category label="srs" term="srs"/>
        <category label="ffmpeg" term="ffmpeg"/>
    </entry>
</feed>