跳转到内容

音频转码插件

Transcode 插件提供基于 FFmpeg 的音视频转码功能,支持通过规则自动触发(流发布时按正则匹配)和 HTTP API 手动控制两种方式管理转码任务。

Cargo.toml
features = ["ffmpeg_transcode"]
transcode:
enable: true
ffmpeg_path: "ffmpeg" # FFmpeg 二进制路径
mode: "auto" # 模式:auto / process
local_rtmp: "rtmp://127.0.0.1/live" # 本地 RTMP 地址(作为 FFmpeg 输入源)
onpub: # 自动转码规则(发布时触发)
"^live/(.+)$": # 正则匹配流路径
outputs:
- target: "rtmp://cdn.example.com/live/$1" # 目标地址(支持正则替换)
options:
video_codec: "libx264"
audio_codec: "aac"
video_bitrate: 2000
audio_bitrate: 128
resolution: "1280x720"
frame_rate: 30
字段类型默认值说明
enableboolfalse是否启用插件
modestringautoFFmpeg 后端模式
ffmpeg_pathstringffmpegFFmpeg 二进制路径
local_rtmpstringrtmp://127.0.0.1/live本地 RTMP 输入地址
onpubmap{}自动转码规则
字段类型说明
video_codecstring视频编码器(如 libx264libx265copy
audio_codecstring音频编码器(如 aaclibopuscopy
video_bitrateint视频码率(kbps)
audio_bitrateint音频码率(kbps)
resolutionstring分辨率(如 1280x720
frame_ratefloat帧率

当有新流发布时,Transcode 插件会监听 StreamEvent::Created 事件,将流路径与 onpub 中的正则规则逐一匹配。匹配成功后,自动为每个 outputs 条目启动一个 FFmpeg 转码进程。

当源流销毁时(StreamEvent::Disposed),插件自动终止该流关联的所有转码任务。

WebRTC 推流使用 Opus 音频编码,但 RTMP 通常要求 AAC。通过转码规则自动完成音频格式转换:

onpub:
"^webrtc/(.+)$":
outputs:
- target: "rtmp://127.0.0.1/live/$1"
options:
video_codec: "copy" # 视频直接复制,不重编码
audio_codec: "aac" # Opus → AAC
audio_bitrate: 128

将单路 RTMP 流转码为多个码率版本:

onpub:
"^live/(.+)$":
outputs:
- target: "rtmp://127.0.0.1/live/$1_720p"
options:
video_codec: "libx264"
resolution: "1280x720"
video_bitrate: 2000
audio_codec: "copy"
- target: "rtmp://127.0.0.1/live/$1_480p"
options:
video_codec: "libx264"
resolution: "854x480"
video_bitrate: 1000
audio_codec: "copy"

将本地流转推到外部 CDN:

onpub:
"^live/(.+)$":
outputs:
- target: "rtmp://cdn-push.example.com/live/$1"
options:
video_codec: "copy"
audio_codec: "copy"

所有接口挂载在 /transcode/api/ 路由前缀下。

GET /transcode/api/list

返回当前所有活跃的转码任务。

响应示例:

{
"code": 0,
"message": "success",
"data": {
"count": 2,
"jobs": [
{
"id": 1,
"source_path": "live/camera01",
"input_url": "rtmp://127.0.0.1/live/camera01",
"target": "rtmp://cdn.example.com/live/camera01"
}
]
}
}
POST /transcode/api/launch
Content-Type: application/json
{
"source_path": "live/camera01",
"target": "rtmp://cdn.example.com/live/camera01",
"options": {
"video_codec": "libx264",
"audio_codec": "aac",
"video_bitrate": 2000,
"resolution": "1280x720"
}
}

响应示例:

{
"code": 0,
"message": "launched",
"data": { "id": 1 }
}
POST /transcode/api/close
Content-Type: application/json
{
"id": 1
}

也可以按源流路径停止所有关联任务:

{
"source_path": "live/camera01"
}
GET /transcode/api/exist?target=rtmp://cdn.example.com/live/camera01
GET /transcode/api/config
  1. FFmpeg 进程管理:每个转码任务对应一个独立的 FFmpeg 子进程,插件负责进程的创建和清理
  2. 资源消耗:视频转码(非 copy 模式)消耗大量 CPU,建议合理规划转码任务数量
  3. local_rtmp 配置:确保引擎的 RTMP 插件已启用,且地址与 local_rtmp 配置一致
  4. 目标去重:对于同一目标 URL,不会重复创建转码任务

联系我们

微信公众号:不卡科技 微信公众号二维码
腾讯频道:流媒体技术 腾讯频道二维码
QQ 频道:p0qq0crz08 QQ 频道二维码
QQ 群:751639168 QQ 群二维码