Add #timeout param for ffmpeg source
This commit is contained in:
@@ -371,9 +371,11 @@ But you can override them via YAML config. You can also add your own formats to
|
|||||||
```yaml
|
```yaml
|
||||||
ffmpeg:
|
ffmpeg:
|
||||||
bin: ffmpeg # path to ffmpeg binary
|
bin: ffmpeg # path to ffmpeg binary
|
||||||
|
global: "-hide_banner"
|
||||||
|
timeout: 5 # default timeout in seconds for rtsp inputs
|
||||||
h264: "-codec:v libx264 -g:v 30 -preset:v superfast -tune:v zerolatency -profile:v main -level:v 4.1"
|
h264: "-codec:v libx264 -g:v 30 -preset:v superfast -tune:v zerolatency -profile:v main -level:v 4.1"
|
||||||
mycodec: "-any args that supported by ffmpeg..."
|
mycodec: "-any args that supported by ffmpeg..."
|
||||||
myinput: "-fflags nobuffer -flags low_delay -timeout 5000000 -i {input}"
|
myinput: "-fflags nobuffer -flags low_delay -timeout {timeout} -i {input}"
|
||||||
myraw: "-ss 00:00:20"
|
myraw: "-ss 00:00:20"
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -383,9 +385,10 @@ ffmpeg:
|
|||||||
- You can use `width` and/or `height` params, important with transcoding (ex. `#video=h264#width=1280`)
|
- You can use `width` and/or `height` params, important with transcoding (ex. `#video=h264#width=1280`)
|
||||||
- You can use `drawtext` to add a timestamp (ex. `drawtext=x=2:y=2:fontsize=12:fontcolor=white:box=1:boxcolor=black`)
|
- You can use `drawtext` to add a timestamp (ex. `drawtext=x=2:y=2:fontsize=12:fontcolor=white:box=1:boxcolor=black`)
|
||||||
- This will greatly increase the CPU of the server, even with hardware acceleration
|
- This will greatly increase the CPU of the server, even with hardware acceleration
|
||||||
|
- You can use `timeout` param to set RTSP input timeout in seconds (ex. `#timeout=10`)
|
||||||
- You can use `raw` param for any additional FFmpeg arguments (ex. `#raw=-vf transpose=1`)
|
- You can use `raw` param for any additional FFmpeg arguments (ex. `#raw=-vf transpose=1`)
|
||||||
- You can use `input` param to override default input template (ex. `#input=rtsp/udp` will change RTSP transport from TCP to UDP+TCP)
|
- You can use `input` param to override default input template (ex. `#input=rtsp/udp` will change RTSP transport from TCP to UDP+TCP)
|
||||||
- You can use raw input value (ex. `#input=-timeout 5000000 -i {input}`)
|
- You can use raw input value (ex. `#input=-timeout {timeout} -i {input}`)
|
||||||
- You can add your own input templates
|
- You can add your own input templates
|
||||||
|
|
||||||
Read more about [hardware acceleration](https://github.com/AlexxIT/go2rtc/wiki/Hardware-acceleration).
|
Read more about [hardware acceleration](https://github.com/AlexxIT/go2rtc/wiki/Hardware-acceleration).
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package ffmpeg
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/AlexxIT/go2rtc/internal/api"
|
"github.com/AlexxIT/go2rtc/internal/api"
|
||||||
@@ -60,13 +61,14 @@ func Init() {
|
|||||||
var defaults = map[string]string{
|
var defaults = map[string]string{
|
||||||
"bin": "ffmpeg",
|
"bin": "ffmpeg",
|
||||||
"global": "-hide_banner",
|
"global": "-hide_banner",
|
||||||
|
"timeout": "5",
|
||||||
|
|
||||||
// inputs
|
// inputs
|
||||||
"file": "-re -i {input}",
|
"file": "-re -i {input}",
|
||||||
"http": "-fflags nobuffer -flags low_delay -i {input}",
|
"http": "-fflags nobuffer -flags low_delay -i {input}",
|
||||||
"rtsp": "-fflags nobuffer -flags low_delay -timeout 5000000 -user_agent go2rtc/ffmpeg -rtsp_flags prefer_tcp -i {input}",
|
"rtsp": "-fflags nobuffer -flags low_delay -timeout {timeout} -user_agent go2rtc/ffmpeg -rtsp_flags prefer_tcp -i {input}",
|
||||||
|
|
||||||
"rtsp/udp": "-fflags nobuffer -flags low_delay -timeout 5000000 -user_agent go2rtc/ffmpeg -i {input}",
|
"rtsp/udp": "-fflags nobuffer -flags low_delay -timeout {timeout} -user_agent go2rtc/ffmpeg -i {input}",
|
||||||
|
|
||||||
// output
|
// output
|
||||||
"output": "-user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp {output}",
|
"output": "-user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp {output}",
|
||||||
@@ -169,6 +171,16 @@ func inputTemplate(name, s string, query url.Values) string {
|
|||||||
} else {
|
} else {
|
||||||
template = defaults[name]
|
template = defaults[name]
|
||||||
}
|
}
|
||||||
|
if strings.Contains(template, "{timeout}") {
|
||||||
|
timeout := query.Get("timeout")
|
||||||
|
if timeout == "" {
|
||||||
|
timeout = defaults["timeout"]
|
||||||
|
}
|
||||||
|
if i, _ := strconv.Atoi(timeout); i > 0 {
|
||||||
|
timeout = strconv.Itoa(i * 1000000)
|
||||||
|
}
|
||||||
|
template = strings.Replace(template, "{timeout}", timeout, 1)
|
||||||
|
}
|
||||||
return strings.Replace(template, "{input}", s, 1)
|
return strings.Replace(template, "{input}", s, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -123,6 +123,11 @@ func TestParseArgsIpCam(t *testing.T) {
|
|||||||
source: "rtmp://example.com#input=rtsp/udp",
|
source: "rtmp://example.com#input=rtsp/udp",
|
||||||
expect: `ffmpeg -hide_banner -fflags nobuffer -flags low_delay -timeout 5000000 -user_agent go2rtc/ffmpeg -i rtmp://example.com -c copy -user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp {output}`,
|
expect: `ffmpeg -hide_banner -fflags nobuffer -flags low_delay -timeout 5000000 -user_agent go2rtc/ffmpeg -i rtmp://example.com -c copy -user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp {output}`,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "[RTSP] custom timeout",
|
||||||
|
source: "rtsp://example.com#timeout=10",
|
||||||
|
expect: `ffmpeg -hide_banner -allowed_media_types video+audio -fflags nobuffer -flags low_delay -timeout 10000000 -user_agent go2rtc/ffmpeg -rtsp_flags prefer_tcp -i rtsp://example.com -c copy -user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp {output}`,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
t.Run(test.name, func(t *testing.T) {
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
|||||||
Reference in New Issue
Block a user