Skip to main content
版本:7.0 (Unstable) 🚧

Oryx

Oryx(SRS Stack)是一个基于Go、Reactjs、SRS、FFmpeg、WebRTC等的轻量级、开源的视频云解决方案。

Introduction

Oryx作为开源的开箱即用的音视频方案,是完全基于场景构建的。 常见的比如推拉流场景,支持各种不同协议的推拉流, 并且支持嵌入到WordPress等网站。

比如录制场景,支持合并多次推流,支持设置过滤器,只录制特定的流。比如转发和虚拟直播,可以将文件和其他流,转发到不同的平台, 或者转发到Oryx自身。比如AI自动字幕,可以使用OpenAI的能力,自动识别字幕并将字幕嵌入到视频流中。比如一键自动HTTPS, 可以非常方便的开启HTTPS能力。

未来还会有更多丰富的场景。

FAQ

若使用Oryx时遇到问题,请先阅读FAQ

Usage

请根据你的平台,选择安装方式。

Remark: 请选择Ubuntu 20系统,其他系统可能会碰到一些奇怪的问题。

Docker

推荐使用Docker运行Oryx:

docker run --restart always -d -it --name oryx -v $HOME/data:/data \
  -p 80:2022 -p 443:2443 -p 1935:1935 -p 8000:8000/udp -p 10080:10080/udp \
  registry.cn-hangzhou.aliyuncs.com/ossrs/oryx:5

请打开页面http://localhost开始使用Oryx。

关于使用说明,请参考 Oryx Docker

HELM

推荐使用HELM安装和运行Oryx:

helm repo add srs http://helm.ossrs.io/stable
helm install srs srs/oryx --set persistence.path=$HOME/data \
  --set service.http=80 --set service.https=443 --set service.rtmp=1935 \
  --set service.rtc=8000 --set service.srt=10080

请打开页面http://localhost开始使用Oryx。

BT

Oryx提供了宝塔插件,使用方法参考宝塔插件

Script

对于 Ubuntu 20+,您可以下载 linux-oryx-zh.tar.gz 并安装它。

AWS Lightsail

Oryx支持AWS Lightsail,这是AWS提供的一种虚拟专用服务器(VPS)服务。请参阅如何一键建立视频流媒体服务

TencentCloud LightHouse

在国内做流媒体或RTC业务,可以在腾讯云轻量服务器上购买Oryx,参考Oryx:起步、购买和入门

Changelog

关于Oryx的更新日志,参考CHANGELOG

某个具体版本支持的具体功能,可以在版本发布中查看CHANGELOG,参考Releases

Features

关于Oryx的功能以及与SRS的比较,详细的功能清单参考Features

Compare to SRS

在比较Oryx和SRS时,两者都提供相似级别的媒体流功能。然而,Oryx为终端用户提供了更强大且功能丰富的体验, 无需编写任何代码。用户可以直接使用Oryx满足您的媒体服务需求。

比较OryxSRS说明
许可证MITMITSRS是MIT,而Oryx是MIT。
直播流YesYes两者都支持RTMP,HLS和HTTP-FLV协议。
WebRTCYesYes两者都支持WebRTC。
Auto HTTPSYesNoOryx自动申请和更新HTTPS证书.
控制台增强HTTP APIOryx提供了更强大的控制台。
身份验证YesHTTP回调Oryx具有内置身份验证,而SRS使用回调。
DVR增强基于文件Oryx支持将DVR存储到文件和云存储。
转发增强基本Oryx可以通过各种协议转发到多个平台。
虚拟直播YesNoOryx提供了先进的虚拟直播功能。
WordPressYesNoOryx提供了WordPress插件和操作指南。
转码YesNoOryx提供了直播转码的能力。
AI字幕YesNo自动识别直播语音并转为字幕,叠加到视频
直播间YesNo直播间的鉴权和业务功能
视频翻译YesNo支持点播视频多语言翻译

Streaming and Authentication

Oryx支持基于SRS回调的带身份验证的增强流媒体。Oryx生成并将流令牌保存到Redis中,并在用户通过RTMP、 SRT或WHIP/WebRTC发布流时验证流令牌。

Oryx还代理并保护SRS的所有HTTP API,因此只有经过身份验证的用户才能访问HTTP API和控制台。

DVR

Oryx 支持 DVR 或录制功能,将实时流转换为文件,然后保存到本地磁盘或云存储中。 我们还支持将多个重新发布会话合并到一个 DVR 文件中,并支持设置过滤器来录制指定的流。

