package main import ( "flag" "net" "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" "github.com/gwuhaolin/livego/protocol/websocketflv" ) var ( rtmpAddr = flag.String("rtmp-addr", ":1935", "RTMP server listen address") httpFlvAddr = flag.String("http-flv-addr", ":7001", "HTTP-FLV server listen address") websocketFlvAddr = flag.String("websocket-flv-addr", ":7002", "HTTP-FLV server listen address") hlsAddr = flag.String("hls-addr", ":7003", "HLS server listen address") operaAddr = flag.String("manage-addr", ":8080", "HTTP manage interface server listen address") ) func init() { log.SetFlags(log.Llongfile | log.Ltime | log.Ldate) flag.Parse() } func startHls() *hls.Server { hlsListen, err := net.Listen("tcp", *hlsAddr) if err != nil { log.Fatal(err) } hlsServer := hls.NewServer() go func() { defer func() { if r := recover(); r != nil { 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) if err != nil { log.Fatal(err) } rtmpServer := rtmp.NewRtmpServer(stream, hlsServer) 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) { flvListen, err := net.Listen("tcp", *httpFlvAddr) if err != nil { log.Fatal(err) } hdlServer := httpflv.NewServer(stream) go func() { defer func() { if r := recover(); r != nil { log.Println("HTTP-FLV server panic: ", r) } }() log.Println("HTTP-FLV Listen On", *httpFlvAddr) hdlServer.Serve(flvListen) }() } func startWebSocketFlv(stream *rtmp.RtmpStream) { flvListen, err := net.Listen("tcp", *websocketFlvAddr) if err != nil { log.Fatal(err) } hdlServer := websocketflv.NewServer(stream) go func() { defer func() { if r := recover(); r != nil { log.Println("WebSocket-FLV server panic: ", r) } }() log.Println("WebSocket-FLV Listen On", *websocketFlvAddr) hdlServer.Serve(flvListen) }() } func startHTTPOpera(stream *rtmp.RtmpStream) { if *operaAddr != "" { opListen, err := net.Listen("tcp", *operaAddr) if err != nil { log.Fatal(err) } opServer := httpopera.NewServer(stream) go func() { defer func() { if r := recover(); r != nil { log.Println("HTTP-Operation server panic: ", r) } }() log.Println("HTTP-Operation Listen On", *operaAddr) opServer.Serve(opListen) }() } } func main() { defer func() { if r := recover(); r != nil { log.Println("livego panic: ", r) time.Sleep(1 * time.Second) } }() stream := rtmp.NewRtmpStream() hlsServer := startHls() startHTTPFlv(stream) startWebSocketFlv(stream) //startHTTPOpera(stream) startRtmp(stream, hlsServer) }