archive
This commit is contained in:
131
MovieNight/rtsp.go
Executable file
131
MovieNight/rtsp.go
Executable file
@@ -0,0 +1,131 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user