|
|
|
@ -3,71 +3,25 @@ package main
@@ -3,71 +3,25 @@ package main
|
|
|
|
|
import ( |
|
|
|
|
"flag" |
|
|
|
|
"net" |
|
|
|
|
"os" |
|
|
|
|
"os/signal" |
|
|
|
|
"syscall" |
|
|
|
|
"time" |
|
|
|
|
"log" |
|
|
|
|
"github.com/gwuhaolin/livego/protocol/rtmp" |
|
|
|
|
"github.com/gwuhaolin/livego/protocol/hls" |
|
|
|
|
"github.com/gwuhaolin/livego/protocol/httpflv" |
|
|
|
|
"github.com/gwuhaolin/livego/protocol/httpopera" |
|
|
|
|
"path/filepath" |
|
|
|
|
"strings" |
|
|
|
|
"io/ioutil" |
|
|
|
|
"strconv" |
|
|
|
|
"log" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
var ( |
|
|
|
|
rtmpAddr = flag.String("rtmpAddr", ":1935", "The rtmp server address to bind.") |
|
|
|
|
flvAddr = flag.String("flvAddr", ":8081", "the http-flv server address to bind.") |
|
|
|
|
hlsAddr = flag.String("hlsAddr", ":8080", "the hls server address to bind.") |
|
|
|
|
operaAddr = flag.String("operaAddr", "", "the http operation or config address to bind: 8082.") |
|
|
|
|
CurDir string // save pid
|
|
|
|
|
rtmpAddr = flag.String("rtmpAddr", ":1935", "The rtmp server address to bind.") |
|
|
|
|
operaAddr = flag.String("operaAddr", ":8080", "the http operation or config address to bind.") |
|
|
|
|
flvAddr = flag.String("flvAddr", ":8081", "the http-flv server address to bind.") |
|
|
|
|
hlsAddr = flag.String("hlsAddr", ":8082", "the hls server address to bind.") |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
func getParentDirectory(dirctory string) string { |
|
|
|
|
return substr(dirctory, 0, strings.LastIndex(dirctory, "/")) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func getCurrentDirectory() string { |
|
|
|
|
dir, err := filepath.Abs(filepath.Dir(os.Args[0])) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Fatal(err) |
|
|
|
|
} |
|
|
|
|
return strings.Replace(dir, "\\", "/", -1) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func substr(s string, pos, length int) string { |
|
|
|
|
runes := []rune(s) |
|
|
|
|
l := pos + length |
|
|
|
|
if l > len(runes) { |
|
|
|
|
l = len(runes) |
|
|
|
|
} |
|
|
|
|
return string(runes[pos:l]) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func SavePid() error { |
|
|
|
|
pidFilename := CurDir + "/pid/" + filepath.Base(os.Args[0]) + ".pid" |
|
|
|
|
pid := os.Getpid() |
|
|
|
|
return ioutil.WriteFile(pidFilename, []byte(strconv.Itoa(pid)), 0755) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func init() { |
|
|
|
|
CurDir = getParentDirectory(getCurrentDirectory()) |
|
|
|
|
flag.Usage = func() { |
|
|
|
|
flag.PrintDefaults() |
|
|
|
|
} |
|
|
|
|
flag.Parse() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func catchSignal() { |
|
|
|
|
sig := make(chan os.Signal) |
|
|
|
|
signal.Notify(sig, syscall.SIGSTOP, syscall.SIGTERM) |
|
|
|
|
<-sig |
|
|
|
|
log.Println("recieved signal!") |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func startHls() *hls.Server { |
|
|
|
|
hlsListen, err := net.Listen("tcp", *hlsAddr) |
|
|
|
|
if err != nil { |
|
|
|
@ -78,29 +32,29 @@ func startHls() *hls.Server {
@@ -78,29 +32,29 @@ func startHls() *hls.Server {
|
|
|
|
|
go func() { |
|
|
|
|
defer func() { |
|
|
|
|
if r := recover(); r != nil { |
|
|
|
|
log.Println("hls server panic: ", r) |
|
|
|
|
log.Println("HLS server panic: ", r) |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
log.Println("HLS Listen On", *hlsAddr) |
|
|
|
|
hlsServer.Serve(hlsListen) |
|
|
|
|
}() |
|
|
|
|
return hlsServer |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func startRtmp(stream *rtmp.RtmpStream, hlsServer *hls.Server) { |
|
|
|
|
rtmplisten, err := net.Listen("tcp", *rtmpAddr) |
|
|
|
|
rtmpListen, err := net.Listen("tcp", *rtmpAddr) |
|
|
|
|
if err != nil { |
|
|
|
|
log.Fatal(err) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
rtmpServer := rtmp.NewRtmpServer(stream, hlsServer) |
|
|
|
|
go func() { |
|
|
|
|
defer func() { |
|
|
|
|
if r := recover(); r != nil { |
|
|
|
|
log.Println("hls server panic: ", r) |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
rtmpServer.Serve(rtmplisten) |
|
|
|
|
defer func() { |
|
|
|
|
if r := recover(); r != nil { |
|
|
|
|
log.Println("RTMP server panic: ", r) |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
log.Println("RTMP Listen On", *rtmpAddr) |
|
|
|
|
rtmpServer.Serve(rtmpListen) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func startHTTPFlv(stream *rtmp.RtmpStream) { |
|
|
|
@ -113,9 +67,10 @@ func startHTTPFlv(stream *rtmp.RtmpStream) {
@@ -113,9 +67,10 @@ func startHTTPFlv(stream *rtmp.RtmpStream) {
|
|
|
|
|
go func() { |
|
|
|
|
defer func() { |
|
|
|
|
if r := recover(); r != nil { |
|
|
|
|
log.Println("hls server panic: ", r) |
|
|
|
|
log.Println("HTTP-FLV server panic: ", r) |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
log.Println("HTTP-FLV Listen On", *flvAddr) |
|
|
|
|
hdlServer.Serve(flvListen) |
|
|
|
|
}() |
|
|
|
|
} |
|
|
|
@ -130,43 +85,26 @@ func startHTTPOpera(stream *rtmp.RtmpStream) {
@@ -130,43 +85,26 @@ func startHTTPOpera(stream *rtmp.RtmpStream) {
|
|
|
|
|
go func() { |
|
|
|
|
defer func() { |
|
|
|
|
if r := recover(); r != nil { |
|
|
|
|
log.Println("hls server panic: ", r) |
|
|
|
|
log.Println("HTTP-Operation server panic: ", r) |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
log.Println("HTTP-Operation Listen On", *operaAddr) |
|
|
|
|
opServer.Serve(opListen) |
|
|
|
|
}() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func startLog() { |
|
|
|
|
log.Println("RTMP Listen On", *rtmpAddr) |
|
|
|
|
log.Println("HLS Listen On", *hlsAddr) |
|
|
|
|
log.Println("HTTP-FLV Listen On", *flvAddr) |
|
|
|
|
if *operaAddr != "" { |
|
|
|
|
log.Println("HTTP-Operation Listen On", *operaAddr) |
|
|
|
|
} |
|
|
|
|
SavePid() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func main() { |
|
|
|
|
defer func() { |
|
|
|
|
if r := recover(); r != nil { |
|
|
|
|
log.Println("main panic: ", r) |
|
|
|
|
log.Println("livego panic: ", r) |
|
|
|
|
time.Sleep(1 * time.Second) |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
|
|
|
|
|
stream := rtmp.NewRtmpStream() |
|
|
|
|
// hls
|
|
|
|
|
h := startHls() |
|
|
|
|
// rtmp
|
|
|
|
|
startRtmp(stream, h) |
|
|
|
|
// http-flv
|
|
|
|
|
hlsServer := startHls() |
|
|
|
|
startHTTPFlv(stream) |
|
|
|
|
// http-opera
|
|
|
|
|
startHTTPOpera(stream) |
|
|
|
|
// my log
|
|
|
|
|
startLog() |
|
|
|
|
// block
|
|
|
|
|
catchSignal() |
|
|
|
|
//startHTTPOpera(stream)
|
|
|
|
|
startRtmp(stream, hlsServer) |
|
|
|
|
} |
|
|
|
|