diff --git a/README.md b/README.md index fec7bf0..4362564 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Go语言编写的流媒体 库 / 客户端 / 服务端 ``` app/ ......各种main包的源码文件,一个子目录对应一个main包,即对应可生成一个可执行文件 |-- lal/ ......[最重要的] 流媒体服务器 -|-- flvfile2rtmppush ......rtmp推流客户端,输入是本地flv文件 +|-- flvfile2rtmppush ......rtmp推流客户端,输入是本地flv文件,文件推送完毕后,可循环推送(rtmp push流并不断开) |-- rtmppull ......rtmp拉流客户端 |-- httpflvpull ......http-flv拉流客户端 |-- modflvfile ......修改本地flv文件 @@ -50,10 +50,13 @@ conf/ ......配置文件目录 ``` $go get -u github.com/q191201771/lal -# cd into lal +# cd into $GOPATH/src/github.com/q191201771/lal $./build.sh $./bin/lal -c conf/lal.conf.json + +#如果使用 go module +$git clone https://github.com/q191201771/lal.git && cd lal && ./build.sh ``` #### 配置文件说明 diff --git a/app/flvfile2rtmppush/flvfile2rtmppush.go b/app/flvfile2rtmppush/flvfile2rtmppush.go index 28298c9..e76c14d 100644 --- a/app/flvfile2rtmppush/flvfile2rtmppush.go +++ b/app/flvfile2rtmppush/flvfile2rtmppush.go @@ -2,18 +2,19 @@ package main import ( "flag" + "fmt" "github.com/q191201771/lal/pkg/httpflv" "github.com/q191201771/lal/pkg/rtmp" - "github.com/q191201771/nezha/pkg/errors" + "github.com/q191201771/nezha/pkg/bininfo" "github.com/q191201771/nezha/pkg/log" "io" "os" "time" ) -// 将flv文件通过rtmp协议推送至rtmp服务器 +//rtmp推流客户端,输入是本地flv文件,文件推送完毕后,可循环推送(rtmp push流并不断开) // -// -r 表示当文件推送完毕后,是否循环推送(rtmp push流并不断开) +// -r 为1时表示当文件推送完毕后,是否循环推送(rtmp push流并不断开) // // Usage: // ./bin/flvfile2rtmppush -r 1 -i /tmp/test.flv -o rtmp://push.xxx.com/live/testttt @@ -23,13 +24,15 @@ func main() { flvFileName, rtmpPushURL, isRecursive := parseFlag() + log.Info(bininfo.StringifySingleLine()) + ps := rtmp.NewPushSession(rtmp.PushSessionTimeout{ - ConnectTimeoutMS:3000, - PushTimeoutMS:5000, - WriteAVTimeoutMS:10000, + ConnectTimeoutMS: 3000, + PushTimeoutMS: 5000, + WriteAVTimeoutMS: 10000, }) err = ps.Push(rtmpPushURL) - errors.PanicIfErrorOccur(err) + log.FatalIfErrorNotNil(err) log.Infof("push succ. url=%s", rtmpPushURL) var totalBaseTS uint32 @@ -43,11 +46,11 @@ func main() { var ffr httpflv.FlvFileReader err = ffr.Open(flvFileName) - errors.PanicIfErrorOccur(err) + log.FatalIfErrorNotNil(err) log.Infof("open succ. filename=%s", flvFileName) flvHeader, err := ffr.ReadFlvHeader() - errors.PanicIfErrorOccur(err) + log.FatalIfErrorNotNil(err) log.Infof("read flv header succ. %v", flvHeader) hasReadThisBaseTS = false @@ -58,7 +61,7 @@ func main() { log.Info("EOF") break } - errors.PanicIfErrorOccur(err) + log.FatalIfErrorNotNil(err) // TODO chef: 转换代码放入lal某个包中 var h rtmp.Header @@ -81,7 +84,7 @@ func main() { //log.Debugf("CHEFERASEME write metadata.") chunks := rtmp.Message2Chunks(tag.Raw[11:11+h.MsgLen], &h, rtmp.LocalChunkSize) err = ps.TmpWrite(chunks) - errors.PanicIfErrorOccur(err) + log.FatalIfErrorNotNil(err) } else { // noop } @@ -114,7 +117,7 @@ func main() { time.Sleep(time.Duration(diff) * time.Millisecond) //log.Debug("send") err = ps.TmpWrite(chunks) - errors.PanicIfErrorOccur(err) + log.FatalIfErrorNotNil(err) prevTS = h.Timestamp } @@ -128,10 +131,15 @@ func main() { } func parseFlag() (string, string, bool) { + v := flag.Bool("v", false, "show bin info") i := flag.String("i", "", "specify flv file") o := flag.String("o", "", "specify rtmp push url") r := flag.Bool("r", false, "recursive push if reach end of file") flag.Parse() + if *v { + _, _ = fmt.Fprint(os.Stderr, bininfo.StringifyMultiLine()) + os.Exit(1) + } if *i == "" || *o == "" { flag.Usage() os.Exit(1) diff --git a/app/lal/main.go b/app/lal/main.go index dec5c43..8fc72f8 100644 --- a/app/lal/main.go +++ b/app/lal/main.go @@ -32,7 +32,7 @@ func parseFlag() string { cf := flag.String("c", "", "specify conf file") flag.Parse() if *binInfoFlag { - fmt.Fprint(os.Stderr, bininfo.StringifyMultiLine()) + _, _ = fmt.Fprint(os.Stderr, bininfo.StringifyMultiLine()) os.Exit(1) } if *cf == "" { diff --git a/app/rtmppull/rtmppull.go b/app/rtmppull/rtmppull.go index 9b7cc5b..f877484 100644 --- a/app/rtmppull/rtmppull.go +++ b/app/rtmppull/rtmppull.go @@ -19,9 +19,9 @@ func main() { url := parseFlag() var obs Obs session := rtmp.NewPullSession(obs, rtmp.PullSessionTimeout{ - ConnectTimeoutMS:3000, - PullTimeoutMS:5000, - ReadAVTimeoutMS:10000, + ConnectTimeoutMS: 3000, + PullTimeoutMS: 5000, + ReadAVTimeoutMS: 10000, }) err := session.Pull(url) errors.PanicIfErrorOccur(err) diff --git a/build.sh b/build.sh index 21ca2ce..f2b6768 100755 --- a/build.sh +++ b/build.sh @@ -3,7 +3,6 @@ set -x ROOT_DIR=`pwd` -echo ${ROOT_DIR}/bin if [ ! -d ${ROOT_DIR}/bin ]; then mkdir bin @@ -15,17 +14,18 @@ GitStatus=`git status -s` BuildTime=`date +'%Y.%m.%d.%H%M%S'` BuildGoVersion=`go version` -cd ${ROOT_DIR}/app/lal && \ - go build -ldflags " \ +LDFlags=" \ -X 'github.com/q191201771/nezha/pkg/bininfo.GitCommitLog=${GitCommitLog}' \ -X 'github.com/q191201771/nezha/pkg/bininfo.GitStatus=${GitStatus}' \ -X 'github.com/q191201771/nezha/pkg/bininfo.BuildTime=${BuildTime}' \ -X 'github.com/q191201771/nezha/pkg/bininfo.BuildGoVersion=${BuildGoVersion}' \ - " -o ${ROOT_DIR}/bin/lal +" -cd ${ROOT_DIR}/app/flvfile2es && go build -o ${ROOT_DIR}/bin/flvfile2es +cd ${ROOT_DIR}/app/lal && go build -ldflags "$LDFlags" -o ${ROOT_DIR}/bin/lal + +cd ${ROOT_DIR}/app/flvfile2rtmppush && go build -ldflags "$LDFlags" -o ${ROOT_DIR}/bin/flvfile2rtmppush -cd ${ROOT_DIR}/app/flvfile2rtmppush && go build -o ${ROOT_DIR}/bin/flvfile2rtmppush +cd ${ROOT_DIR}/app/flvfile2es && go build -o ${ROOT_DIR}/bin/flvfile2es cd ${ROOT_DIR}/app/httpflvpull && go build -o ${ROOT_DIR}/bin/httpflvpull diff --git a/build_linux.sh b/build_linux.sh index a98104f..b77dd45 100755 --- a/build_linux.sh +++ b/build_linux.sh @@ -2,36 +2,6 @@ set -x -ROOT_DIR=`pwd` -echo ${ROOT_DIR}/bin - -if [ ! -d ${ROOT_DIR}/bin ]; then - mkdir bin -fi - -#GitCommitID=`git log --pretty=format:'%h' -n 1` -GitCommitLog=`git log --pretty=oneline -n 1` -GitStatus=`git status -s` -BuildTime=`date +'%Y.%m.%d.%H%M%S'` -BuildGoVersion=`go version` - -cd ${ROOT_DIR}/app/lal && \ - GOOS=linux GOARCH=amd64 go build -ldflags " \ - -X 'github.com/q191201771/nezha/pkg/bininfo.GitCommitLog=${GitCommitLog}' \ - -X 'github.com/q191201771/nezha/pkg/bininfo.GitStatus=${GitStatus}' \ - -X 'github.com/q191201771/nezha/pkg/bininfo.BuildTime=${BuildTime}' \ - -X 'github.com/q191201771/nezha/pkg/bininfo.BuildGoVersion=${BuildGoVersion}' \ - " -o ${ROOT_DIR}/bin/lal.linux - -cd ${ROOT_DIR}/app/flvfile2es && GOOS=linux GOARCH=amd64 go build -o ${ROOT_DIR}/bin/flvfile2es - -cd ${ROOT_DIR}/app/flvfile2rtmppush && GOOS=linux GOARCH=amd64 go build -o ${ROOT_DIR}/bin/flvfile2rtmppush.linux - -cd ${ROOT_DIR}/app/httpflvpull && GOOS=linux GOARCH=amd64 go build -o ${ROOT_DIR}/bin/httpflvpull - -cd ${ROOT_DIR}/app/modflvfile && GOOS=linux GOARCH=amd64 go build -o ${ROOT_DIR}/bin/modflvfile - -cd ${ROOT_DIR}/app/rtmppull && GOOS=linux GOARCH=amd64 go build -o ${ROOT_DIR}/bin/rtmppull - -${ROOT_DIR}/bin/lal -v -ls -lrt ${ROOT_DIR}/bin +export GOOS=linux +export GOARCH=amd64 +sh build.sh diff --git a/go.mod b/go.mod index 954d74d..c031e68 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,4 @@ module github.com/q191201771/lal go 1.12 -require github.com/q191201771/nezha v0.0.1 +require github.com/q191201771/nezha v0.0.2-0.20190904074707-20fd1445a085 diff --git a/go.sum b/go.sum index b2908db..93ea4c7 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,2 @@ -github.com/q191201771/nezha v0.0.1 h1:WVHhbw98eYrGBcznuErr1hGeNzBeoxHh5hNRErc6ofY= -github.com/q191201771/nezha v0.0.1/go.mod h1:Rd4R+bJRemlSUnz7KHmSX6ZQlsHLBjT7wlzuLeOia/M= +github.com/q191201771/nezha v0.0.2-0.20190904074707-20fd1445a085 h1:S6/SulRptcCXgV6hbbWGgqiKmMLf7iXHjT6Qomj5qdk= +github.com/q191201771/nezha v0.0.2-0.20190904074707-20fd1445a085/go.mod h1:Rd4R+bJRemlSUnz7KHmSX6ZQlsHLBjT7wlzuLeOia/M= diff --git a/pkg/rtmp/chunk_divider.go b/pkg/rtmp/chunk_divider.go index 68ab052..5f673f5 100644 --- a/pkg/rtmp/chunk_divider.go +++ b/pkg/rtmp/chunk_divider.go @@ -5,7 +5,6 @@ package rtmp // 将message切割成chunk import ( - "github.com/q191201771/nezha/pkg/log" "github.com/q191201771/nezha/pkg/bele" ) @@ -84,7 +83,7 @@ func calcHeader(header *Header, prevHeader *Header) []byte { // 设置扩展时间戳 if timestamp > maxTimestampInMessageHeader { - log.Debugf("CHEFERASEME %+v %+v %d %d", header, prevHeader, timestamp, index) + //log.Debugf("CHEFERASEME %+v %+v %d %d", header, prevHeader, timestamp, index) bele.BEPutUint32(out[index:], timestamp) index += 4 } diff --git a/pkg/rtmp/client_session.go b/pkg/rtmp/client_session.go index 3f126f4..ce7ac89 100644 --- a/pkg/rtmp/client_session.go +++ b/pkg/rtmp/client_session.go @@ -168,7 +168,7 @@ func (s *ClientSession) doMsg(stream *Stream) error { } func (s *ClientSession) doAck(stream *Stream) error { - seqNum := bele.BEUint32(stream.msg.buf[stream.msg.b: stream.msg.e]) + seqNum := bele.BEUint32(stream.msg.buf[stream.msg.b:stream.msg.e]) log.Infof("-----> Acknowledgement. [%s] ignore. sequence number=%d.", s.UniqueKey, seqNum) return nil } diff --git a/pkg/rtmp/group.go b/pkg/rtmp/group.go index 1624830..7d5636d 100644 --- a/pkg/rtmp/group.go +++ b/pkg/rtmp/group.go @@ -91,7 +91,7 @@ func (group *Group) DelSubSession(session *ServerSession) { func (group *Group) Pull(addr string, connectTimeout int64) { // TODO chef: config me, group.pullSession = NewPullSession(group, PullSessionTimeout{ - ConnectTimeoutMS:int(connectTimeout), + ConnectTimeoutMS: int(connectTimeout), }) defer func() { diff --git a/pkg/rtmp/rtmp.go b/pkg/rtmp/rtmp.go index 9417f2f..4181fa4 100644 --- a/pkg/rtmp/rtmp.go +++ b/pkg/rtmp/rtmp.go @@ -23,7 +23,7 @@ const ( TypeidVideo = 9 TypeidDataMessageAMF0 = 18 // meta typeidSetChunkSize = 1 - typeidAck = 3 + typeidAck = 3 typeidUserControl = 4 typeidWinAckSize = 5 typeidBandwidth = 6