From 74da8bec1444ee55c6b453f45039076b7d28d360 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=B5=A9=E9=BA=9F?= Date: Fri, 25 Oct 2019 15:37:33 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E6=8E=A5=E5=85=A5go=20mod=20-=20=E6=8E=A5?= =?UTF-8?q?=E5=85=A5docker=20-=20=E6=8E=A5=E5=85=A5github=20action?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=8F=91=E5=B8=83=E5=92=8C=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/release.yml | 27 +++++++++++++++++++++ .github/workflows/test.yml | 22 ++++++++++++++++++ .goreleaser.yml | 16 +++++++++++++ .livego.json | 9 +++++++ Dockerfile | 19 +++++++++++++++ README.md | 21 ++++++++++------- av/av.go | 6 +++-- av/rwbase.go | 6 +++-- container/flv/demuxer.go | 1 + container/flv/muxer.go | 18 +++++++------- container/flv/tag.go | 1 + container/ts/muxer.go | 5 ++-- container/ts/muxer_test.go | 31 +++++++++++++------------ go.mod | 11 +++++++++ goreleaser.yml | 11 --------- livego.cfg | 10 -------- livego.go => main.go | 9 +++---- parser/aac/parser.go | 1 + parser/h264/parser.go | 6 ++--- parser/h264/parser_test.go | 9 +++---- parser/parser.go | 5 ++-- protocol/amf/decoder_amf3_test.go | 18 +++++++------- protocol/amf/encoder_amf3_test.go | 18 +++++++------- protocol/hls/hls.go | 3 ++- protocol/hls/source.go | 9 +++---- protocol/httpflv/server.go | 5 ++-- protocol/httpflv/writer.go | 7 +++--- protocol/httpopera/http_opera.go | 5 ++-- protocol/rtmp/cache/cache.go | 1 + protocol/rtmp/cache/gop.go | 1 + protocol/rtmp/cache/special.go | 2 +- protocol/rtmp/core/chunk_stream.go | 4 ++-- protocol/rtmp/core/chunk_stream_test.go | 2 +- protocol/rtmp/core/conn.go | 5 ++-- protocol/rtmp/core/conn_client.go | 5 ++-- protocol/rtmp/core/conn_server.go | 5 ++-- protocol/rtmp/core/conn_test.go | 5 ++-- protocol/rtmp/core/handshake.go | 6 ++--- protocol/rtmp/rtmp.go | 17 +++++++------- protocol/rtmp/rtmprelay/rtmprelay.go | 5 ++-- protocol/rtmp/rtmprelay/staticrelay.go | 5 ++-- protocol/rtmp/stream.go | 7 +++--- utils/pool/pool.go | 2 +- utils/queue/queue.go | 1 + utils/uid/uuid.go | 3 ++- 45 files changed, 251 insertions(+), 134 deletions(-) create mode 100644 .github/workflows/release.yml create mode 100644 .github/workflows/test.yml create mode 100644 .goreleaser.yml create mode 100644 .livego.json create mode 100644 Dockerfile create mode 100644 go.mod delete mode 100644 goreleaser.yml delete mode 100644 livego.cfg rename livego.go => main.go (97%) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..87e8c87 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,27 @@ +name: release +on: + release: + types: [published] +jobs: + goreleaser: + runs-on: ubuntu-latest + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - name: Set up Go 1.13 + uses: actions/setup-go@v1 + with: + go-version: 1.13 + id: go + - name: Check out code into the Go module directory + uses: actions/checkout@v1 + - name: Get dependencies + run: go mod tidy + - name: Go release + uses: goreleaser/goreleaser-action@v1 + - name: Docker release + uses: elgohr/Publish-Docker-Github-Action@master + with: + name: gwuhaolin/livego + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..3e74b32 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,22 @@ +name: Test +on: [push] +jobs: + test: + name: Build + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macOS-latest] + + steps: + - name: Set up Go 1.13 + uses: actions/setup-go@v1 + with: + go-version: 1.13 + id: go + - name: Check out code into the Go module directory + uses: actions/checkout@v1 + - name: Get dependencies + run: go mod tidy + - name: Test + run: go test ./... diff --git a/.goreleaser.yml b/.goreleaser.yml new file mode 100644 index 0000000..22832af --- /dev/null +++ b/.goreleaser.yml @@ -0,0 +1,16 @@ +before: + hooks: + - go mod tidy +builds: + - binary: livego + id: livego + main: ./main.go + goos: + - windows + - darwin + - linux + - freebsd + goarch: + - amd64 + - 386 + - arm \ No newline at end of file diff --git a/.livego.json b/.livego.json new file mode 100644 index 0000000..47bab74 --- /dev/null +++ b/.livego.json @@ -0,0 +1,9 @@ +{ + "server": [ + { + "appname": "live", + "liveon": "on", + "hlson": "on" + } + ] +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2bf89c1 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +FROM golang:latest as builder +WORKDIR /app +COPY go.mod go.sum ./ +RUN go mod download +COPY . . +RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o livego ./ + +FROM alpine:latest +LABEL maintainer="gwuhaolin " +ENV RTMP_PORT 1935 +ENV HTTP_FLV_PORT 7001 +ENV HLS_PORT 7002 +ENV HTTP_OPERATION_PORT 8090 +COPY --from=builder /app/livego . +EXPOSE ${RTMP_PORT} +EXPOSE ${HTTP_FLV_PORT} +EXPOSE ${HLS_PORT} +EXPOSE ${HTTP_OPERATION_PORT} +CMD ./livego \ No newline at end of file diff --git a/README.md b/README.md index 9bf0e0e..c07f496 100644 --- a/README.md +++ b/README.md @@ -5,23 +5,26 @@ - 支持常用的传输协议、文件格式、编码格式; #### 支持的传输协议 -- [x] RTMP -- [x] AMF -- [x] HLS -- [x] HTTP-FLV +- RTMP +- AMF +- HLS +- HTTP-FLV #### 支持的容器格式 -- [x] FLV -- [x] TS +- FLV +- TS #### 支持的编码格式 -- [x] H264 -- [x] AAC -- [x] MP3 +- H264 +- AAC +- MP3 ## 安装 直接下载编译好的[二进制文件](https://github.com/gwuhaolin/livego/releases)后,在命令行中执行。 +#### 从 Docker 启动 +执行`docker run -p 1935:1935 -p 7001:7001 -p 7002:7002 -d --name livego gwuhaolin/livego`启动 + #### 从源码编译 1. 下载源码 `git clone https://github.com/gwuhaolin/livego.git` 2. 去 livego 目录中 执行 `go build` diff --git a/av/av.go b/av/av.go index 82b3b29..8462db6 100755 --- a/av/av.go +++ b/av/av.go @@ -1,7 +1,9 @@ package av -import "io" -import "fmt" +import ( + "fmt" + "io" +) const ( TAG_AUDIO = 8 diff --git a/av/rwbase.go b/av/rwbase.go index 3bd6c45..d932c08 100755 --- a/av/rwbase.go +++ b/av/rwbase.go @@ -1,7 +1,9 @@ package av -import "time" -import "sync" +import ( + "sync" + "time" +) type RWBaser struct { lock sync.Mutex diff --git a/container/flv/demuxer.go b/container/flv/demuxer.go index 9843978..2c205ba 100755 --- a/container/flv/demuxer.go +++ b/container/flv/demuxer.go @@ -2,6 +2,7 @@ package flv import ( "errors" + "github.com/gwuhaolin/livego/av" ) diff --git a/container/flv/muxer.go b/container/flv/muxer.go index 41812c3..465ba3d 100755 --- a/container/flv/muxer.go +++ b/container/flv/muxer.go @@ -1,16 +1,17 @@ package flv import ( - "strings" - "time" "flag" - "os" - "log" "fmt" - "github.com/gwuhaolin/livego/utils/uid" - "github.com/gwuhaolin/livego/protocol/amf" + "log" + "os" + "strings" + "time" + "github.com/gwuhaolin/livego/av" + "github.com/gwuhaolin/livego/protocol/amf" "github.com/gwuhaolin/livego/utils/pio" + "github.com/gwuhaolin/livego/utils/uid" ) var ( @@ -46,7 +47,7 @@ const ( ) type FLVWriter struct { - Uid string + Uid string av.RWBaser app, title, url string buf []byte @@ -137,6 +138,7 @@ func (writer *FLVWriter) Info() (ret av.Info) { ret.Key = writer.app + "/" + writer.title return } + type FlvDvr struct{} func (f *FlvDvr) GetWriter(info av.Info) av.WriteCloser { @@ -164,4 +166,4 @@ func (f *FlvDvr) GetWriter(info av.Info) av.WriteCloser { writer := NewFLVWriter(paths[0], paths[1], info.URL, w) log.Println("new flv dvr: ", writer.Info()) return writer -} \ No newline at end of file +} diff --git a/container/flv/tag.go b/container/flv/tag.go index 550efaa..5c85466 100755 --- a/container/flv/tag.go +++ b/container/flv/tag.go @@ -2,6 +2,7 @@ package flv import ( "fmt" + "github.com/gwuhaolin/livego/av" ) diff --git a/container/ts/muxer.go b/container/ts/muxer.go index 1731a58..cbb9981 100755 --- a/container/ts/muxer.go +++ b/container/ts/muxer.go @@ -2,6 +2,7 @@ package ts import ( "io" + "github.com/gwuhaolin/livego/av" ) @@ -207,7 +208,7 @@ func (muxer *Muxer) PMT(soundFormat byte, hasVideo bool) []byte { progInfo = []byte{0x0f, 0xe1, 0x01, 0xf0, 0x00} } else { progInfo = []byte{0x1b, 0xe1, 0x00, 0xf0, 0x00, //h264 or h265* - 0x0f, 0xe1, 0x01, 0xf0, 0x00, //mp3 or aac + 0x0f, 0xe1, 0x01, 0xf0, 0x00, //mp3 or aac } } pmtHeader[2] = byte(len(progInfo) + 9 + 4) @@ -236,7 +237,7 @@ func (muxer *Muxer) PMT(soundFormat byte, hasVideo bool) []byte { copy(muxer.pmt[i:], progInfo[0:]) i += len(progInfo) - crc32Value := GenCrc32(muxer.pmt[5: 5+len(pmtHeader)+len(progInfo)]) + crc32Value := GenCrc32(muxer.pmt[5 : 5+len(pmtHeader)+len(progInfo)]) muxer.pmt[i] = byte(crc32Value >> 24) i++ muxer.pmt[i] = byte(crc32Value >> 16) diff --git a/container/ts/muxer_test.go b/container/ts/muxer_test.go index 9d46f49..52b3668 100755 --- a/container/ts/muxer_test.go +++ b/container/ts/muxer_test.go @@ -2,6 +2,7 @@ package ts import ( "testing" + "github.com/gwuhaolin/livego/av" "github.com/stretchr/testify/assert" ) @@ -24,8 +25,8 @@ func TestTSEncoder(t *testing.T) { w := &TestWriter{} data := []byte{0xaf, 0x01, 0x21, 0x19, 0xd3, 0x40, 0x7d, 0x0b, 0x6d, 0x44, 0xae, 0x81, - 0x08, 0x00, 0x89, 0xa0, 0x3e, 0x85, 0xb6, 0x92, 0x57, 0x04, 0x80, 0x00, 0x5b, 0xb7, - 0x78, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x30, 0x00, 0x06, 0x00, 0x38, + 0x08, 0x00, 0x89, 0xa0, 0x3e, 0x85, 0xb6, 0x92, 0x57, 0x04, 0x80, 0x00, 0x5b, 0xb7, + 0x78, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x30, 0x00, 0x06, 0x00, 0x38, } p := av.Packet{ IsVideo: false, @@ -35,17 +36,17 @@ func TestTSEncoder(t *testing.T) { at.Equal(err, nil) at.Equal(w.count, 1) at.Equal(w.buf, []byte{0x47, 0x41, 0x01, 0x31, 0x81, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x30, - 0x80, 0x80, 0x05, 0x21, 0x00, 0x01, 0x00, 0x01, 0xaf, 0x01, 0x21, 0x19, 0xd3, 0x40, 0x7d, - 0x0b, 0x6d, 0x44, 0xae, 0x81, 0x08, 0x00, 0x89, 0xa0, 0x3e, 0x85, 0xb6, 0x92, 0x57, 0x04, - 0x80, 0x00, 0x5b, 0xb7, 0x78, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x30, 0x00, - 0x06, 0x00, 0x38}) + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0xc0, 0x00, 0x30, + 0x80, 0x80, 0x05, 0x21, 0x00, 0x01, 0x00, 0x01, 0xaf, 0x01, 0x21, 0x19, 0xd3, 0x40, 0x7d, + 0x0b, 0x6d, 0x44, 0xae, 0x81, 0x08, 0x00, 0x89, 0xa0, 0x3e, 0x85, 0xb6, 0x92, 0x57, 0x04, + 0x80, 0x00, 0x5b, 0xb7, 0x78, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x30, 0x00, + 0x06, 0x00, 0x38}) } diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..eb76727 --- /dev/null +++ b/go.mod @@ -0,0 +1,11 @@ +module github.com/gwuhaolin/livego + +go 1.13 + +require ( + github.com/kr/pretty v0.1.0 // indirect + github.com/orcaman/concurrent-map v0.0.0-20190826125027-8c72a8bb44f6 + github.com/satori/go.uuid v1.2.0 + github.com/stretchr/testify v1.4.0 + gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect +) diff --git a/goreleaser.yml b/goreleaser.yml deleted file mode 100644 index 66f5276..0000000 --- a/goreleaser.yml +++ /dev/null @@ -1,11 +0,0 @@ -build: - binary: livego - goos: - - windows - - darwin - - linux - - freebsd - goarch: - - amd64 - - 386 - - arm \ No newline at end of file diff --git a/livego.cfg b/livego.cfg deleted file mode 100644 index b9ddbef..0000000 --- a/livego.cfg +++ /dev/null @@ -1,10 +0,0 @@ -{ - "server": [ - { - "appname":"live", - "liveon":"on", - "hlson":"on" - } - ] -} - diff --git a/livego.go b/main.go similarity index 97% rename from livego.go rename to main.go index a6e2976..bdd45ff 100755 --- a/livego.go +++ b/main.go @@ -2,14 +2,15 @@ package main import ( "flag" + "log" + "net" + "time" + "github.com/gwuhaolin/livego/configure" "github.com/gwuhaolin/livego/protocol/hls" "github.com/gwuhaolin/livego/protocol/httpflv" "github.com/gwuhaolin/livego/protocol/httpopera" "github.com/gwuhaolin/livego/protocol/rtmp" - "log" - "net" - "time" ) var ( @@ -18,7 +19,7 @@ var ( httpFlvAddr = flag.String("httpflv-addr", ":7001", "HTTP-FLV server listen address") hlsAddr = flag.String("hls-addr", ":7002", "HLS server listen address") operaAddr = flag.String("manage-addr", ":8090", "HTTP manage interface server listen address") - configfilename = flag.String("cfgfile", "livego.cfg", "live configure filename") + configfilename = flag.String("cfgfile", ".livego.json", "configure filename") ) func init() { diff --git a/parser/aac/parser.go b/parser/aac/parser.go index 35ffe78..e9caf57 100755 --- a/parser/aac/parser.go +++ b/parser/aac/parser.go @@ -3,6 +3,7 @@ package aac import ( "errors" "io" + "github.com/gwuhaolin/livego/av" ) diff --git a/parser/h264/parser.go b/parser/h264/parser.go index e065622..b3c5481 100755 --- a/parser/h264/parser.go +++ b/parser/h264/parser.go @@ -98,7 +98,7 @@ func (parser *Parser) parseSpecificInfo(src []byte) error { return spsDataError } sps = append(sps, startCode...) - sps = append(sps, src[8:(8 + seq.spsLen)]...) + sps = append(sps, src[8:(8+seq.spsLen)]...) //get pps tmpBuf := src[(8 + seq.spsLen):] @@ -190,7 +190,7 @@ func (parser *Parser) getAnnexbH264(src []byte, w io.Writer) error { if err != nil { return err } - _, err = w.Write(src[index: index+nalLen]) + _, err = w.Write(src[index : index+nalLen]) if err != nil { return err } @@ -202,7 +202,7 @@ func (parser *Parser) getAnnexbH264(src []byte, w io.Writer) error { if err != nil { return err } - _, err = parser.pps.Write(src[index: index+nalLen]) + _, err = parser.pps.Write(src[index : index+nalLen]) if err != nil { return err } diff --git a/parser/h264/parser_test.go b/parser/h264/parser_test.go index 4773168..40d43e4 100755 --- a/parser/h264/parser_test.go +++ b/parser/h264/parser_test.go @@ -4,6 +4,7 @@ import ( "bytes" "errors" "testing" + "github.com/stretchr/testify/assert" ) @@ -20,8 +21,8 @@ func TestH264SeqDemux(t *testing.T) { err := d.Parse(seq, true, w) at.Equal(err, nil) at.Equal(d.specificInfo, []byte{0x00, 0x00, 0x00, 0x01, 0x67, 0x4d, 0x00, - 0x1e, 0xab, 0x40, 0x5a, 0x12, 0x6c, 0x09, 0x28, 0x28, 0x28, 0x2f, - 0x80, 0x00, 0x01, 0xf4, 0x00, 0x00, 0x61, 0xa8, 0x4a, 0x00, 0x00, 0x00, 0x01, 0x68, 0xde, 0x31, 0x12}) + 0x1e, 0xab, 0x40, 0x5a, 0x12, 0x6c, 0x09, 0x28, 0x28, 0x28, 0x2f, + 0x80, 0x00, 0x01, 0xf4, 0x00, 0x00, 0x61, 0xa8, 0x4a, 0x00, 0x00, 0x00, 0x01, 0x68, 0xde, 0x31, 0x12}) } func TestH264AnnexbDemux(t *testing.T) { @@ -62,8 +63,8 @@ func TestH264Mp4Demux(t *testing.T) { at.Equal(err, nil) at.Equal(w.Len(), 47) at.Equal(w.Bytes(), []byte{0x00, 0x00, 0x00, 0x01, 0x09, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x67, 0x4d, 0x00, 0x1e, 0xab, 0x40, 0x5a, 0x12, 0x6c, 0x09, 0x28, 0x28, - 0x28, 0x2f, 0x80, 0x00, 0x01, 0xf4, 0x00, 0x00, 0x61, 0xa8, 0x4a, 0x00, 0x00, 0x00, 0x01, 0x68, - 0xde, 0x31, 0x12, 0x00, 0x00, 0x00, 0x01, 0x65, 0x23}) + 0x28, 0x2f, 0x80, 0x00, 0x01, 0xf4, 0x00, 0x00, 0x61, 0xa8, 0x4a, 0x00, 0x00, 0x00, 0x01, 0x68, + 0xde, 0x31, 0x12, 0x00, 0x00, 0x00, 0x01, 0x65, 0x23}) } func TestH264Mp4DemuxException1(t *testing.T) { diff --git a/parser/parser.go b/parser/parser.go index ba1b115..05b4d73 100755 --- a/parser/parser.go +++ b/parser/parser.go @@ -3,10 +3,11 @@ package parser import ( "errors" "io" - "github.com/gwuhaolin/livego/parser/mp3" - "github.com/gwuhaolin/livego/parser/aac" + "github.com/gwuhaolin/livego/av" + "github.com/gwuhaolin/livego/parser/aac" "github.com/gwuhaolin/livego/parser/h264" + "github.com/gwuhaolin/livego/parser/mp3" ) var ( diff --git a/protocol/amf/decoder_amf3_test.go b/protocol/amf/decoder_amf3_test.go index 7833054..d633f3a 100755 --- a/protocol/amf/decoder_amf3_test.go +++ b/protocol/amf/decoder_amf3_test.go @@ -166,15 +166,15 @@ func TestDecodeAmf3String(t *testing.T) { func TestDecodeAmf3Array(t *testing.T) { buf := bytes.NewReader([]byte{0x09, 0x13, 0x01, - 0x06, 0x03, '1', - 0x06, 0x03, '2', - 0x06, 0x03, '3', - 0x06, 0x03, '4', - 0x06, 0x03, '5', - 0x06, 0x03, '6', - 0x06, 0x03, '7', - 0x06, 0x03, '8', - 0x06, 0x03, '9', + 0x06, 0x03, '1', + 0x06, 0x03, '2', + 0x06, 0x03, '3', + 0x06, 0x03, '4', + 0x06, 0x03, '5', + 0x06, 0x03, '6', + 0x06, 0x03, '7', + 0x06, 0x03, '8', + 0x06, 0x03, '9', }) dec := new(Decoder) diff --git a/protocol/amf/encoder_amf3_test.go b/protocol/amf/encoder_amf3_test.go index a866abb..1a44f79 100755 --- a/protocol/amf/encoder_amf3_test.go +++ b/protocol/amf/encoder_amf3_test.go @@ -151,15 +151,15 @@ func TestEncodeAmf3Array(t *testing.T) { enc := new(Encoder) buf := new(bytes.Buffer) expect := []byte{0x09, 0x13, 0x01, - 0x06, 0x03, '1', - 0x06, 0x03, '2', - 0x06, 0x03, '3', - 0x06, 0x03, '4', - 0x06, 0x03, '5', - 0x06, 0x03, '6', - 0x06, 0x03, '7', - 0x06, 0x03, '8', - 0x06, 0x03, '9', + 0x06, 0x03, '1', + 0x06, 0x03, '2', + 0x06, 0x03, '3', + 0x06, 0x03, '4', + 0x06, 0x03, '5', + 0x06, 0x03, '6', + 0x06, 0x03, '7', + 0x06, 0x03, '8', + 0x06, 0x03, '9', } arr := []string{"1", "2", "3", "4", "5", "6", "7", "8", "9"} diff --git a/protocol/hls/hls.go b/protocol/hls/hls.go index f10eecb..749b81a 100755 --- a/protocol/hls/hls.go +++ b/protocol/hls/hls.go @@ -3,13 +3,14 @@ package hls import ( "errors" "fmt" + "log" "net" "net/http" "path" "strconv" "strings" "time" - "log" + "github.com/gwuhaolin/livego/av" "github.com/orcaman/concurrent-map" ) diff --git a/protocol/hls/source.go b/protocol/hls/source.go index a1fb670..c2fc7a0 100644 --- a/protocol/hls/source.go +++ b/protocol/hls/source.go @@ -1,15 +1,16 @@ package hls import ( - "fmt" - "time" "bytes" - "log" "errors" - "github.com/gwuhaolin/livego/parser" + "fmt" + "log" + "time" + "github.com/gwuhaolin/livego/av" "github.com/gwuhaolin/livego/container/flv" "github.com/gwuhaolin/livego/container/ts" + "github.com/gwuhaolin/livego/parser" ) const ( diff --git a/protocol/httpflv/server.go b/protocol/httpflv/server.go index 292a330..8c46c23 100644 --- a/protocol/httpflv/server.go +++ b/protocol/httpflv/server.go @@ -2,12 +2,13 @@ package httpflv import ( "encoding/json" - "github.com/gwuhaolin/livego/av" - "github.com/gwuhaolin/livego/protocol/rtmp" "log" "net" "net/http" "strings" + + "github.com/gwuhaolin/livego/av" + "github.com/gwuhaolin/livego/protocol/rtmp" ) type Server struct { diff --git a/protocol/httpflv/writer.go b/protocol/httpflv/writer.go index 353f964..70ed67b 100755 --- a/protocol/httpflv/writer.go +++ b/protocol/httpflv/writer.go @@ -1,15 +1,16 @@ package httpflv import ( - "time" "errors" "fmt" "log" "net/http" - "github.com/gwuhaolin/livego/utils/uid" - "github.com/gwuhaolin/livego/protocol/amf" + "time" + "github.com/gwuhaolin/livego/av" + "github.com/gwuhaolin/livego/protocol/amf" "github.com/gwuhaolin/livego/utils/pio" + "github.com/gwuhaolin/livego/utils/uid" ) const ( diff --git a/protocol/httpopera/http_opera.go b/protocol/httpopera/http_opera.go index 294359e..22071b4 100755 --- a/protocol/httpopera/http_opera.go +++ b/protocol/httpopera/http_opera.go @@ -3,13 +3,14 @@ package httpopera import ( "encoding/json" "fmt" - "github.com/gwuhaolin/livego/protocol/rtmp/rtmprelay" "io" + "log" "net" "net/http" - "log" + "github.com/gwuhaolin/livego/av" "github.com/gwuhaolin/livego/protocol/rtmp" + "github.com/gwuhaolin/livego/protocol/rtmp/rtmprelay" ) type Response struct { diff --git a/protocol/rtmp/cache/cache.go b/protocol/rtmp/cache/cache.go index 1dd25cd..a5c604b 100755 --- a/protocol/rtmp/cache/cache.go +++ b/protocol/rtmp/cache/cache.go @@ -2,6 +2,7 @@ package cache import ( "flag" + "github.com/gwuhaolin/livego/av" ) diff --git a/protocol/rtmp/cache/gop.go b/protocol/rtmp/cache/gop.go index 1c1a1d0..ececab4 100755 --- a/protocol/rtmp/cache/gop.go +++ b/protocol/rtmp/cache/gop.go @@ -2,6 +2,7 @@ package cache import ( "errors" + "github.com/gwuhaolin/livego/av" ) diff --git a/protocol/rtmp/cache/special.go b/protocol/rtmp/cache/special.go index b8aefbc..89c9693 100755 --- a/protocol/rtmp/cache/special.go +++ b/protocol/rtmp/cache/special.go @@ -4,8 +4,8 @@ import ( "bytes" "log" - "github.com/gwuhaolin/livego/protocol/amf" "github.com/gwuhaolin/livego/av" + "github.com/gwuhaolin/livego/protocol/amf" ) const ( diff --git a/protocol/rtmp/core/chunk_stream.go b/protocol/rtmp/core/chunk_stream.go index fab2e6b..33970c4 100755 --- a/protocol/rtmp/core/chunk_stream.go +++ b/protocol/rtmp/core/chunk_stream.go @@ -73,7 +73,7 @@ func (chunkStream *ChunkStream) writeHeader(w *ReadWriter) error { } w.WriteUintLE(chunkStream.StreamID, 4) END: -//Extended Timestamp + //Extended Timestamp if ts >= 0xffffff { w.WriteUintBE(chunkStream.Timestamp, 4) } @@ -211,7 +211,7 @@ func (chunkStream *ChunkStream) readChunk(r *ReadWriter, chunkSize uint32, pool size = int(chunkSize) } - buf := chunkStream.Data[chunkStream.index: chunkStream.index+uint32(size)] + buf := chunkStream.Data[chunkStream.index : chunkStream.index+uint32(size)] if _, err := r.Read(buf); err != nil { return err } diff --git a/protocol/rtmp/core/chunk_stream_test.go b/protocol/rtmp/core/chunk_stream_test.go index d351dac..749c7ab 100755 --- a/protocol/rtmp/core/chunk_stream_test.go +++ b/protocol/rtmp/core/chunk_stream_test.go @@ -4,8 +4,8 @@ import ( "bytes" "testing" - "github.com/stretchr/testify/assert" "github.com/gwuhaolin/livego/utils/pool" + "github.com/stretchr/testify/assert" ) func TestChunkRead1(t *testing.T) { diff --git a/protocol/rtmp/core/conn.go b/protocol/rtmp/core/conn.go index 8d6d3cc..610a58c 100755 --- a/protocol/rtmp/core/conn.go +++ b/protocol/rtmp/core/conn.go @@ -4,12 +4,13 @@ import ( "encoding/binary" "net" "time" - "github.com/gwuhaolin/livego/utils/pool" + "github.com/gwuhaolin/livego/utils/pio" + "github.com/gwuhaolin/livego/utils/pool" ) const ( - _ = iota + _ = iota idSetChunkSize idAbortMessage idAck diff --git a/protocol/rtmp/core/conn_client.go b/protocol/rtmp/core/conn_client.go index 987a72f..566e67f 100755 --- a/protocol/rtmp/core/conn_client.go +++ b/protocol/rtmp/core/conn_client.go @@ -10,9 +10,10 @@ import ( neturl "net/url" "strings" - "github.com/gwuhaolin/livego/protocol/amf" - "github.com/gwuhaolin/livego/av" "log" + + "github.com/gwuhaolin/livego/av" + "github.com/gwuhaolin/livego/protocol/amf" ) var ( diff --git a/protocol/rtmp/core/conn_server.go b/protocol/rtmp/core/conn_server.go index e85b7d8..006b520 100755 --- a/protocol/rtmp/core/conn_server.go +++ b/protocol/rtmp/core/conn_server.go @@ -5,9 +5,10 @@ import ( "errors" "io" - "github.com/gwuhaolin/livego/protocol/amf" - "github.com/gwuhaolin/livego/av" "log" + + "github.com/gwuhaolin/livego/av" + "github.com/gwuhaolin/livego/protocol/amf" ) var ( diff --git a/protocol/rtmp/core/conn_test.go b/protocol/rtmp/core/conn_test.go index b3ff97b..170543d 100755 --- a/protocol/rtmp/core/conn_test.go +++ b/protocol/rtmp/core/conn_test.go @@ -4,8 +4,9 @@ import ( "bytes" "io" "testing" - "github.com/stretchr/testify/assert" + "github.com/gwuhaolin/livego/utils/pool" + "github.com/stretchr/testify/assert" ) func TestConnReadNormal(t *testing.T) { @@ -176,7 +177,7 @@ func TestSetChunksize(t *testing.T) { //设置chunksize chunkBuf := []byte{0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x96} + 0x00, 0x00, 0x00, 0x96} conn.rw = NewReadWriter(bytes.NewBuffer(chunkBuf), 1024) err = conn.Read(&c) at.Equal(err, nil) diff --git a/protocol/rtmp/core/handshake.go b/protocol/rtmp/core/handshake.go index 4e22ea7..e558376 100755 --- a/protocol/rtmp/core/handshake.go +++ b/protocol/rtmp/core/handshake.go @@ -124,7 +124,7 @@ func (conn *Conn) HandshakeClient() (err error) { return } - S1 := S0S1S2[1: 1536+1] + S1 := S0S1S2[1 : 1536+1] if ver := pio.U32BE(S1[4:8]); ver != 0 { C2 = S1 } else { @@ -145,13 +145,13 @@ func (conn *Conn) HandshakeServer() (err error) { C0C1C2 := random[:1536*2+1] C0 := C0C1C2[:1] - C1 := C0C1C2[1: 1536+1] + C1 := C0C1C2[1 : 1536+1] C0C1 := C0C1C2[:1536+1] C2 := C0C1C2[1536+1:] S0S1S2 := random[1536*2+1:] S0 := S0S1S2[:1] - S1 := S0S1S2[1: 1536+1] + S1 := S0S1S2[1 : 1536+1] S0S1 := S0S1S2[:1536+1] S2 := S0S1S2[1536+1:] diff --git a/protocol/rtmp/rtmp.go b/protocol/rtmp/rtmp.go index cc8e89c..b8b475a 100755 --- a/protocol/rtmp/rtmp.go +++ b/protocol/rtmp/rtmp.go @@ -4,17 +4,18 @@ import ( "errors" "flag" "fmt" - "github.com/gwuhaolin/livego/av" - "github.com/gwuhaolin/livego/configure" - "github.com/gwuhaolin/livego/container/flv" - "github.com/gwuhaolin/livego/protocol/rtmp/core" - "github.com/gwuhaolin/livego/utils/uid" "log" "net" "net/url" "reflect" "strings" "time" + + "github.com/gwuhaolin/livego/av" + "github.com/gwuhaolin/livego/configure" + "github.com/gwuhaolin/livego/container/flv" + "github.com/gwuhaolin/livego/protocol/rtmp/core" + "github.com/gwuhaolin/livego/utils/uid" ) const ( @@ -134,7 +135,7 @@ func (s *Server) handleConn(conn *core.Conn) error { writer := s.getter.GetWriter(reader.Info()) s.handler.HandleWriter(writer) } - flvWriter:=new(flv.FlvDvr) + flvWriter := new(flv.FlvDvr) s.handler.HandleWriter(flvWriter.GetWriter(reader.Info())) } else { writer := NewVirWriter(connServer) @@ -286,7 +287,7 @@ func (v *VirWriter) Write(p *av.Packet) (err error) { } func (v *VirWriter) SendPacket() error { - Flush := reflect.ValueOf(v.conn).MethodByName("Flush"); + Flush := reflect.ValueOf(v.conn).MethodByName("Flush") var cs core.ChunkStream for { p, ok := <-v.packetQueue @@ -315,7 +316,7 @@ func (v *VirWriter) SendPacket() error { v.closed = true return err } - Flush.Call(nil); + Flush.Call(nil) } else { return errors.New("closed") } diff --git a/protocol/rtmp/rtmprelay/rtmprelay.go b/protocol/rtmp/rtmprelay/rtmprelay.go index 1bcae28..1980b9b 100644 --- a/protocol/rtmp/rtmprelay/rtmprelay.go +++ b/protocol/rtmp/rtmprelay/rtmprelay.go @@ -4,10 +4,11 @@ import ( "bytes" "errors" "fmt" - "github.com/gwuhaolin/livego/protocol/amf" - "github.com/gwuhaolin/livego/protocol/rtmp/core" "io" "log" + + "github.com/gwuhaolin/livego/protocol/amf" + "github.com/gwuhaolin/livego/protocol/rtmp/core" ) var ( diff --git a/protocol/rtmp/rtmprelay/staticrelay.go b/protocol/rtmp/rtmprelay/staticrelay.go index ab90b43..6a376b8 100644 --- a/protocol/rtmp/rtmprelay/staticrelay.go +++ b/protocol/rtmp/rtmprelay/staticrelay.go @@ -3,11 +3,12 @@ package rtmprelay import ( "errors" "fmt" + "log" + "sync" + "github.com/gwuhaolin/livego/av" "github.com/gwuhaolin/livego/configure" "github.com/gwuhaolin/livego/protocol/rtmp/core" - "log" - "sync" ) type StaticPush struct { diff --git a/protocol/rtmp/stream.go b/protocol/rtmp/stream.go index 5780536..a5dbaed 100755 --- a/protocol/rtmp/stream.go +++ b/protocol/rtmp/stream.go @@ -2,13 +2,14 @@ package rtmp import ( "errors" + "log" + "strings" + "time" + "github.com/gwuhaolin/livego/av" "github.com/gwuhaolin/livego/protocol/rtmp/cache" "github.com/gwuhaolin/livego/protocol/rtmp/rtmprelay" "github.com/orcaman/concurrent-map" - "log" - "strings" - "time" ) var ( diff --git a/utils/pool/pool.go b/utils/pool/pool.go index 54cadef..b20be38 100755 --- a/utils/pool/pool.go +++ b/utils/pool/pool.go @@ -12,7 +12,7 @@ func (pool *Pool) Get(size int) []byte { pool.pos = 0 pool.buf = make([]byte, maxpoolsize) } - b := pool.buf[pool.pos: pool.pos+size] + b := pool.buf[pool.pos : pool.pos+size] pool.pos += size return b } diff --git a/utils/queue/queue.go b/utils/queue/queue.go index e601133..fc82ff9 100755 --- a/utils/queue/queue.go +++ b/utils/queue/queue.go @@ -2,6 +2,7 @@ package queue import ( "sync" + "github.com/gwuhaolin/livego/av" ) diff --git a/utils/uid/uuid.go b/utils/uid/uuid.go index 7593aba..e211ccb 100644 --- a/utils/uid/uuid.go +++ b/utils/uid/uuid.go @@ -2,11 +2,12 @@ package uid import ( "encoding/base64" + "github.com/satori/go.uuid" ) func NewId() string { - id, _ := uuid.NewV4() + id := uuid.NewV4() b64 := base64.URLEncoding.EncodeToString(id.Bytes()[:12]) return b64 }