OvenMediaEngine 0.21.0 配置参数详解
OvenMediaEngine 0.21.0 Server.xml 逐段详解:Bind/Providers/Publishers、API 认证、vHost、转码与 ABR Playlist,含实测报错原文与生产模板
OvenMediaEngine 0.21.0 配置参数详解
目标:逐段讲清 OvenMediaEngine(OME)v0.21.0 的
Server.xml配置结构——从端口绑定、API 认证,到虚拟主机、转码档位与 ABR 播放列表,覆盖每个核心参数的含义、默认值与常见踩坑点。文中所有「实测」结论与报错原文均来自 Ubuntu 24.04 服务器上 OME v0.21.0 的真实部署(部署过程见《OvenMediaEngine 0.21.0 Docker Compose 部署指南》)。
一、环境信息
- 验证版本:OvenMediaEngine v0.21.0(官方最新稳定版,2026-08-13 发布;本文写作时实查 GitHub Releases)
- 配置文件版本:
<Server version="8">(v0.21 镜像内置默认配置的根元素声明) - 实测环境:Ubuntu 24.04(x86_64,内核 7.0.0-38-generic),Docker Compose 部署,配置以只读方式挂载覆盖
/opt/ovenmediaengine/bin/origin_conf/Server.xml - 验证时间:2026-10-29
- 配置生效方式实测:OME 无热加载,修改
Server.xml后执行docker compose restart即生效(实测无需重建容器);配置校验失败会直接拒绝启动并以Exit(1)退出
二、前置条件
- 已按《OvenMediaEngine 0.21.0 Docker Compose 部署指南》完成基础部署,能拿到启动日志;
- 知道你的配置文件位置:源码/包安装默认在
/usr/local/ovenmediaengine/origin_conf/Server.xml,Docker 部署为挂载进容器的Server.xml(容器内路径/opt/ovenmediaengine/bin/origin_conf/Server.xml); - 了解 XML 严格校验:v0.21 对未知元素默认直接拒绝启动(实测报错原文见第七节),改配置前建议先备份。
三、参数查看与修改方式
| 操作 | 命令/方式 | 说明 |
|---|---|---|
| 查看当前配置 | cat /opt/ovenmediaengine-compose/Server.xml(Docker 部署即宿主文件) | 建议直接读宿主挂载源 |
| 提取镜像内置默认配置 | docker run --rm airensoft/ovenmediaengine:v0.21.0 cat /opt/ovenmediaengine/bin/origin_conf/Server.xml | 实测可用,输出 <Server version="8"> 结构 |
| 校验配置 | 启动后看日志 `Config | Trying to load configurations... (origin_conf/Server.xml)` 之后是否出现 error 行 |
| 修改生效 | docker compose restart | 实测重启后新配置生效;无热加载 |
| 环境变量覆盖 | ${env:VAR_NAME:default} 语法写在 XML 值中 | 仅覆盖端口/IP 类值,见第六节 |
💡 日志双通道:启动与运行日志同时输出到 stdout 与容器内日志文件
/var/log/ovenmediaengine/ovenmediaengine.log。部分W/E级别详情只在日志文件中(如Publisher is disabled by configuration、Empty <AccessToken> is not allowed),排障时以日志文件为准。
四、参数总览
v0.21.0 默认 Server.xml 的完整结构树(缩进即父子关系,{注释} 为默认被注释、需手工启用的段):
<Server version="8">
├── <Name> 实例名
├── <Type> origin / edge(集群角色)
├── <IP> 监听 IP(* 为全部)
├── <PrivacyProtection> 日志脱敏开关
├── <StunServer> STUN 服务器(解析公网 IP 供 WebRTC 候选)
├── <Modules> 引擎级模块开关
│ ├── <HTTP2> HTTP/2(LLHLS over h2 依赖)
│ ├── <LLHLS> LLHLS 模块总开关
│ ├── <P2P> WebRTC P2P(实验特性,默认关)
│ ├── <Jemalloc> 内存分配器调优
│ └── <TaskPool> 共享任务线程池
├── <Bind> 端口绑定(谁监听哪个端口)
│ ├── {<Managers><API>} REST API 监听端口(默认注释)
│ ├── <Providers> 推/拉流接入端口:RTSPC、OVT、RTMP、SRT、{MPEGTS}、WebRTC
│ └── <Publishers> 分发端口:OVT、LLHLS、WebRTC
│ (HLS/File/Push/Thumbnail 未绑定即禁用)
├── {<Managers><API><AccessToken>} REST API 访问令牌(默认缺失,启用 API 必加)
├── <Defaults> 全局默认(CrossDomains/CORS)
└── <VirtualHosts>
└── <VirtualHost>
├── <Name> / <Distribution>
├── <Host> 域名/IP 匹配 + TLS 证书
├── {<SignedPolicy>} 签名授权(默认注释)
├── {<OriginMapStore>} Origin-Edge Redis 登记簿(默认注释)
├── <CrossDomains> 本 vHost 的 CORS
└── <Applications>
└── <Application>
├── <Name> / <Type> 应用名与类型(live/vod)
├── <OutputProfiles> 转码输出与 ABR 播放列表
│ └── <OutputProfile>
│ ├── <OutputStreamName>
│ ├── <Playlist> 播放列表与档位组合
│ └── <Encodes> 编码器定义(bypass/重编码)
└── <Providers> 本应用启用的接入协议
五、核心参数分类详解
5.1 <Server> 根元素与 <Modules>
| 参数 | 默认值 | 说明 |
|---|---|---|
<Server version="8"> | — | 配置 schema 版本号,v0.21 为 8;旧版本配置需人工迁移 |
<Name> | OvenMediaEngine | 实例名,仅用于标识 |
<Type> | origin | origin(持有流源)/ edge(从 Origin 拉流分发),决定 OVT 行为 |
<IP> | * | 所有监听端口的绑定 IP |
<PrivacyProtection> | false | true 时日志中 IP 打码 |
<StunServer> | stun.ovenmediaengine.com:13478 | 启动时通过 STUN 解析公网 IP;实测日志 Resolved public IP address (...) from stun server (...)。无公网出口的环境改用 OME_HOST_IP 显式指定 |
Modules/HTTP2/Enable | true | LLHLS 在 TLS 下走 h2;未配 TLS 的 3333 端口自动降级 HTTP/1.1(实测 LLHLS 特征头 PART-HOLD-BACK 正常返回) |
Modules/LLHLS/Enable | true | LLHLS 模块总开关 |
Modules/P2P/Enable | false | WebRTC P2P 实验特性;开启后日志出现 Signalling.P2P 相关行,实测默认关闭时打印 P2P is disabled in the configuration |
Modules/Jemalloc/BackgroundPurge | true | 后台内存回收线程(实测启动日志 Jemalloc background purge thread is enabled.) |
Modules/TaskPool | 4 线程 / 128 任务 | 共享短任务线程池(实测启动日志 TaskPool is configured - threads: 4, max tasks: 128) |
5.2 <Bind>:端口绑定
<Bind> 决定「哪些组件监听哪些端口」,是 v0.21 最容易出错的一段——未出现在 Bind 中的 Provider/Publisher 一律禁用。
Bind/Providers(接入侧)
| 参数 | 默认 | 实测行为 |
|---|---|---|
RTSPC/WorkerCount | 1 | RTSP 拉流客户端(无端口,纯出站),日志 RTSPCProvider has been started. |
OVT/WorkerCount | 1 | 从 Origin/Edge 拉流,日志 OVTProvider has been started. |
RTMP/Port | ${env:OME_RTMP_PROV_PORT:1935} | 实测监听 RTMPProvider is listening on *:1935 |
SRT/Port | ${env:OME_SRT_PROV_PORT:9999} | 实测监听 SrtProvider is listening on *:9999/SRT |
MPEGTS/Port | 注释态(4000-4005/udp) | 默认禁用,实测日志 MPEGTSProvider is disabled by configuration;启用后按端口映射流名(stream_${Port}) |
WebRTC/Signalling/Port | ${env:OME_WEBRTC_SIGNALLING_PORT:3333} | WebSocket 信令端口 |
WebRTC/IceCandidates/IceCandidate | ${OME_HOST_IP:*}:${OME_WEBRTC_CANDIDATE_PORT:10000-10003/udp} | UDP 候选,每个端口一个线程,端口段扩核;实测单端口收敛后日志 ICE ports are listening on *:10000/TCP, *:10000/UDP |
WebRTC/IceCandidates/TcpRelay | ${OME_HOST_IP:*}:3478 | 内嵌 TURN(RFC 6544 直连 ICE 不通时的中继),实测 TURN port is listening on *:3478/TCP |
TcpRelayForce | false | true 时强制所有 WebRTC 会话走 TURN |
Bind/Publishers(分发侧)
| 参数 | 默认 | 实测行为 |
|---|---|---|
OVT/Port | 9000 | Origin-Edge 分发,实测 OVTPublisher is listening on *:9000/TCP... |
LLHLS/Port + TLSPort | 3333 / 3334 | fMP4 低延迟 HLS;与 WebRTC 信令同端口复用(HTTP Server 按 URL 分流)。未绑定即整组禁用 |
WebRTC/Signalling | 3333 | 同上,默认启用 |
<HLS>(HLSv3) | 缺失 = 禁用 | 实测日志文件中 HLSv3 Publisher is disabled by configuration(hls_publisher.cpp:78);在 Bind/Publishers 下新增 <HLS><Port>3333</Port></HLS> 后启用,播放列表 URL 为 ts: 前缀形式 |
<SRT>(SRT 回放) | 缺失 = 禁用 | 实测 SRTPublisher is disabled by configuration;启用后 SRT 播放地址同 SRT 推流端口 |
<File> / <Push> / <Thumbnail> | 缺失 = 禁用 | 录制/转推/缩略图;实测 Thumbnail 禁用行 ThumbnailPublisher is disabled by configuration |
⚠️ 「禁用」与「监听失败」的区分:禁用组件在启动横幅后只有
Trying to create ...行而无has been started行(stdout),确证性disabled by configuration警告在日志文件里;排障先看日志文件再下结论。
Bind/Managers/API(管理面监听)
默认整段注释。启用 REST API 需取消注释:
<Managers>
<API>
<Port>${env:OME_API_PORT:8081}</Port>
<WorkerCount>1</WorkerCount>
</API>
</Managers>
⚠️ 这里只能放
<Port>/<WorkerCount>。实测把<AccessToken>写进这一层会报Unknown item found: Server.bind.managers.api.AccessToken in origin_conf/Server.xml并退出(main.cpp:353,报错原文见第七节)。令牌属于另一处——见 5.3。
5.3 <Managers>(Server 直属):API 访问令牌
v0.21 的访问令牌位于 <Server> 直属的 <Managers>(与 <Bind> 平级,默认整段缺失):
<Managers>
<API>
<AccessToken>q1w2e3r4</AccessToken>
</API>
</Managers>
实测要点:
- 缺失
<AccessToken>时 API 模块拒绝启动并退出进程,日志文件中为APIServer | api_server.cpp:56 | Empty <AccessToken> is not allowed(E级别); - 令牌正确配置后,REST API 认证头为
Authorization: Basic base64(<AccessToken>)——token 原样编码、末尾不带冒号。实测三种形态:无凭据 401、base64("q1w2e3r4:")(带冒号)401、base64("q1w2e3r4")200; - 源码佐证:空令牌仅允许 Debug 构建(
api_server.cpp:54有An empty <AccessToken> setting was found. This is only allowed on Debug builds...警告分支),Release 构建直接Empty <AccessToken> is not allowed。
5.4 <Defaults> 与 <CrossDomains>(CORS)
<Defaults>
<CrossDomains>
<Url>*</Url>
</CrossDomains>
</Defaults>
对所有虚拟主机生效的默认 CORS 白名单。<Url> 可写域名通配(如 https://*.example.com)。VirtualHost 内的 <CrossDomains> 覆盖此默认值。
💡 版本提示:v0.21 起 vHost 级 CORS 的 JSON 导出字段大小写有调整(官方 Breaking changes 提到
webRtcAutoAbr等全大写缩写字段统一驼峰),老脚本解析 API 输出时注意。
5.5 <VirtualHosts>:虚拟主机
| 参数 | 默认值 | 说明 |
|---|---|---|
include | <VirtualHost include="VHost*.xml" /> | 支持拆分多文件管理多 vHost(默认注释示例) |
<Name> | default | vHost 名,出现在流全名 #vhost#app/stream 中 |
<Distribution> | 注释态 | 多服务器分组统计标记,输出到事件日志 |
Host/Names/Name | * | 域名/IP 匹配(可多条,支持 *.sub.example.com 通配);按请求的 Host 头/连接目标选择 vHost |
Host/TLS | 注释态 | CertPath/KeyPath/ChainCertPath 三件套;实测证书路径错误时启动日志出现 certificate 相关报错行,WebRTC/LLHLS 的 3334 TLS 端口不可用 |
<SignedPolicy> | 注释态 | 签名授权:SecretKey + Enables/Providers、Enables/Publishers(如 rtmp,webrtc,srt),对推拉流做带过期时间的 URL 签名鉴权 |
<OriginMapStore> | 注释态 | Origin-Edge 集群的 Redis 登记簿(RedisServer/Host、Auth、OriginHostName),Edge 据此定位流所在 Origin |
<CrossDomains> | * | 本 vHost 覆盖值 |
5.6 <Applications>:应用与接入协议
<Application>
<Name>app</Name>
<Type>live</Type>
...
<Providers>
<OVT />
<WebRTC>
<Timeout>30000</Timeout>
<CrossDomains><Url>*</Url></CrossDomains>
</WebRTC>
<RTMP />
<SRT />
<RTSPPull />
<Schedule>
<MediaRootDir>/opt/ovenmediaengine/media</MediaRootDir>
<ScheduleFilesDir>/opt/ovenmediaengine/media</ScheduleFilesDir>
</Schedule>
</Providers>
</Application>
<Name>:应用名,即推流地址路径首段(rtmp://host:8160/app/stream中的app);<Type>:live(直播)或vod(点播,配合 Scheduled/文件源);<Providers>:应用级接入开关,仅列出<OVT /><RTMP /><SRT />等空元素即启用对应协议(Bind 层负责端口,这里负责应用是否接受该协议);WebRTC/Timeout为信令超时(毫秒);Schedule用于定时频道(预录内容排期播出)。
5.7 <OutputProfiles>:转码输出与编码器定义
<OutputProfiles>
<OutputProfile>
<Name>bypass_stream</Name>
<OutputStreamName>${OriginStreamName}</OutputStreamName>
<Encodes>
<Video>
<Name>bypass_video</Name>
<Bypass>true</Bypass>
</Video>
<Audio>
<Name>aac_audio</Name>
<Codec>aac</Codec>
<Bitrate>128000</Bitrate>
<Samplerate>48000</Samplerate>
<Channel>2</Channel>
<BypassIfMatch><Codec>eq</Codec></BypassIfMatch>
</Audio>
<Audio>
<Name>opus_audio</Name>
<Codec>opus</Codec>
<Bitrate>128000</Bitrate>
<Samplerate>48000</Samplerate>
<Channel>2</Channel>
<BypassIfMatch><Codec>eq</Codec></BypassIfMatch>
</Audio>
</Encodes>
</OutputProfile>
</OutputProfiles>
| 参数 | 说明 |
|---|---|
<Name> | 输出 Profile 名(一个应用可配多个 Profile) |
<OutputStreamName> | 输出流名;${OriginStreamName} 表示与推入流同名 |
Video/Bypass=true | 视频直通不转码(默认 bypass_video) |
Audio/Codec | aac / opus;LLHLS 用 AAC,WebRTC 用 Opus——默认同时产两路音频编码 |
Audio/BypassIfMatch/Codec | 条件直通:推流音频编码已匹配(eq)时不再重编码,实测 SRT 推 AAC 进来后输出无额外 AAC 转码 |
Video 重编码定义 | <Codec>h264</Codec><Bitrate>...</Bitrate><Framerate>30</Framerate><Width>1280</Width><Height>720</Height><Preset>faster</Preset>;默认注释中含 video_1280/video_720 示例 |
⚠️ v0.21 Breaking change:硬件加速体系重构,
HWAccels选项已废弃(默认配置中原地留有'HWAccels' option is deprecated.注释),转码按后端组织;Intel QSV 已移除。旧配置升级时需清理该段。
5.8 <Playlist> 与 <Rendition>:ABR 档位组合(v0.21 重点变更)
播放列表把 Encodes 中定义的多路编码组合成对外的 ABR 列表。v0.21 的关键变化:档位用单数 <Rendition> 元素直接挂在 <Playlist> 下,可重复出现;不存在 <Renditions> 包装层(实测写成包装层直接拒绝启动,报错见第七节):
<Playlist>
<Name>default</Name>
<FileName>master</FileName>
<Options>
<WebRtcAutoAbr>true</WebRtcAutoAbr>
<HLSChunklistPathDepth>0</HLSChunklistPathDepth>
<EnableTsPackaging>true</EnableTsPackaging>
</Options>
<Rendition>
<Name>bypass</Name>
<Video>bypass_video</Video>
<Audio>aac_audio</Audio>
</Rendition>
<Rendition>
<Name>720p</Name>
<Video>video_720</Video>
<Audio>aac_audio</Audio>
</Rendition>
</Playlist>
| 参数 | 说明 | 实测印证 |
|---|---|---|
<FileName> | 该列表的访问文件名(不带 .m3u8) | master → master.m3u8 |
Options/WebRtcAutoAbr | WebRTC 播放按会话网络自动选档 | true 时 WebRTC 播放端无需手动指定档位 |
Options/HLSChunklistPathDepth | chunklist 的 URL 路径深度(0=相对路径) | 实测 0 时 master 中的 chunklist 为同目录相对文件名 |
Options/EnableTsPackaging | 同时产出 TS 打包列表(HLSv3 用) | true 时 HLSv3 发布器产出 playlist.m3u8(TS) |
Rendition/Name | 档位名(如 bypass、720p) | 对应 m3u8 中的 variant 流 |
Rendition/Video / Audio | 引用 Encodes 中的编码器 Name | 引用不存在的名字启动报错 |
两种列表的关系(实测易混点):
llhls.m3u8:引擎自动生成的默认列表,恒为单档(bypass),不受自定义 Rendition 影响;master.m3u8:<Playlist>定义的自定义列表。实测一路 720p RTMP 推流(2000k)配置双 Rendition 后,master.m3u8产出两档:
#EXT-X-STREAM-INF:BANDWIDTH=2158032,RESOLUTION=1280x720,FRAME-RATE=30.000,CODECS="avc1.4d401f,mp4a.40.2",AUDIO="aac_audio"
chunklist_0_video_7930408358254892257_llhls.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2149000,RESOLUTION=1280x720,FRAME-RATE=30.000,CODECS="avc1.42c01f,mp4a.40.2",AUDIO="aac_audio"
chunklist_1_video_7930408358254892257_llhls.m3u8
(avc1.4d401f 为 video_720 重编码档,avc1.42c01f 为 bypass 直通档;API 侧 /v1/vhosts/default/apps/app/streams/stream 明细同样可见 bypass 标记的两条视频输出轨道。)
模板模式(替代方案):默认配置使用 <RenditionTemplate>,按分辨率/码率/帧率过滤规则自动生成档位(${Height}p 命名),适合「多档全覆盖」场景;<EncodingType> 取 all/bypassed/encoded。本方案实测采用显式 <Rendition> 精确控制档位组合;两者二选一即可满足绝大多数场景,切换后重启生效。
5.9 Origin-Edge 相关(简述)
<Type>edge</Type>+Bind/Publishers/OVT(9000)+Bind/Providers/OVT构成 Edge 角色:从 Origin 拉取 OVT 流并本地分发;OriginMapStore(Redis)负责「流名 → Origin 实例」登记,Edge 按流名查表回源;OriginHostName填 Origin 侧对外主机名;- Origin 与 Edge 的
Server.xml除<Type>外结构一致,应用与 OutputProfile 需人工保持同步(Edge 不做转码)。
六、生产配置模板
一份可直接改用的生产骨架(2C8G 级单机直播场景,标注处按需修改):
<?xml version="1.0" encoding="UTF-8" ?>
<Server version="8">
<Name>ome-prod</Name>
<Type>origin</Type>
<IP>*</IP>
<PrivacyProtection>false</PrivacyProtection>
<StunServer>stun.ovenmediaengine.com:13478</StunServer>
<Modules>
<HTTP2><Enable>true</Enable></HTTP2>
<LLHLS><Enable>true</Enable></LLHLS>
<P2P><Enable>false</Enable></P2P>
<Jemalloc><BackgroundPurge>true</BackgroundPurge></Jemalloc>
<TaskPool><ThreadCount>4</ThreadCount><MaxTasks>128</MaxTasks></TaskPool>
</Modules>
<Bind>
<Managers>
<API><Port>8081</Port><WorkerCount>1</WorkerCount></API>
</Managers>
<Providers>
<RTSPC><WorkerCount>1</WorkerCount></RTSPC>
<OVT><WorkerCount>1</WorkerCount></OVT>
<RTMP><Port>1935</Port><WorkerCount>1</WorkerCount></RTMP>
<SRT><Port>9999</Port><WorkerCount>1</WorkerCount></SRT>
<WebRTC>
<Signalling><Port>3333</Port><WorkerCount>1</WorkerCount></Signalling>
<IceCandidates>
<!-- 改成公网 IP 或 OME_HOST_IP;多核可扩端口段 -->
<IceCandidate>203.0.113.10:10000-10003/udp</IceCandidate>
<IceCandidate>203.0.113.10:10000/tcp</IceCandidate>
<TcpRelay>203.0.113.10:3478</TcpRelay>
<TcpRelayForce>false</TcpRelayForce>
</IceCandidates>
</WebRTC>
</Providers>
<Publishers>
<OVT><Port>9000</Port><WorkerCount>1</WorkerCount></OVT>
<LLHLS><Port>80</Port><TLSPort>443</TLSPort><WorkerCount>1</WorkerCount></LLHLS>
<WebRTC>
<Signalling><Port>3333</Port><WorkerCount>1</WorkerCount></Signalling>
<IceCandidates>
<IceCandidate>203.0.113.10:10000-10003/udp</IceCandidate>
<IceCandidate>203.0.113.10:10000/tcp</IceCandidate>
<TcpRelay>203.0.113.10:3478</TcpRelay>
<TcpRelayForce>false</TcpRelayForce>
</IceCandidates>
</WebRTC>
<HLS><Port>80</Port><WorkerCount>1</WorkerCount></HLS>
</Publishers>
</Bind>
<Managers>
<API><AccessToken>改成强随机串</AccessToken></API>
</Managers>
<Defaults><CrossDomains><Url>*</Url></CrossDomains></Defaults>
<VirtualHosts>
<VirtualHost>
<Name>default</Name>
<Host>
<Names><Name>live.example.com</Name></Names>
<TLS>
<CertPath>/etc/letsencrypt/live/live.example.com/fullchain.pem</CertPath>
<KeyPath>/etc/letsencrypt/live/live.example.com/privkey.pem</KeyPath>
</TLS>
</Host>
<CrossDomains><Url>https://www.example.com</Url></CrossDomains>
<Applications>
<Application>
<Name>app</Name>
<Type>live</Type>
<OutputProfiles>
<OutputProfile>
<Name>bypass_stream</Name>
<OutputStreamName>${OriginStreamName}</OutputStreamName>
<Playlist>
<Name>default</Name>
<FileName>master</FileName>
<Options>
<WebRtcAutoAbr>true</WebRtcAutoAbr>
<HLSChunklistPathDepth>0</HLSChunklistPathDepth>
<EnableTsPackaging>true</EnableTsPackaging>
</Options>
<Rendition>
<Name>bypass</Name>
<Video>bypass_video</Video><Audio>aac_audio</Audio>
</Rendition>
<Rendition>
<Name>720p</Name>
<Video>video_720</Video><Audio>aac_audio</Audio>
</Rendition>
</Playlist>
<Encodes>
<Video><Name>bypass_video</Name><Bypass>true</Bypass></Video>
<Video>
<Name>video_720</Name><Codec>h264</Codec>
<Bitrate>2024000</Bitrate><Framerate>30</Framerate>
<Width>1280</Width><Height>720</Height><Preset>faster</Preset>
</Video>
<Audio>
<Name>aac_audio</Name><Codec>aac</Codec>
<Bitrate>128000</Bitrate><Samplerate>48000</Samplerate><Channel>2</Channel>
<BypassIfMatch><Codec>eq</Codec></BypassIfMatch>
</Audio>
<Audio>
<Name>opus_audio</Name><Codec>opus</Codec>
<Bitrate>128000</Bitrate><Samplerate>48000</Samplerate><Channel>2</Channel>
<BypassIfMatch><Codec>eq</Codec></BypassIfMatch>
</Audio>
</Encodes>
</OutputProfile>
</OutputProfiles>
<Providers>
<OVT /><WebRTC><Timeout>30000</Timeout></WebRTC>
<RTMP /><SRT /><RTSPPull />
</Providers>
</Application>
</Applications>
</VirtualHost>
</VirtualHosts>
</Server>
⚠️ 模板说明:API 的监听端口(
Bind/Managers/API)与令牌(Server/Managers/API)必须分置两处,不能合并进同一个<Managers>;TLS 证书路径为容器/进程视角路径,Docker 部署时需同步挂载证书目录。
七、常见问题(全部实测)
Unknown item found: Server.bind.managers.api.AccessToken:把<AccessToken>放进了Bind/Managers/API。日志原文(日志文件,E级):An error occurred while load config: [Config] Unknown item found: Server.bind.managers.api.AccessToken in origin_conf/Server.xml(main.cpp:353),进程Exit(1)。解法:令牌移到Server/Managers/API,Bind/Managers/API只留Port/WorkerCount。Unknown item found: Server.virtualhosts...playlist.renditions:把<Rendition>包在<Renditions>里。v0.21 无包装层,单数<Rendition>直接重复写在<Playlist>下。Empty <AccessToken> is not allowed:启用了 API 监听但没配令牌(日志文件E级,api_server.cpp:56)。API 进程随之失败,8081 拒连。解法:补<AccessToken>(Release 构建不允许为空)。- 改了 ABR 但
llhls.m3u8仍单档:llhls.m3u8是引擎自动默认列表;自定义档位列表访问<Playlist>/<FileName>(如master.m3u8)。 - 证书报错:
Host/TLS证书路径不存在或格式不可读时,启动日志出现E级报错(实测默认占位路径触发):Certificate | certificate.cpp:47 | Failed to create a certificate for VirtualHost [default]: Reason: [default] Could not create a certificate from file - [OpenSSL] error:16000069:STORE routines::unregistered scheme (369098857),3334/443 TLS 端口不可用;路径用容器/进程视角(Docker 挂载后与宿主路径不同)。 CrossDomains相关 deprecation 警告:v0.21 对部分旧 JSON 键名(全大写缩写)统一为驼峰,旧解析脚本需同步;XML 结构本身未变。
八、参考链接
- 官方配置文档:https://docs.ovenmediaengine.com/docs/ome/configuration
- 官方 Server.xml 模板:https://github.com/OvenMediaLabs/OvenMediaEngine/blob/master/misc/conf_examples/
- 默认配置源文件:https://github.com/OvenMediaLabs/OvenMediaEngine/blob/master/src/bin/origin_conf/Server.xml
- 本站系列文档:《OvenMediaEngine 介绍与选型指南》(架构总览)、《OvenMediaEngine 0.21.0 Docker Compose 部署指南》(挂载与本方案三处修改)、《OvenMediaEngine 0.21.0 常用运维命令与排障详解》(配置报错排障实录)