69 lines
1.2 KiB
Go
69 lines
1.2 KiB
Go
package device
|
|
|
|
import (
|
|
"github.com/AlexxIT/go2rtc/internal/api"
|
|
"net/http"
|
|
"net/url"
|
|
"strconv"
|
|
"strings"
|
|
"sync"
|
|
)
|
|
|
|
func Init() {
|
|
api.HandleFunc("api/ffmpeg/devices", apiDevices)
|
|
}
|
|
|
|
func GetInput(src string) (string, error) {
|
|
runonce.Do(initDevices)
|
|
|
|
input := deviceInputPrefix
|
|
|
|
var video, audio string
|
|
|
|
if i := strings.IndexByte(src, '?'); i > 0 {
|
|
query, err := url.ParseQuery(src[i+1:])
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
for key, value := range query {
|
|
switch key {
|
|
case "video":
|
|
video = value[0]
|
|
case "audio":
|
|
audio = value[0]
|
|
case "framerate":
|
|
input += " -framerate " + value[0]
|
|
case "resolution":
|
|
input += " -video_size " + value[0]
|
|
}
|
|
}
|
|
}
|
|
|
|
if video != "" {
|
|
if i, err := strconv.Atoi(video); err == nil && i < len(videos) {
|
|
video = videos[i]
|
|
}
|
|
}
|
|
if audio != "" {
|
|
if i, err := strconv.Atoi(audio); err == nil && i < len(audios) {
|
|
audio = audios[i]
|
|
}
|
|
}
|
|
|
|
input += " -i " + deviceInputSuffix(video, audio)
|
|
|
|
return input, nil
|
|
}
|
|
|
|
var Bin string
|
|
|
|
var videos, audios []string
|
|
var streams []api.Stream
|
|
var runonce sync.Once
|
|
|
|
func apiDevices(w http.ResponseWriter, r *http.Request) {
|
|
runonce.Do(initDevices)
|
|
|
|
api.ResponseStreams(w, streams)
|
|
}
|