mirror of
https://github.com/gwuhaolin/livego.git
synced 2021-06-01 09:10:22 +03:00
- 接入go mod
- 接入docker - 接入github action自动发布和测试
This commit is contained in:
27
.github/workflows/release.yml
vendored
Normal file
27
.github/workflows/release.yml
vendored
Normal file
@@ -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 }}
|
||||
22
.github/workflows/test.yml
vendored
Normal file
22
.github/workflows/test.yml
vendored
Normal file
@@ -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 ./...
|
||||
16
.goreleaser.yml
Normal file
16
.goreleaser.yml
Normal file
@@ -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
|
||||
9
.livego.json
Normal file
9
.livego.json
Normal file
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"server": [
|
||||
{
|
||||
"appname": "live",
|
||||
"liveon": "on",
|
||||
"hlson": "on"
|
||||
}
|
||||
]
|
||||
}
|
||||
19
Dockerfile
Normal file
19
Dockerfile
Normal file
@@ -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 <gwuhaolin@gmail.com>"
|
||||
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
|
||||
21
README.md
21
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`
|
||||
|
||||
6
av/av.go
6
av/av.go
@@ -1,7 +1,9 @@
|
||||
package av
|
||||
|
||||
import "io"
|
||||
import "fmt"
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
)
|
||||
|
||||
const (
|
||||
TAG_AUDIO = 8
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
package av
|
||||
|
||||
import "time"
|
||||
import "sync"
|
||||
import (
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
type RWBaser struct {
|
||||
lock sync.Mutex
|
||||
|
||||
@@ -2,6 +2,7 @@ package flv
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"github.com/gwuhaolin/livego/av"
|
||||
)
|
||||
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
package flv
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"strings"
|
||||
"time"
|
||||
"flag"
|
||||
"os"
|
||||
"log"
|
||||
"fmt"
|
||||
"github.com/gwuhaolin/livego/utils/uid"
|
||||
"github.com/gwuhaolin/livego/protocol/amf"
|
||||
|
||||
"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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package flv
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/gwuhaolin/livego/av"
|
||||
)
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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})
|
||||
}
|
||||
|
||||
11
go.mod
Normal file
11
go.mod
Normal file
@@ -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
|
||||
)
|
||||
@@ -1,11 +0,0 @@
|
||||
build:
|
||||
binary: livego
|
||||
goos:
|
||||
- windows
|
||||
- darwin
|
||||
- linux
|
||||
- freebsd
|
||||
goarch:
|
||||
- amd64
|
||||
- 386
|
||||
- arm
|
||||
10
livego.cfg
10
livego.cfg
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"server": [
|
||||
{
|
||||
"appname":"live",
|
||||
"liveon":"on",
|
||||
"hlson":"on"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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() {
|
||||
@@ -3,6 +3,7 @@ package aac
|
||||
import (
|
||||
"errors"
|
||||
"io"
|
||||
|
||||
"github.com/gwuhaolin/livego/av"
|
||||
)
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"}
|
||||
|
||||
@@ -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"
|
||||
)
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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 {
|
||||
|
||||
1
protocol/rtmp/cache/cache.go
vendored
1
protocol/rtmp/cache/cache.go
vendored
@@ -2,6 +2,7 @@ package cache
|
||||
|
||||
import (
|
||||
"flag"
|
||||
|
||||
"github.com/gwuhaolin/livego/av"
|
||||
)
|
||||
|
||||
|
||||
1
protocol/rtmp/cache/gop.go
vendored
1
protocol/rtmp/cache/gop.go
vendored
@@ -2,6 +2,7 @@ package cache
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
||||
"github.com/gwuhaolin/livego/av"
|
||||
)
|
||||
|
||||
|
||||
2
protocol/rtmp/cache/special.go
vendored
2
protocol/rtmp/cache/special.go
vendored
@@ -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 (
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:]
|
||||
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 (
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package queue
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"github.com/gwuhaolin/livego/av"
|
||||
)
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user