Browse Source

support runOnConnect and runOnDemand with RTMP clients

pull/235/head v0.14.0
aler9 6 years ago
parent
commit
59e754feb1
  1. 3
      internal/clientman/clientman.go
  2. 36
      internal/clientrtmp/client.go

3
internal/clientman/clientman.go

@ -160,7 +160,10 @@ outer: @@ -160,7 +160,10 @@ outer:
case conn := <-rtmpAccept:
c := clientrtmp.New(
cm.rtspPort,
cm.readTimeout,
cm.runOnConnect,
cm.runOnConnectRestart,
&cm.wg,
cm.stats,
conn,

36
internal/clientrtmp/client.go

@ -5,6 +5,7 @@ import ( @@ -5,6 +5,7 @@ import (
"io"
"net"
"net/url"
"strconv"
"strings"
"sync"
"sync/atomic"
@ -19,6 +20,7 @@ import ( @@ -19,6 +20,7 @@ import (
"github.com/notedit/rtmp/codec/h264"
"github.com/aler9/rtsp-simple-server/internal/client"
"github.com/aler9/rtsp-simple-server/internal/externalcmd"
"github.com/aler9/rtsp-simple-server/internal/logger"
"github.com/aler9/rtsp-simple-server/internal/rtmputils"
"github.com/aler9/rtsp-simple-server/internal/stats"
@ -54,7 +56,10 @@ type Parent interface { @@ -54,7 +56,10 @@ type Parent interface {
// Client is a RTMP client.
type Client struct {
rtspPort int
readTimeout time.Duration
runOnConnect string
runOnConnectRestart bool
stats *stats.Stats
wg *sync.WaitGroup
conn rtmputils.ConnPair
@ -68,14 +73,20 @@ type Client struct { @@ -68,14 +73,20 @@ type Client struct {
// New allocates a Client.
func New(
rtspPort int,
readTimeout time.Duration,
runOnConnect string,
runOnConnectRestart bool,
wg *sync.WaitGroup,
stats *stats.Stats,
conn rtmputils.ConnPair,
parent Parent) *Client {
c := &Client{
rtspPort: rtspPort,
readTimeout: readTimeout,
runOnConnect: runOnConnect,
runOnConnectRestart: runOnConnectRestart,
wg: wg,
stats: stats,
conn: conn,
@ -116,6 +127,14 @@ func (c *Client) run() { @@ -116,6 +127,14 @@ func (c *Client) run() {
defer c.wg.Done()
defer c.log(logger.Info, "disconnected")
if c.runOnConnect != "" {
onConnectCmd := externalcmd.New(c.runOnConnect, c.runOnConnectRestart, externalcmd.Environment{
Path: "",
Port: strconv.FormatInt(int64(c.rtspPort), 10),
})
defer onConnectCmd.Close()
}
if !c.conn.RConn.Publishing {
c.conn.NConn.Close()
c.log(logger.Info, "ERR: client is not publishing")
@ -220,7 +239,6 @@ func (c *Client) run() { @@ -220,7 +239,6 @@ func (c *Client) run() {
return
}
func() {
resc := make(chan struct{})
c.path.OnClientRecord(client.RecordReq{c, resc}) //nolint:govet
<-resc
@ -234,7 +252,21 @@ func (c *Client) run() { @@ -234,7 +252,21 @@ func (c *Client) run() {
}
return "tracks"
}())
}()
var onPublishCmd *externalcmd.Cmd
if c.path.Conf().RunOnPublish != "" {
onPublishCmd = externalcmd.New(c.path.Conf().RunOnPublish,
c.path.Conf().RunOnPublishRestart, externalcmd.Environment{
Path: c.path.Name(),
Port: strconv.FormatInt(int64(c.rtspPort), 10),
})
}
defer func(path client.Path) {
if path.Conf().RunOnPublish != "" {
onPublishCmd.Close()
}
}(c.path)
readerDone := make(chan error)
go func() {

Loading…
Cancel
Save