详细信息请参阅服务器端录制和 AWS S3 集成的指南

Automatic HTTPS

Oryx 支持自动 HTTPS,只需点击一下,您就可以为您的 Oryx 启用 HTTPS。Oryx 将自动从 Let's Encrypt 请求和更新 HTTPS 证书。自动 HTTPS 允许 WHIP 或通过网页发布,同时支持 WebRTC,并访问用户的麦克风。

详细信息请参阅如何通过一键开启HTTPS

Virtual Live Events

您可以使用预先录制的视频来模拟现场活动。您只需1个视频文件就可以进行7x24小时的直播。您还可以将流拉到您的直播间,使直播更强大。 您甚至可以将您的IP摄像头流拉到您的直播间。

请参阅虚拟直播摄像头直播

Restream

使用Oryx,您可以将流媒体重新发送到多个平台。Oryx会自动选择一个流进行转发,因此您可以发布多个流作为容错或备份流, 当某个流中断时,Oryx会切换到另一个流。

请参阅多平台转播以获取详细信息。

AI Transcription

Oryx支持由OpenAI提供支持的AI转录功能,将实时语音转换为文本并叠加到视频流中作为新的实时流。借助此功能,您可以吸引更多观众, 特别是对于有听力障碍的人或非母语者。

请参阅AI自动字幕以获取详细信息。

Transcode

Oryx支持对实时流进行转码,以降低比特率、节省带宽和成本,或过滤实时流内容以使其更优。

详细信息请参阅直播转码

AI Products

我们正在Oryx中实现各种AI的工具和产品,这里是最新的状态,我们会持续更新这个文档。

  1. 直播AI字幕,对接的OpenAI的Whisper实现的语音转文字,然后将文字字幕叠加到直播中,实现直播的自动字幕。
    • 状态:已经完成,可以在Oryx中使用。参考AI自动字幕
  2. 直播间AI助手,在直播间放一个AI当助手,可以让助手帮自己回答问题,或者完成直播中的一些任务。
  3. 点播视频翻译,可以将英文视频翻译成中文了学习英文,或者制作多语言的视频,在教育和电商中用的比较多。
  4. 流OCR:从直播中的图像提取文本,实现实时文本识别和翻译,适用于各种应用。

如果你对我们的AI产品感兴趣,可以关注我们的公众号后,在公众号菜单选择AI产品,可以加入微信群,和我们一起讨论。

HTTP API

你可以打开系统配置 > OpenAPI来获取Bearer鉴权并尝试HTTP API。

你可以点击网页上的按钮请求HTTP API,也可以使用curl或js代码请求HTTP API。请按照网页上的说明操作,例如, 使用curl请求HTTP API:

curl http://localhost/terraform/v1/mgmt/versions

或使用Bearer鉴权:

curl http://localhost/terraform/v1/hooks/srs/secret/query \
  -X POST -H 'Authorization: Bearer xxxxxx' \
  -H 'Content-Type: application/json' --data '{}'

Note: 你可以打开系统配置 > OpenAPI来获取Bearer鉴权并尝试HTTP API。

Note:网页可能使用JWT鉴权,但您也可以使用Bearer鉴权请求HTTP API。

除了页面列出的示例API之外,所有后台页面上的操作,你都可以通过HTTP API实现。要知道每个API的请求和响应,请打开谷歌Chrome, 导航至视图 > 开发人员 > 开发者工具,点击网络选项卡,然后检查相关的API交互。

Oryx还代理了SRS HTTP API,前缀为/api/v1/,例如:

curl http://localhost/api/v1/versions

或使用Bearer鉴权:

curl http://localhost/api/v1/vhosts/ \
  -X GET -H 'Authorization: Bearer xxxxxx' \
  -H 'Content-Type: application/json'

Note: 你可以打开系统配置 > OpenAPI来获取Bearer鉴权并尝试HTTP API。

请阅读SRS HTTP API了解API的详细信息。

HTTP Callback

HTTP回调是指在Docker容器中运行的Oryx,向target URL发起HTTP请求。例如,以下过程说明了当OBS发送RTMP流时, Oryx会给你的服务器发起一个请求,你可以通过target URL来配置你的服务器地址。

                   +-----------------------+
                   +                       +
+-------+          +     +-----------+     +                 +--------------+
+  OBS  +--RTMP->--+-----+ Oryx +-----+----HTTP--->-----+  Your Server +
+-------+          +     +-----------+     +  (Target URL)   +--------------+
                   +                       +
                   +       Docker          +
                   +-----------------------+

