mirror of
https://github.com/hsnks100/liveflow.git
synced 2025-09-26 20:21:12 +08:00
Reduce memory usage
This commit is contained in:
@@ -1,9 +1,12 @@
|
||||
[monitor]
|
||||
port = 6060
|
||||
[whep]
|
||||
port = 5555
|
||||
[rtmp]
|
||||
port = 1930
|
||||
[hls]
|
||||
port = 8044
|
||||
llhls = true
|
||||
llhls = false
|
||||
disk_ram = true
|
||||
[docker]
|
||||
mode = false
|
@@ -2,10 +2,15 @@ package config
|
||||
|
||||
// Struct to hold the configuration
|
||||
type Config struct {
|
||||
Whep Whep `mapstructure:"whep"`
|
||||
RTMP RTMP `mapstructure:"rtmp"`
|
||||
HLS HLS `mapstructure:"hls"`
|
||||
Docker DockerConfig `mapstructure:"docker"`
|
||||
Monitor Monitor `mapstructure:"monitor"`
|
||||
Whep Whep `mapstructure:"whep"`
|
||||
RTMP RTMP `mapstructure:"rtmp"`
|
||||
HLS HLS `mapstructure:"hls"`
|
||||
Docker DockerConfig `mapstructure:"docker"`
|
||||
}
|
||||
|
||||
type Monitor struct {
|
||||
Port int `mapstructure:"port"`
|
||||
}
|
||||
|
||||
type RTMP struct {
|
||||
@@ -17,8 +22,9 @@ type Whep struct {
|
||||
}
|
||||
|
||||
type HLS struct {
|
||||
Port int `mapstructure:"port"`
|
||||
LLHLS bool `mapstructure:"llhls"`
|
||||
Port int `mapstructure:"port"`
|
||||
LLHLS bool `mapstructure:"llhls"`
|
||||
DiskRam bool `mapstructure:"disk_ram"`
|
||||
}
|
||||
|
||||
type DockerConfig struct {
|
||||
|
17
go.mod
17
go.mod
@@ -13,6 +13,7 @@ require (
|
||||
github.com/pion/sdp/v3 v3.0.9
|
||||
github.com/pion/webrtc/v3 v3.3.0
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/prometheus/client_golang v1.20.3
|
||||
github.com/sirupsen/logrus v1.9.3
|
||||
github.com/spf13/viper v1.19.0
|
||||
github.com/yapingcat/gomedia v0.0.0-20231026175559-9269ffbdaadd
|
||||
@@ -25,18 +26,22 @@ require (
|
||||
github.com/abema/go-mp4 v1.2.0 // indirect
|
||||
github.com/asticode/go-astikit v0.43.0 // indirect
|
||||
github.com/asticode/go-astits v1.13.0 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/bluenviron/mediacommon v1.11.1-0.20240525122142-20163863aa75 // indirect
|
||||
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
||||
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
||||
github.com/fsnotify/fsnotify v1.7.0 // indirect
|
||||
github.com/google/uuid v1.4.0 // indirect
|
||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||
github.com/hashicorp/hcl v1.0.0 // indirect
|
||||
github.com/klauspost/compress v1.17.9 // indirect
|
||||
github.com/labstack/gommon v0.4.2 // indirect
|
||||
github.com/magiconair/properties v1.8.7 // indirect
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
||||
github.com/pelletier/go-toml/v2 v2.2.2 // indirect
|
||||
github.com/pion/datachannel v1.5.8 // indirect
|
||||
github.com/pion/dtls/v2 v2.2.12 // indirect
|
||||
@@ -51,6 +56,9 @@ require (
|
||||
github.com/pion/transport/v2 v2.2.10 // indirect
|
||||
github.com/pion/turn/v2 v2.1.6 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||
github.com/prometheus/client_model v0.6.1 // indirect
|
||||
github.com/prometheus/common v0.55.0 // indirect
|
||||
github.com/prometheus/procfs v0.15.1 // indirect
|
||||
github.com/sagikazarmark/locafero v0.4.0 // indirect
|
||||
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
||||
github.com/sourcegraph/conc v0.3.0 // indirect
|
||||
@@ -65,10 +73,11 @@ require (
|
||||
github.com/yutopp/go-amf0 v0.1.0 // indirect
|
||||
go.uber.org/atomic v1.9.0 // indirect
|
||||
go.uber.org/multierr v1.9.0 // indirect
|
||||
golang.org/x/crypto v0.22.0 // indirect
|
||||
golang.org/x/net v0.24.0 // indirect
|
||||
golang.org/x/sys v0.19.0 // indirect
|
||||
golang.org/x/text v0.14.0 // indirect
|
||||
golang.org/x/crypto v0.24.0 // indirect
|
||||
golang.org/x/net v0.26.0 // indirect
|
||||
golang.org/x/sys v0.22.0 // indirect
|
||||
golang.org/x/text v0.16.0 // indirect
|
||||
google.golang.org/protobuf v1.34.2 // indirect
|
||||
gopkg.in/ini.v1 v1.67.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
46
go.sum
46
go.sum
@@ -9,10 +9,14 @@ github.com/asticode/go-astits v1.13.0 h1:XOgkaadfZODnyZRR5Y0/DWkA9vrkLLPLeeOvDwf
|
||||
github.com/asticode/go-astits v1.13.0/go.mod h1:QSHmknZ51pf6KJdHKZHJTLlMegIrhega3LPWz3ND/iI=
|
||||
github.com/at-wat/ebml-go v0.17.1 h1:pWG1NOATCFu1hnlowCzrA1VR/3s8tPY6qpU+2FwW7X4=
|
||||
github.com/at-wat/ebml-go v0.17.1/go.mod h1:w1cJs7zmGsb5nnSvhWGKLCxvfu4FVx5ERvYDIalj1ww=
|
||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||
github.com/bluenviron/gohlslib v1.4.0 h1:3a9W1x8eqlxJUKt1sJCunPGtti5ALIY2ik4GU0RVe7E=
|
||||
github.com/bluenviron/gohlslib v1.4.0/go.mod h1:q5ZElzNw5GRbV1VEI45qkcPbKBco6BP58QEY5HyFsmo=
|
||||
github.com/bluenviron/mediacommon v1.11.1-0.20240525122142-20163863aa75 h1:5P8Um+ySuwZApuVS9gI6U0MnrIFybTfLrZSqV2ie5lA=
|
||||
github.com/bluenviron/mediacommon v1.11.1-0.20240525122142-20163863aa75/go.mod h1:HDyW2CzjvhYJXtdxstdFPio3G0qSocPhqkhUt/qffec=
|
||||
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
@@ -26,8 +30,8 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk
|
||||
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
||||
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
|
||||
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
|
||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
|
||||
@@ -40,6 +44,8 @@ github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+l
|
||||
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
|
||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
|
||||
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
||||
@@ -48,6 +54,8 @@ github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
|
||||
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
|
||||
github.com/labstack/echo/v4 v4.12.0 h1:IKpw49IMryVB2p1a4dzwlhP1O2Tf2E0Ir/450lH+kI0=
|
||||
github.com/labstack/echo/v4 v4.12.0/go.mod h1:UP9Cr2DJXbOK3Kr9ONYzNowSh7HP0aG0ShAyycHSJvM=
|
||||
github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0=
|
||||
@@ -62,6 +70,8 @@ github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D
|
||||
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
|
||||
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
|
||||
github.com/orcaman/writerseeker v0.0.0-20200621085525-1d3f536ff85e h1:s2RNOM/IGdY0Y6qfTeUKhDawdHDpK9RGBdx80qN4Ttw=
|
||||
github.com/orcaman/writerseeker v0.0.0-20200621085525-1d3f536ff85e/go.mod h1:nBdnFKj15wFbf94Rwfq4m30eAcyY9V/IyKAGQFtqkW0=
|
||||
github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
|
||||
@@ -115,8 +125,16 @@ github.com/pkg/profile v1.4.0/go.mod h1:NWz/XGvpEW1FyYQ7fCx4dqYBLlfTcE+A9FLAkNKq
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
|
||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
|
||||
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
|
||||
github.com/prometheus/client_golang v1.20.3 h1:oPksm4K8B+Vt35tUhw6GbSNSgVlVSBH0qELP/7u83l4=
|
||||
github.com/prometheus/client_golang v1.20.3/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
|
||||
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
|
||||
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
|
||||
github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc=
|
||||
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
|
||||
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
|
||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
|
||||
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
||||
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
|
||||
github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
|
||||
github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
|
||||
github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
|
||||
@@ -176,8 +194,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
|
||||
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
||||
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
||||
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
|
||||
golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
|
||||
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
|
||||
golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI=
|
||||
golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM=
|
||||
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
|
||||
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
@@ -190,8 +208,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
|
||||
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
|
||||
golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=
|
||||
golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8=
|
||||
golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ=
|
||||
golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
@@ -212,8 +230,8 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
|
||||
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
|
||||
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||
@@ -227,17 +245,21 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||
golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4=
|
||||
golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
|
||||
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
|
||||
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||
gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
|
||||
gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
|
||||
gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg=
|
||||
|
49
main.go
49
main.go
@@ -4,12 +4,18 @@ import (
|
||||
"context"
|
||||
"fmt"
|
||||
"liveflow/config"
|
||||
"liveflow/media/streamer/egress/hls"
|
||||
"liveflow/media/streamer/egress/record/mp4"
|
||||
"liveflow/media/streamer/egress/record/webm"
|
||||
"liveflow/media/streamer/egress/whep"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
_ "net/http/pprof" // pprof을 사용하기 위한 패키지
|
||||
|
||||
"github.com/labstack/echo/v4"
|
||||
"github.com/pion/webrtc/v3"
|
||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||
"github.com/sirupsen/logrus"
|
||||
"github.com/spf13/viper"
|
||||
|
||||
@@ -17,8 +23,6 @@ import (
|
||||
"liveflow/log"
|
||||
"liveflow/media/hlshub"
|
||||
"liveflow/media/hub"
|
||||
"liveflow/media/streamer/egress/hls"
|
||||
"liveflow/media/streamer/egress/whep"
|
||||
"liveflow/media/streamer/ingress/rtmp"
|
||||
"liveflow/media/streamer/ingress/whip"
|
||||
)
|
||||
@@ -41,6 +45,12 @@ func main() {
|
||||
}
|
||||
fmt.Printf("Config: %+v\n", conf)
|
||||
|
||||
go func() {
|
||||
statsEcho := echo.New()
|
||||
statsEcho.GET("/prometheus", echo.WrapHandler(promhttp.Handler()))
|
||||
statsEcho.GET("/debug/pprof/*", echo.WrapHandler(http.DefaultServeMux))
|
||||
statsEcho.Start(":" + strconv.Itoa(conf.Monitor.Port))
|
||||
}()
|
||||
log.Init()
|
||||
//log.SetCaller(ctx, true)
|
||||
//log.SetFormatter(ctx, &logrus.JSONFormatter{
|
||||
@@ -69,16 +79,6 @@ func main() {
|
||||
// ingress 의 rtmp, whip 서비스로부터 streamID를 받아 HLS, ContainerMP4, WHEP 서비스 시작
|
||||
for source := range hub.SubscribeToStreamID() {
|
||||
log.Infof(ctx, "New streamID received: %s", source.StreamID())
|
||||
hls := hls.NewHLS(hls.HLSArgs{
|
||||
Hub: hub,
|
||||
HLSHub: hlsHub,
|
||||
Port: conf.HLS.Port,
|
||||
LLHLS: conf.HLS.LLHLS,
|
||||
})
|
||||
err := hls.Start(ctx, source)
|
||||
if err != nil {
|
||||
log.Errorf(ctx, "failed to start hls: %v", err)
|
||||
}
|
||||
mp4 := mp4.NewMP4(mp4.MP4Args{
|
||||
Hub: hub,
|
||||
})
|
||||
@@ -86,6 +86,24 @@ func main() {
|
||||
if err != nil {
|
||||
log.Errorf(ctx, "failed to start mp4: %v", err)
|
||||
}
|
||||
webmStarter := webm.NewWEBM(webm.WebMArgs{
|
||||
Hub: hub,
|
||||
})
|
||||
err = webmStarter.Start(ctx, source)
|
||||
if err != nil {
|
||||
log.Errorf(ctx, "failed to start webm: %v", err)
|
||||
}
|
||||
hls := hls.NewHLS(hls.HLSArgs{
|
||||
Hub: hub,
|
||||
HLSHub: hlsHub,
|
||||
Port: conf.HLS.Port,
|
||||
LLHLS: conf.HLS.LLHLS,
|
||||
DiskRam: conf.HLS.DiskRam,
|
||||
})
|
||||
err := hls.Start(ctx, source)
|
||||
if err != nil {
|
||||
log.Errorf(ctx, "failed to start hls: %v", err)
|
||||
}
|
||||
whep := whep.NewWHEP(whep.WHEPArgs{
|
||||
Tracks: tracks,
|
||||
Hub: hub,
|
||||
@@ -94,13 +112,6 @@ func main() {
|
||||
if err != nil {
|
||||
log.Errorf(ctx, "failed to start whep: %v", err)
|
||||
}
|
||||
webmStarter := webm.NewWEBM(webm.WebMArgs{
|
||||
Hub: hub,
|
||||
})
|
||||
err = webmStarter.Start(ctx, source)
|
||||
if err != nil {
|
||||
log.Errorf(ctx, "failed to start webm: %v", err)
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
|
@@ -37,21 +37,24 @@ type HLS struct {
|
||||
mpeg4AudioConfigBytes []byte
|
||||
mpeg4AudioConfig *aacparser.MPEG4AudioConfig
|
||||
llHLS bool
|
||||
diskRam bool
|
||||
}
|
||||
|
||||
type HLSArgs struct {
|
||||
Hub *hub.Hub
|
||||
HLSHub *hlshub.HLSHub
|
||||
Port int
|
||||
LLHLS bool
|
||||
Hub *hub.Hub
|
||||
HLSHub *hlshub.HLSHub
|
||||
Port int
|
||||
LLHLS bool
|
||||
DiskRam bool
|
||||
}
|
||||
|
||||
func NewHLS(args HLSArgs) *HLS {
|
||||
return &HLS{
|
||||
hub: args.Hub,
|
||||
hlsHub: args.HLSHub,
|
||||
port: args.Port,
|
||||
llHLS: args.LLHLS,
|
||||
hub: args.Hub,
|
||||
hlsHub: args.HLSHub,
|
||||
port: args.Port,
|
||||
llHLS: args.LLHLS,
|
||||
diskRam: args.DiskRam,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,24 +69,25 @@ func (h *HLS) Start(ctx context.Context, source hub.Source) error {
|
||||
fields.StreamID: source.StreamID(),
|
||||
fields.SourceName: source.Name(),
|
||||
})
|
||||
audioTranscodingProcess := processes.NewTranscodingProcess(astiav.CodecIDOpus, astiav.CodecIDAac, audioSampleRate)
|
||||
if hub.HasCodecType(source.MediaSpecs(), hub.CodecTypeOpus) {
|
||||
audioTranscodingProcess = processes.NewTranscodingProcess(astiav.CodecIDOpus, astiav.CodecIDAac, audioSampleRate)
|
||||
audioTranscodingProcess.Init()
|
||||
h.mpeg4AudioConfigBytes = audioTranscodingProcess.ExtraData()
|
||||
tmpAudioCodec, err := aacparser.NewCodecDataFromMPEG4AudioConfigBytes(h.mpeg4AudioConfigBytes)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
h.mpeg4AudioConfig = &tmpAudioCodec.Config
|
||||
}
|
||||
log.Info(ctx, "start hls")
|
||||
log.Info(ctx, "view url: ", fmt.Sprintf("http://127.0.0.1:%d/hls/%s/master.m3u8", h.port, source.StreamID()))
|
||||
|
||||
sub := h.hub.Subscribe(source.StreamID())
|
||||
go func() {
|
||||
var audioTranscodingProcess *processes.AudioTranscodingProcess
|
||||
for data := range sub {
|
||||
if data.OPUSAudio != nil {
|
||||
if audioTranscodingProcess == nil {
|
||||
audioTranscodingProcess = processes.NewTranscodingProcess(astiav.CodecIDOpus, astiav.CodecIDAac, audioSampleRate)
|
||||
audioTranscodingProcess.Init()
|
||||
defer audioTranscodingProcess.Close()
|
||||
h.mpeg4AudioConfigBytes = audioTranscodingProcess.ExtraData()
|
||||
tmpAudioCodec, err := aacparser.NewCodecDataFromMPEG4AudioConfigBytes(h.mpeg4AudioConfigBytes)
|
||||
if err != nil {
|
||||
log.Error(ctx, err)
|
||||
}
|
||||
h.mpeg4AudioConfig = &tmpAudioCodec.Config
|
||||
}
|
||||
h.onOPUSAudio(ctx, source, audioTranscodingProcess, data.OPUSAudio)
|
||||
} else {
|
||||
if data.AACAudio != nil {
|
||||
@@ -164,12 +168,18 @@ func (h *HLS) makeMuxer(extraData []byte) (*gohlslib.Muxer, error) {
|
||||
Codec: mpeg4Audio,
|
||||
}
|
||||
}
|
||||
var directory string
|
||||
if h.diskRam {
|
||||
directory = "/tmp"
|
||||
}
|
||||
muxer := &gohlslib.Muxer{
|
||||
VideoTrack: &gohlslib.Track{
|
||||
Codec: &codecs.H264{},
|
||||
},
|
||||
AudioTrack: audioTrack,
|
||||
Directory: directory,
|
||||
}
|
||||
|
||||
if h.llHLS {
|
||||
muxer.Variant = gohlslib.MuxerVariantLowLatency
|
||||
muxer.PartDuration = 500 * time.Millisecond
|
||||
|
@@ -114,17 +114,6 @@ func (m *MP4) Start(ctx context.Context, source hub.Source) error {
|
||||
fields.StreamID: source.StreamID(),
|
||||
fields.SourceName: source.Name(),
|
||||
})
|
||||
var audioTranscodingProcess *processes.AudioTranscodingProcess
|
||||
if hub.HasCodecType(source.MediaSpecs(), hub.CodecTypeOpus) {
|
||||
audioTranscodingProcess = processes.NewTranscodingProcess(astiav.CodecIDOpus, astiav.CodecIDAac, audioSampleRate)
|
||||
audioTranscodingProcess.Init()
|
||||
m.mpeg4AudioConfigBytes = audioTranscodingProcess.ExtraData()
|
||||
tmpAudioCodec, err := aacparser.NewCodecDataFromMPEG4AudioConfigBytes(m.mpeg4AudioConfigBytes)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
m.mpeg4AudioConfig = &tmpAudioCodec.Config
|
||||
}
|
||||
log.Info(ctx, "start mp4")
|
||||
sub := m.hub.Subscribe(source.StreamID())
|
||||
go func() {
|
||||
@@ -147,11 +136,23 @@ func (m *MP4) Start(ctx context.Context, source hub.Source) error {
|
||||
}
|
||||
m.muxer = muxer
|
||||
|
||||
var audioTranscodingProcess *processes.AudioTranscodingProcess
|
||||
for data := range sub {
|
||||
if data.H264Video != nil {
|
||||
m.onVideo(ctx, data.H264Video)
|
||||
}
|
||||
if data.OPUSAudio != nil {
|
||||
if audioTranscodingProcess == nil {
|
||||
audioTranscodingProcess = processes.NewTranscodingProcess(astiav.CodecIDOpus, astiav.CodecIDAac, audioSampleRate)
|
||||
audioTranscodingProcess.Init()
|
||||
defer audioTranscodingProcess.Close()
|
||||
m.mpeg4AudioConfigBytes = audioTranscodingProcess.ExtraData()
|
||||
tmpAudioCodec, err := aacparser.NewCodecDataFromMPEG4AudioConfigBytes(m.mpeg4AudioConfigBytes)
|
||||
if err != nil {
|
||||
log.Error(ctx, err)
|
||||
}
|
||||
m.mpeg4AudioConfig = &tmpAudioCodec.Config
|
||||
}
|
||||
m.onOPUSAudio(ctx, audioTranscodingProcess, data.OPUSAudio)
|
||||
} else {
|
||||
if data.AACAudio != nil {
|
||||
|
@@ -9,8 +9,7 @@ import (
|
||||
"liveflow/media/streamer/fields"
|
||||
"liveflow/media/streamer/processes"
|
||||
|
||||
astiav "github.com/asticode/go-astiav"
|
||||
|
||||
"github.com/asticode/go-astiav"
|
||||
"github.com/deepch/vdk/codec/aacparser"
|
||||
"github.com/pion/webrtc/v3"
|
||||
"github.com/sirupsen/logrus"
|
||||
@@ -64,14 +63,18 @@ func (w *WebM) Start(ctx context.Context, source hub.Source) error {
|
||||
}
|
||||
log.Info(ctx, "start webm")
|
||||
sub := w.hub.Subscribe(source.StreamID())
|
||||
audioTranscodingProcess := processes.NewTranscodingProcess(astiav.CodecIDAac, astiav.CodecIDOpus, audioSampleRate)
|
||||
audioTranscodingProcess.Init()
|
||||
go func() {
|
||||
var audioTranscodingProcess *processes.AudioTranscodingProcess
|
||||
for data := range sub {
|
||||
if data.H264Video != nil {
|
||||
w.onVideo(ctx, muxer, data.H264Video)
|
||||
}
|
||||
if data.AACAudio != nil {
|
||||
if audioTranscodingProcess == nil {
|
||||
audioTranscodingProcess = processes.NewTranscodingProcess(astiav.CodecIDAac, astiav.CodecIDOpus, audioSampleRate)
|
||||
audioTranscodingProcess.Init()
|
||||
defer audioTranscodingProcess.Close()
|
||||
}
|
||||
w.onAACAudio(ctx, muxer, data.AACAudio, audioTranscodingProcess)
|
||||
} else if data.OPUSAudio != nil {
|
||||
w.onAudio(ctx, muxer, data.OPUSAudio)
|
||||
|
@@ -70,9 +70,8 @@ func (w *WHEP) Start(ctx context.Context, source hub.Source) error {
|
||||
})
|
||||
log.Info(ctx, "start whep")
|
||||
sub := w.hub.Subscribe(source.StreamID())
|
||||
aProcess := processes.NewTranscodingProcess(astiav.CodecIDAac, astiav.CodecIDOpus, audioSampleRate)
|
||||
aProcess.Init()
|
||||
go func() {
|
||||
var audioTranscodingProcess *processes.AudioTranscodingProcess
|
||||
for data := range sub {
|
||||
if data.H264Video != nil {
|
||||
err := w.onVideo(source, data.H264Video)
|
||||
@@ -81,7 +80,12 @@ func (w *WHEP) Start(ctx context.Context, source hub.Source) error {
|
||||
}
|
||||
}
|
||||
if data.AACAudio != nil {
|
||||
err := w.onAACAudio(ctx, source, data.AACAudio, aProcess)
|
||||
if audioTranscodingProcess == nil {
|
||||
audioTranscodingProcess = processes.NewTranscodingProcess(astiav.CodecIDAac, astiav.CodecIDOpus, audioSampleRate)
|
||||
audioTranscodingProcess.Init()
|
||||
defer audioTranscodingProcess.Close()
|
||||
}
|
||||
err := w.onAACAudio(ctx, source, data.AACAudio, audioTranscodingProcess)
|
||||
if err != nil {
|
||||
log.Error(ctx, err, "failed to process AAC audio")
|
||||
}
|
||||
|
@@ -94,10 +94,22 @@ func (t *AudioTranscodingProcess) Init() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *AudioTranscodingProcess) Close() {
|
||||
if t.decCodecContext != nil {
|
||||
t.decCodecContext.Free()
|
||||
}
|
||||
if t.encCodecContext != nil {
|
||||
t.encCodecContext.Free()
|
||||
}
|
||||
if t.audioFifo != nil {
|
||||
t.audioFifo.Free()
|
||||
}
|
||||
}
|
||||
|
||||
func (t *AudioTranscodingProcess) Process(data *MediaPacket) ([]*MediaPacket, error) {
|
||||
ctx := context.Background()
|
||||
packet := astiav.AllocPacket()
|
||||
//defer packet.Free()
|
||||
defer packet.Free()
|
||||
err := packet.FromData(data.Data)
|
||||
if err != nil {
|
||||
log.Error(ctx, err, "failed to create packet")
|
||||
@@ -129,6 +141,7 @@ func (t *AudioTranscodingProcess) Process(data *MediaPacket) ([]*MediaPacket, er
|
||||
nbSamples := 0
|
||||
for t.audioFifo.Size() >= t.encCodecContext.FrameSize() {
|
||||
frameToSend := astiav.AllocFrame()
|
||||
defer frameToSend.Free()
|
||||
frameToSend.SetNbSamples(t.encCodecContext.FrameSize())
|
||||
frameToSend.SetChannelLayout(t.encCodecContext.ChannelLayout()) // t.encCodecContext.ChannelLayout())
|
||||
frameToSend.SetSampleFormat(t.encCodecContext.SampleFormat())
|
||||
|
Reference in New Issue
Block a user