2026-04-17 09:52:09 -04:00
|
|
|
package webrtc
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
|
|
appcfg "github.com/datarhei/core/v16/restream/app"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// BuildArgs emits the FFmpeg output-leg args for the WebRTC side of a
|
|
|
|
|
// process. It produces two separate "outputs" — one for video on
|
|
|
|
|
// videoPort, one for audio on videoPort+1. Each output ends with its
|
|
|
|
|
// UDP address so the slice is structured for consumption by
|
|
|
|
|
// restream.AppendOutput after splitting on the track boundary.
|
|
|
|
|
//
|
|
|
|
|
// Copy vs. re-encode: if ForceTranscode is false, we assume the upstream
|
|
|
|
|
// source is already H.264 + Opus and pass them through (copy). When the
|
|
|
|
|
// source doesn't match, FFmpeg will fail at runtime and the process will
|
|
|
|
|
// restart — the user can flip ForceTranscode on to get a baseline-profile
|
|
|
|
|
// H.264 + Opus re-encode.
|
|
|
|
|
func BuildArgs(cfg appcfg.ConfigWebRTC, videoPort int) []string {
|
|
|
|
|
vcopy := []string{"-c:v", "copy"}
|
|
|
|
|
acopy := []string{"-c:a", "copy"}
|
|
|
|
|
if cfg.ForceTranscode {
|
|
|
|
|
vcopy = []string{
|
|
|
|
|
"-c:v", "libx264",
|
|
|
|
|
"-preset", "veryfast",
|
|
|
|
|
"-profile:v", "baseline",
|
|
|
|
|
"-pix_fmt", "yuv420p",
|
|
|
|
|
"-tune", "zerolatency",
|
|
|
|
|
"-g", "60",
|
|
|
|
|
}
|
|
|
|
|
acopy = []string{"-c:a", "libopus", "-b:a", "96k"}
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-03 08:10:51 -04:00
|
|
|
videoMap := cfg.VideoMap
|
|
|
|
|
if videoMap == "" {
|
|
|
|
|
videoMap = "0:v:0"
|
|
|
|
|
}
|
|
|
|
|
audioMap := cfg.AudioMap
|
|
|
|
|
if audioMap == "" {
|
|
|
|
|
audioMap = "0:a:0"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
args := []string{"-map", videoMap}
|
2026-04-17 09:52:09 -04:00
|
|
|
args = append(args, vcopy...)
|
|
|
|
|
args = append(args,
|
|
|
|
|
"-payload_type", fmt.Sprint(cfg.VideoPT),
|
|
|
|
|
"-f", "rtp",
|
|
|
|
|
fmt.Sprintf("udp://127.0.0.1:%d?pkt_size=1316", videoPort),
|
|
|
|
|
)
|
|
|
|
|
|
2026-05-03 08:10:51 -04:00
|
|
|
args = append(args, "-map", audioMap)
|
2026-04-17 09:52:09 -04:00
|
|
|
args = append(args, acopy...)
|
|
|
|
|
args = append(args,
|
|
|
|
|
"-payload_type", fmt.Sprint(cfg.AudioPT),
|
|
|
|
|
"-f", "rtp",
|
|
|
|
|
fmt.Sprintf("udp://127.0.0.1:%d?pkt_size=1316", videoPort+1),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
return args
|
|
|
|
|
}
|