132 lines
2.9 KiB
Go
Executable File
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)
|
|
}
|
|
}
|