mirror of
https://github.com/AlexxIT/go2rtc.git
synced 2025-10-06 00:37:00 +08:00
89 lines
1.7 KiB
Go
89 lines
1.7 KiB
Go
package device
|
|
|
|
import (
|
|
"net/url"
|
|
"os/exec"
|
|
"regexp"
|
|
|
|
"github.com/AlexxIT/go2rtc/internal/api"
|
|
"github.com/AlexxIT/go2rtc/pkg/core"
|
|
)
|
|
|
|
func queryToInput(query url.Values) string {
|
|
video := query.Get("video")
|
|
audio := query.Get("audio")
|
|
|
|
if video == "" && audio == "" {
|
|
return ""
|
|
}
|
|
|
|
// https://ffmpeg.org/ffmpeg-devices.html#dshow
|
|
input := "-f dshow"
|
|
|
|
if video != "" {
|
|
video = indexToItem(videos, video)
|
|
|
|
for key, value := range query {
|
|
switch key {
|
|
case "resolution":
|
|
input += " -video_size " + value[0]
|
|
case "video_size", "framerate", "pixel_format":
|
|
input += " -" + key + " " + value[0]
|
|
}
|
|
}
|
|
}
|
|
|
|
if audio != "" {
|
|
audio = indexToItem(audios, audio)
|
|
|
|
for key, value := range query {
|
|
switch key {
|
|
case "sample_rate", "sample_size", "channels", "audio_buffer_size":
|
|
input += " -" + key + " " + value[0]
|
|
}
|
|
}
|
|
}
|
|
|
|
if video != "" {
|
|
input += ` -i "video=` + video
|
|
|
|
if audio != "" {
|
|
input += `:audio=` + audio
|
|
}
|
|
|
|
input += `"`
|
|
} else {
|
|
input += ` -i "audio=` + audio + `"`
|
|
}
|
|
|
|
return input
|
|
}
|
|
|
|
func initDevices() {
|
|
cmd := exec.Command(
|
|
Bin, "-hide_banner", "-list_devices", "true", "-f", "dshow", "-i", "",
|
|
)
|
|
b, _ := cmd.CombinedOutput()
|
|
|
|
re := regexp.MustCompile(`"([^"]+)" \((video|audio)\)`)
|
|
for _, m := range re.FindAllStringSubmatch(string(b), -1) {
|
|
name := m[1]
|
|
kind := m[2]
|
|
|
|
stream := &api.Source{
|
|
Name: name, URL: "ffmpeg:device?" + kind + "=" + name,
|
|
}
|
|
|
|
switch kind {
|
|
case core.KindVideo:
|
|
videos = append(videos, name)
|
|
stream.URL += "#video=h264#hardware"
|
|
case core.KindAudio:
|
|
audios = append(audios, name)
|
|
stream.URL += "&channels=1&sample_rate=16000&audio_buffer_size=10"
|
|
}
|
|
|
|
streams = append(streams, stream)
|
|
}
|
|
}
|