所有请求的格式是json:

  • Content-Type: application-json

所有响应都应该遵守:

  • 成功:Status: 200 OK and "code": 0
  • 其他代表失败或错误。

关于如何实现回调的处理,请参考HTTP Callback

HTTP Callback: Connectivity Check

有时,您可能需要验证网络是否可访问并确定要使用的适当目标URL。通过在Docker容器内使用curl命令,您可以模拟此请求并确认 target URL是否可以通过curl或Oryx访问。

首先,在Oryx的容器中安装curl:

docker exec -it oryx apt-get update -y
docker exec -it oryx apt-get install -y curl

然后,用curl模拟Oryx发起一个HTTP请求:

docker exec -it oryx curl http://your-target-URL

你可以使用任何合法的target URL来测试,包括:

  • 内网IP:http://192.168.1.10/check
  • 公网IP:http://159.133.96.20/check
  • HTTP地址,使用域名: http://your-domain.com/check
  • HTTPS地址,使用域名:https://your-domain.com/check

请记住,您应在Oryx Docker中测试与target URL的连通性,并避免从其他服务器运行curl命令。

HTTP Callback: on_publish

For HTTP callback on_publish event:

Request:
{
  "request_id": "3ab26a09-59b0-42f7-98e3-a281c7d0712b",
  "action": "on_publish",
  "opaque": "mytoken",
  "vhost": "__defaultVhost__",
  "app": "live",
  "stream": "livestream",
  "param": "?secret=8f7605d657c74d69b6b48f532c469bc9"
}

Response:
{
  "code": 0
}
  • Allow publishing if response success.
  • Reject publishing if response error.

HTTP Callback: on_unpublish

For HTTP callback on_unpublish event:

Request:
{
  "request_id": "9ea987fa-1563-4c28-8c6c-a0e9edd4f536",
  "action": "on_unpublish",
  "opaque": "mytoken",
  "vhost": "__defaultVhost__",
  "app": "live",
  "stream": "livestream"
}

Response:
{
  "code": 0
}
  • Ignore any response error.

HTTP Callback: on_record_begin

For HTTP callback on_record_begin event:

Request:
{
  "request_id": "80ad1ddf-1731-450c-83ec-735ea79dd6a3",
  "action": "on_record_begin",
  "opaque": "mytoken",
  "vhost": "__defaultVhost__",
  "app": "live",
  "stream": "livestream",
  "uuid": "824b96f9-8d51-4046-ba1e-a9aec7d57c95"
}

Response:
{
"code": 0
}
  • Ignore any response error.

HTTP Callback: on_record_end

For HTTP callback on_record_end event:

Request:
{
  "request_id": "d13a0e60-e2fe-42cd-a8d8-f04c7e71b5f5",
  "action": "on_record_end",
  "opaque": "mytoken",
  "vhost": "__defaultVhost__",
  "app": "live",
  "stream": "livestream",
  "uuid": "824b96f9-8d51-4046-ba1e-a9aec7d57c95",
  "artifact_code": 0,
  "artifact_path": "/data/record/824b96f9-8d51-4046-ba1e-a9aec7d57c95/index.mp4",
  "artifact_url": "http://localhost/terraform/v1/hooks/record/hls/824b96f9-8d51-4046-ba1e-a9aec7d57c95/index.mp4"
}

Response:
{
  "code": 0
}
  • The uuid is the UUID of record task.
  • The artifact_code indicates the error code. If no error, it's 0.
  • The artifact_path is the path of artifact mp4 in the container.
  • The artifact_url is the URL path to access the artifact mp4.
  • Ignore any response error.

HTTP Callback: on_ocr

For HTTP callback on_ocr event:

Request:
{
  "request_id": "d13a0e60-e2fe-42cd-a8d8-f04c7e71b5f5",
  "action": "on_ocr",
  "opaque": "mytoken",
  "vhost": "__defaultVhost__",
  "app": "live",
  "stream": "livestream",
  "uuid": "824b96f9-8d51-4046-ba1e-a9aec7d57c95",
  "prompt": "What is in the image?",
  "result": "The image shows a scene featuring a character from a film, likely set in a military or high-tech environment."
}

Response:
{
  "code": 0
}
  • The uuid is the UUID of OCR task.
  • The prompt the AI model used for OCR.
  • The result is the OCR result.
  • Ignore any response error.