OvenMediaEngine 0.21.0 配置参数详解

OvenMediaEngine 0.21.0 Server.xml 逐段详解:Bind/Providers/Publishers、API 认证、vHost、转码与 ABR Playlist,含实测报错原文与生产模板

OvenMediaEngineOvenMediaEngine流媒体DockerDocker Compose媒体服务器2026/10/30

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) 退出

二、前置条件

  1. 已按《OvenMediaEngine 0.21.0 Docker Compose 部署指南》完成基础部署,能拿到启动日志;
  2. 知道你的配置文件位置:源码/包安装默认在 /usr/local/ovenmediaengine/origin_conf/Server.xml,Docker 部署为挂载进容器的 Server.xml(容器内路径 /opt/ovenmediaengine/bin/origin_conf/Server.xml);
  3. 了解 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"> 结构
校验配置启动后看日志 `ConfigTrying 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>originorigin(持有流源)/ edge(从 Origin 拉流分发),决定 OVT 行为
<IP>*所有监听端口的绑定 IP
<PrivacyProtection>falsetrue 时日志中 IP 打码
<StunServer>stun.ovenmediaengine.com:13478启动时通过 STUN 解析公网 IP;实测日志 Resolved public IP address (...) from stun server (...)。无公网出口的环境改用 OME_HOST_IP 显式指定
Modules/HTTP2/EnabletrueLLHLS 在 TLS 下走 h2;未配 TLS 的 3333 端口自动降级 HTTP/1.1(实测 LLHLS 特征头 PART-HOLD-BACK 正常返回)
Modules/LLHLS/EnabletrueLLHLS 模块总开关
Modules/P2P/EnablefalseWebRTC P2P 实验特性;开启后日志出现 Signalling.P2P 相关行,实测默认关闭时打印 P2P is disabled in the configuration
Modules/Jemalloc/BackgroundPurgetrue后台内存回收线程(实测启动日志 Jemalloc background purge thread is enabled.)
Modules/TaskPool4 线程 / 128 任务共享短任务线程池(实测启动日志 TaskPool is configured - threads: 4, max tasks: 128)

5.2 <Bind>:端口绑定

<Bind> 决定「哪些组件监听哪些端口」,是 v0.21 最容易出错的一段——未出现在 Bind 中的 Provider/Publisher 一律禁用。

Bind/Providers(接入侧)

参数默认实测行为
RTSPC/WorkerCount1RTSP 拉流客户端(无端口,纯出站),日志 RTSPCProvider has been started.
OVT/WorkerCount1从 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
TcpRelayForcefalsetrue 时强制所有 WebRTC 会话走 TURN

Bind/Publishers(分发侧)

参数默认实测行为
OVT/Port9000Origin-Edge 分发,实测 OVTPublisher is listening on *:9000/TCP...
LLHLS/Port + TLSPort3333 / 3334fMP4 低延迟 HLS;与 WebRTC 信令同端口复用(HTTP Server 按 URL 分流)。未绑定即整组禁用
WebRTC/Signalling3333同上,默认启用
<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>defaultvHost 名,出现在流全名 #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/Codecaac / 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/WebRtcAutoAbrWebRTC 播放按会话网络自动选档true 时 WebRTC 播放端无需手动指定档位
Options/HLSChunklistPathDepthchunklist 的 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 部署时需同步挂载证书目录。

七、常见问题(全部实测)

  1. 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。
  2. Unknown item found: Server.virtualhosts...playlist.renditions:把 <Rendition> 包在 <Renditions> 里。v0.21 无包装层,单数 <Rendition> 直接重复写在 <Playlist> 下。
  3. Empty <AccessToken> is not allowed:启用了 API 监听但没配令牌(日志文件 E 级,api_server.cpp:56)。API 进程随之失败,8081 拒连。解法:补 <AccessToken>(Release 构建不允许为空)。
  4. 改了 ABR 但 llhls.m3u8 仍单档:llhls.m3u8 是引擎自动默认列表;自定义档位列表访问 <Playlist>/<FileName>(如 master.m3u8)。
  5. 证书报错: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 挂载后与宿主路径不同)。
  6. CrossDomains 相关 deprecation 警告:v0.21 对部分旧 JSON 键名(全大写缩写)统一为驼峰,旧解析脚本需同步;XML 结构本身未变。

八、参考链接