{"record":{"id":"dbbf3c0b4d7e598a","repo":"AlexxIT/go2rtc","slug":"ffmpeg-unsupported-params","errorCode":null,"errorMessage":"ffmpeg: unsupported params: ","messagePattern":"ffmpeg: unsupported params: ","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/ffmpeg/producer.go","lineNumber":31,"sourceCode":")\n\ntype Producer struct {\n\tcore.Connection\n\turl    string\n\tquery  url.Values\n\tffmpeg core.Producer\n}\n\n// NewProducer - FFmpeg producer with auto selection video/audio codec based on client capabilities\nfunc NewProducer(url string) (core.Producer, error) {\n\tp := &Producer{}\n\n\ti := strings.IndexByte(url, '#')\n\tp.url, p.query = url[:i], streams.ParseQuery(url[i+1:])\n\n\t// ffmpeg.NewProducer support only one audio\n\tif len(p.query[\"video\"]) != 0 || len(p.query[\"audio\"]) != 1 {\n\t\treturn nil, errors.New(\"ffmpeg: unsupported params: \" + url[i:])\n\t}\n\n\tp.ID = core.NewID()\n\tp.FormatName = \"ffmpeg\"\n\tp.Medias = []*core.Media{\n\t\t{\n\t\t\t// we can support only audio, because don't know FmtpLine for H264 and PayloadType for MJPEG\n\t\t\tKind:      core.KindAudio,\n\t\t\tDirection: core.DirectionRecvonly,\n\t\t\t// codecs in order from best to worst\n\t\t\tCodecs: []*core.Codec{\n\t\t\t\t// OPUS will always marked as OPUS/48000/2\n\t\t\t\t{Name: core.CodecOpus, ClockRate: 48000, Channels: 2},\n\t\t\t\t{Name: core.CodecPCML, ClockRate: 16000},\n\t\t\t\t{Name: core.CodecPCM, ClockRate: 16000},\n\t\t\t\t{Name: core.CodecPCMA, ClockRate: 16000},\n\t\t\t\t{Name: core.CodecPCMU, ClockRate: 16000},\n\t\t\t\t{Name: core.CodecPCML, ClockRate: 8000},","sourceCodeStart":13,"sourceCodeEnd":49,"githubUrl":"https://github.com/AlexxIT/go2rtc/blob/c245815e75e2a5fd60b4290f12bfc04e55a984d3/internal/ffmpeg/producer.go#L13-L49","documentation":"ffmpeg.NewProducer consumes an existing FFmpeg process output and supports only a single audio track and no explicit video-track selection query. If the URL's fragment contains a video parameter, or more/less than exactly one audio parameter, the producer refuses to build, reporting the offending parameter fragment.","triggerScenarios":"Calling NewProducer with a URL whose #fragment has video=... (any value) or an audio list whose length != 1 (zero or multiple audio= params).","commonSituations":"Passing multi-audio sources intended for the ffmpeg binary itself; copy-pasted URLs with both video and audio selectors; constructing the URL programmatically and appending duplicate audio params.","solutions":["Remove the video parameter from the URL fragment","Keep exactly one audio parameter in the fragment (or none)","If multiple audio tracks are needed, remux/select tracks before feeding go2rtc"],"exampleFix":"// before\nrtsp://cam/stream#video=h264#audio=aac#audio=mp3\n// after\nrtsp://cam/stream#audio=aac","handlingStrategy":"validation","validationCode":"q := streams.ParseQuery(fragment)\nif len(q[\"video\"]) != 0 || len(q[\"audio\"]) != 1 { return errors.New(\"need exactly one audio param and no video param\") }","typeGuard":null,"tryCatchPattern":"p, err := ffmpeg.NewProducer(url); if err != nil && strings.HasPrefix(err.Error(), \"ffmpeg: unsupported params\") { /* strip/fix fragment and retry */ }","preventionTips":["Build ffmpeg source URLs with at most one audio= parameter and never video=","Sanitize fragments when constructing URLs programmatically (dedupe params)","Review FFmpeg CLI flags vs go2rtc producer params — they are not interchangeable"],"tags":["ffmpeg","parameters","validation","go2rtc"],"backgroundTag":"invalid-query-parameter","analyzedSha":"c245815e75e2a5fd60b4290f12bfc04e55a984d3","analyzedAt":"2026-09-07T11:47:02.965Z","contentChangedAt":"2026-09-07T11:47:02.965Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}