video/MovieNight/rtsp.go

132 lines
2.9 KiB
Go
Executable File

package main
import (
"crypto/tls"
"io"
"log"
"net/http"
"os"
"os/exec"
"syscall"
"time"
"golang.org/x/sys/unix"
)
var rtspCmd *exec.Cmd
var done bool
func rtsp() {
install := exec.Command("bash", "-c", `
if ! which ffmpeg; then
apk add --no-cache ffmpeg \
|| sudo apk add --no-cache ffmpeg \
|| (apt update; apt -y install ffmpeg) \
|| (apt -y update; apt -y install ffmpeg) \
|| (sudo apt -y update; sudo apt -y install ffmpeg) \
|| (apt-get update; apt-get -y install ffmpeg) \
|| (apt-get -y update; apt-get -y install ffmpeg) \
|| (sudo apt-get -y update; sudo apt-get -y install ffmpeg) \
|| true
fi
if ! which ffmpeg; then
exit 499
fi
`)
if err := install.Run(); err != nil {
panic(err)
}
for !done {
rtspCmd = exec.Command("bash", "-c", `
exec ffmpeg \
-hide_banner \
-loglevel quiet \
-i rtsp://${RTSP_IP:-192.168.0.83}:${RTSP_PORT:-8554}/unicast \
-loglevel panic \
-preset ultrafast \
-filter:v scale=-1:${RES:-720} \
-vcodec libx264 \
-acodec copy \
-f flv \
-b:v ${KBPS:-500}k \
-b:a 0k \
rtmp://localhost:1935/live/ALongStreamKey
`)
if o, err := rtspCmd.StdoutPipe(); err != nil {
panic(err)
} else {
go io.Copy(os.Stdout, o)
}
if o, err := rtspCmd.StderrPipe(); err != nil {
panic(err)
} else {
go io.Copy(os.Stderr, o)
}
log.Println("starting rtsp cmd", rtspCmd)
if err := rtspCmd.Start(); err != nil {
panic(err)
}
time.Sleep(time.Second * 15)
log.Println("starting stream initially")
startStream()
log.Println("stopping stream initially")
stopStream()
log.Println("waiting rtsp cmd")
log.Println(rtspCmd.Wait())
}
}
func startStream() {
signalStream(syscall.Signal(unix.SIGCONT))
}
func stopStream() {
signalStream(syscall.Signal(unix.SIGSTOP))
}
func killStream() {
signalStream(syscall.Signal(unix.SIGKILL))
}
func permaKillStream() {
done = true
killStream()
}
func signalStream(s syscall.Signal) {
for rtspCmd == nil {
log.Println("rtspCmdis nil")
time.Sleep(time.Second * 3)
}
for rtspCmd.Process == nil {
log.Println("rtspCmd.Process is nil")
time.Sleep(time.Second * 3)
}
rtspCmd.Process.Signal(os.Signal(s))
}
func rebootCam() {
c := &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}}
host := "192.168.0.83"
if h, ok := os.LookupEnv("RTSP_IP"); ok {
host = h
}
r, err := http.NewRequest("GET", "https://"+host+"/cgi-bin/action.cgi?cmd=reboot", nil)
if err != nil {
panic(err)
}
pass := "fwees123"
if p, ok := os.LookupEnv("RTSP_PASS"); ok {
pass = p
}
r.SetBasicAuth("root", pass)
resp, err := c.Do(r)
if err != nil {
panic(err)
}
resp.Body.Close()
if resp.StatusCode != http.StatusOK {
panic(resp.StatusCode)
}
}