Add framerate parameter option to HTTPs

Some HTTP (a.g. JPEG or MJPEG) needs set the input framerate explicitly.
This commit is contained in:
Galindo, Alex
2023-07-06 12:08:49 +02:00
parent f6936f7cee
commit f94cd16cb7
2 changed files with 19 additions and 1 deletions

View File

@@ -144,6 +144,11 @@ func parseArgs(s string) *ffmpeg.Args {
switch s[:i] { switch s[:i] {
case "http", "https", "rtmp": case "http", "https", "rtmp":
args.Input = inputTemplate("http", s, query) args.Input = inputTemplate("http", s, query)
// Some HTTP-JPEG, HTTP-MJPEG needs the input framerate explicitly
if query["framerate"] != nil {
args.Input = "-framerate " + query["framerate"][0] + " " + args.Input
query.Del("framerate")
}
case "rtsp", "rtsps": case "rtsp", "rtsps":
// https://ffmpeg.org/ffmpeg-protocols.html#rtsp // https://ffmpeg.org/ffmpeg-protocols.html#rtsp
// skip unnecessary input tracks // skip unnecessary input tracks

View File

@@ -1,8 +1,9 @@
package ffmpeg package ffmpeg
import ( import (
"github.com/stretchr/testify/require"
"testing" "testing"
"github.com/stretchr/testify/require"
) )
func TestParseArgs(t *testing.T) { func TestParseArgs(t *testing.T) {
@@ -20,4 +21,16 @@ func TestParseArgs(t *testing.T) {
args = parseArgs("device?video=0&input_format=mjpeg&video_size=1920x1080") args = parseArgs("device?video=0&input_format=mjpeg&video_size=1920x1080")
require.Equal(t, `ffmpeg -hide_banner -f dshow -input_format mjpeg -video_size 1920x1080 -i video="0" -c copy -f mjpeg -`, args.String()) require.Equal(t, `ffmpeg -hide_banner -f dshow -input_format mjpeg -video_size 1920x1080 -i video="0" -c copy -f mjpeg -`, args.String())
args = parseArgs("http://example.com")
require.Equal(t, "ffmpeg -hide_banner -fflags nobuffer -flags low_delay -i http://example.com -c copy -user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp {output}", args.String())
args = parseArgs("http://example.com#video=h264")
require.Equal(t, "ffmpeg -hide_banner -fflags nobuffer -flags low_delay -i http://example.com -c:v libx264 -g 50 -profile:v high -level:v 4.1 -preset:v superfast -tune:v zerolatency -pix_fmt:v yuvj420p -an -user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp {output}", args.String())
args = parseArgs("http://example.com#framerate=20")
require.Equal(t, "ffmpeg -hide_banner -framerate 20 -fflags nobuffer -flags low_delay -i http://example.com -c copy -user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp {output}", args.String())
args = parseArgs("http://example.com#framerate=20#video=h264")
require.Equal(t, "ffmpeg -hide_banner -framerate 20 -fflags nobuffer -flags low_delay -i http://example.com -c:v libx264 -g 50 -profile:v high -level:v 4.1 -preset:v superfast -tune:v zerolatency -pix_fmt:v yuvj420p -an -user_agent ffmpeg/go2rtc -rtsp_transport tcp -f rtsp {output}", args.String())
} }