mirror of
https://github.com/hkmadao/rtsp2rtmp.git
synced 2025-09-26 19:31:19 +08:00
lazy push rtmp
This commit is contained in:
2
main.go
2
main.go
@@ -28,8 +28,8 @@ func main() {
|
|||||||
logs.Error("get use-ffmpeg fail : %v", err)
|
logs.Error("get use-ffmpeg fail : %v", err)
|
||||||
fgUseFfmpeg = false
|
fgUseFfmpeg = false
|
||||||
}
|
}
|
||||||
|
rtmpserver.GetSingleRtmpServer().StartRtmpServer()
|
||||||
if fgUseFfmpeg {
|
if fgUseFfmpeg {
|
||||||
rtmpserver.GetSingleRtmpServer().StartRtmpServer()
|
|
||||||
ffmpegmanager.GetSingleFFmpegManager().StartClient()
|
ffmpegmanager.GetSingleFFmpegManager().StartClient()
|
||||||
} else {
|
} else {
|
||||||
rtspclientmanager.GetSingleRtspClientManager().StartClient()
|
rtspclientmanager.GetSingleRtspClientManager().StartClient()
|
||||||
|
@@ -2,7 +2,7 @@ server:
|
|||||||
use-ffmpeg: false
|
use-ffmpeg: false
|
||||||
security: true
|
security: true
|
||||||
rtmp:
|
rtmp:
|
||||||
port: 1936
|
port: 1934
|
||||||
http:
|
http:
|
||||||
port: 8080
|
port: 8080
|
||||||
static:
|
static:
|
||||||
|
@@ -4,6 +4,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/beego/beego/v2/core/config"
|
"github.com/beego/beego/v2/core/config"
|
||||||
@@ -28,27 +29,28 @@ type FileFlvReader struct {
|
|||||||
fgStart bool
|
fgStart bool
|
||||||
fgOffSetTime bool
|
fgOffSetTime bool
|
||||||
offSetTime time.Duration // realTime = pkt.Time - offSetTime, offsetTime from is first pkt.Time
|
offSetTime time.Duration // realTime = pkt.Time - offSetTime, offsetTime from is first pkt.Time
|
||||||
|
mutex sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ffw *FileFlvReader) GetDone() <-chan int {
|
func (ffr *FileFlvReader) GetDone() <-chan int {
|
||||||
return ffw.done
|
return ffr.done
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ffw *FileFlvReader) GetCode() string {
|
func (ffr *FileFlvReader) GetCode() string {
|
||||||
return ffw.code
|
return ffr.code
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ffw *FileFlvReader) SetCodecs(codecs []av.CodecData) {
|
func (ffr *FileFlvReader) SetCodecs(codecs []av.CodecData) {
|
||||||
ffw.codecs = codecs
|
ffr.codecs = codecs
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ffw *FileFlvReader) GetCodecs() []av.CodecData {
|
func (ffr *FileFlvReader) GetCodecs() []av.CodecData {
|
||||||
return ffw.codecs
|
return ffr.codecs
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ffw *FileFlvReader) SetSeekSecond(seekSecond uint64) {
|
func (ffr *FileFlvReader) SetSeekSecond(seekSecond uint64) {
|
||||||
if seekSecond > ffw.seekSecond {
|
if seekSecond > ffr.seekSecond {
|
||||||
ffw.seekSecond = seekSecond
|
ffr.seekSecond = seekSecond
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,7 +60,7 @@ func NewFileFlvReader(
|
|||||||
fileName string,
|
fileName string,
|
||||||
) *FileFlvReader {
|
) *FileFlvReader {
|
||||||
myHttpWriter := newMyHttpWriter(writer)
|
myHttpWriter := newMyHttpWriter(writer)
|
||||||
ffw := &FileFlvReader{
|
ffr := &FileFlvReader{
|
||||||
fgDoneClose: false,
|
fgDoneClose: false,
|
||||||
done: make(chan int),
|
done: make(chan int),
|
||||||
httpWrite: myHttpWriter,
|
httpWrite: myHttpWriter,
|
||||||
@@ -69,46 +71,38 @@ func NewFileFlvReader(
|
|||||||
fgOffSetTime: false,
|
fgOffSetTime: false,
|
||||||
offSetTime: 0,
|
offSetTime: 0,
|
||||||
}
|
}
|
||||||
go ffw.flvRead()
|
go ffr.flvRead()
|
||||||
return ffw
|
return ffr
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ffw *FileFlvReader) StopRead() {
|
func (ffr *FileFlvReader) StopRead() {
|
||||||
go func() {
|
go func() {
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
logs.Error("system painc : %v \nstack : %v", r, string(debug.Stack()))
|
logs.Error("system painc : %v \nstack : %v", r, string(debug.Stack()))
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
ffw.fgDoneClose = true
|
ffr.CloseDone()
|
||||||
close(ffw.done)
|
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ffw *FileFlvReader) TickerStopRead() {
|
func (ffr *FileFlvReader) CloseDone() {
|
||||||
go func() {
|
ffr.mutex.Lock()
|
||||||
defer func() {
|
if !ffr.fgDoneClose {
|
||||||
if r := recover(); r != nil {
|
ffr.fgDoneClose = true
|
||||||
logs.Error("system painc : %v \nstack : %v", r, string(debug.Stack()))
|
close(ffr.done)
|
||||||
}
|
}
|
||||||
}()
|
ffr.mutex.Unlock()
|
||||||
select {
|
|
||||||
case <-time.NewTicker(30 * time.Second).C: //等待30秒再关闭
|
|
||||||
ffw.fgDoneClose = true
|
|
||||||
close(ffw.done)
|
|
||||||
case <-ffw.GetDone():
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ffw *FileFlvReader) Read(p []byte) (n int, err error) {
|
func (ffr *FileFlvReader) Read(p []byte) (n int, err error) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
logs.Error("system painc : %v \nstack : %v", r, string(debug.Stack()))
|
logs.Error("system painc : %v \nstack : %v", r, string(debug.Stack()))
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
n, err = ffw.fd.Read(p)
|
n, err = ffr.fd.Read(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("Read file error : %v", err)
|
logs.Error("Read file error : %v", err)
|
||||||
}
|
}
|
||||||
@@ -116,61 +110,59 @@ func (ffw *FileFlvReader) Read(p []byte) (n int, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ffw *FileFlvReader) openFlvFile() error {
|
func (ffr *FileFlvReader) openFlvFile() error {
|
||||||
fullFileName := getFileFlvPath() + "/" + ffw.fileName
|
fullFileName := getFileFlvPath() + "/" + ffr.fileName
|
||||||
fd, err := os.OpenFile(fullFileName, os.O_RDWR, 0644)
|
fd, err := os.OpenFile(fullFileName, os.O_RDWR, 0644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("open file: %s error : %v", fullFileName, err)
|
logs.Error("open file: %s error : %v", fullFileName, err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
ffw.fd = fd
|
ffr.fd = fd
|
||||||
ffw.fullFileName = fullFileName
|
ffr.fullFileName = fullFileName
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ffw *FileFlvReader) flvRead() {
|
func (ffr *FileFlvReader) flvRead() {
|
||||||
defer func() {
|
defer func() {
|
||||||
if r := recover(); r != nil {
|
if r := recover(); r != nil {
|
||||||
logs.Error("system painc : %v \nstack : %v", r, string(debug.Stack()))
|
logs.Error("system painc : %v \nstack : %v", r, string(debug.Stack()))
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
if err := ffw.openFlvFile(); err != nil {
|
if err := ffr.openFlvFile(); err != nil {
|
||||||
logs.Error("open file flv error : %v", err)
|
logs.Error("open file flv error : %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
ffw.endTime = time.Now()
|
ffr.endTime = time.Now()
|
||||||
ffw.fd.Close()
|
ffr.fd.Close()
|
||||||
|
|
||||||
if !ffw.fgDoneClose {
|
ffr.CloseDone()
|
||||||
close(ffw.done)
|
|
||||||
}
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
ffw.startTime = time.Now()
|
ffr.startTime = time.Now()
|
||||||
httpWriteMuxer := flv.NewMuxer(ffw.httpWrite)
|
httpWriteMuxer := flv.NewMuxer(ffr.httpWrite)
|
||||||
demuxer := flv.NewDemuxer(ffw)
|
demuxer := flv.NewDemuxer(ffr)
|
||||||
ffw.muxer = demuxer
|
ffr.muxer = demuxer
|
||||||
codecs, err := demuxer.Streams()
|
codecs, err := demuxer.Streams()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("read codecs from flv file error : %v", err)
|
logs.Error("read codecs from flv file error : %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ffw.codecs = codecs
|
ffr.codecs = codecs
|
||||||
httpWriteMuxer.WriteHeader(codecs)
|
httpWriteMuxer.WriteHeader(codecs)
|
||||||
|
|
||||||
if ffw.seekSecond > 0 {
|
if ffr.seekSecond > 0 {
|
||||||
for {
|
for {
|
||||||
pkt, err := demuxer.ReadPacket()
|
pkt, err := demuxer.ReadPacket()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("read file %s ReadPacket error : %v", ffw.fileName, err)
|
logs.Error("read file %s ReadPacket error : %v", ffr.fileName, err)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if !ffw.fgOffSetTime {
|
if !ffr.fgOffSetTime {
|
||||||
ffw.fgOffSetTime = true
|
ffr.fgOffSetTime = true
|
||||||
ffw.offSetTime = pkt.Time
|
ffr.offSetTime = pkt.Time
|
||||||
}
|
}
|
||||||
if (pkt.Time - ffw.offSetTime) >= time.Duration(ffw.seekSecond)*time.Second {
|
if (pkt.Time - ffr.offSetTime) >= time.Duration(ffr.seekSecond)*time.Second {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -182,35 +174,35 @@ Loop:
|
|||||||
for {
|
for {
|
||||||
pkt, err := demuxer.ReadPacket()
|
pkt, err := demuxer.ReadPacket()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("read file %s ReadPacket error : %v", ffw.fileName, err)
|
logs.Error("read file %s ReadPacket error : %v", ffr.fileName, err)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if !ffw.fgOffSetTime {
|
if !ffr.fgOffSetTime {
|
||||||
ffw.fgOffSetTime = true
|
ffr.fgOffSetTime = true
|
||||||
ffw.offSetTime = pkt.Time
|
ffr.offSetTime = pkt.Time
|
||||||
}
|
}
|
||||||
if !ffw.fgStart {
|
if !ffr.fgStart {
|
||||||
if !pkt.IsKeyFrame {
|
if !pkt.IsKeyFrame {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
ffw.fgStart = true
|
ffr.fgStart = true
|
||||||
}
|
}
|
||||||
err = httpWriteMuxer.WritePacket(pkt)
|
err = httpWriteMuxer.WritePacket(pkt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("read file %s WritePacket error : %v", ffw.fileName, err)
|
logs.Error("read file %s WritePacket error : %v", ffr.fileName, err)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
sinceTime := time.Since(timeStart) + time.Duration(ffw.seekSecond)*time.Second
|
sinceTime := time.Since(timeStart) + time.Duration(ffr.seekSecond)*time.Second
|
||||||
if (pkt.Time - ffw.offSetTime) > (sinceTime + 5*time.Minute) {
|
if (pkt.Time - ffr.offSetTime) > (sinceTime + 5*time.Minute) {
|
||||||
select {
|
select {
|
||||||
case <-ffw.done:
|
case <-ffr.done:
|
||||||
break Loop
|
break Loop
|
||||||
case <-time.NewTicker(5 * time.Second).C:
|
case <-time.NewTicker(5 * time.Second).C:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
select {
|
select {
|
||||||
case <-ffw.done:
|
case <-ffr.done:
|
||||||
break Loop
|
break Loop
|
||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
|
@@ -5,6 +5,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/beego/beego/v2/core/config"
|
"github.com/beego/beego/v2/core/config"
|
||||||
@@ -39,6 +40,7 @@ type FileFlvWriter struct {
|
|||||||
endTime time.Time
|
endTime time.Time
|
||||||
ffm IFileFlvManager
|
ffm IFileFlvManager
|
||||||
idCamera string
|
idCamera string
|
||||||
|
mutex sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ffw *FileFlvWriter) GetDone() <-chan int {
|
func (ffw *FileFlvWriter) GetDone() <-chan int {
|
||||||
@@ -84,31 +86,7 @@ func NewFileFlvWriter(
|
|||||||
isStart: false,
|
isStart: false,
|
||||||
ffm: ffm,
|
ffm: ffm,
|
||||||
}
|
}
|
||||||
condition := common.GetEqualCondition("code", code)
|
|
||||||
camera, err := base_service.CameraFindOneByCondition(condition)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("query camera error : %v", err)
|
|
||||||
return ffw
|
|
||||||
}
|
|
||||||
if camera.OnlineStatus != true {
|
|
||||||
return ffw
|
|
||||||
}
|
|
||||||
if camera.SaveVideo != true {
|
|
||||||
go func() {
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-ffw.GetDone():
|
|
||||||
return
|
|
||||||
case _, ok := <-ffw.pktStream:
|
|
||||||
if !ok {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
return ffw
|
|
||||||
}
|
|
||||||
ffw.idCamera = camera.Id
|
|
||||||
go ffw.flvWrite()
|
go ffw.flvWrite()
|
||||||
return ffw
|
return ffw
|
||||||
}
|
}
|
||||||
@@ -121,9 +99,17 @@ func (ffw *FileFlvWriter) StopWrite() {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
ffw.ffm.DeleteFFW(ffw.sessionId)
|
ffw.ffm.DeleteFFW(ffw.sessionId)
|
||||||
|
ffw.CloseDone()
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ffw *FileFlvWriter) CloseDone() {
|
||||||
|
ffw.mutex.Lock()
|
||||||
|
if !ffw.fgDoneClose {
|
||||||
ffw.fgDoneClose = true
|
ffw.fgDoneClose = true
|
||||||
close(ffw.done)
|
close(ffw.done)
|
||||||
}()
|
}
|
||||||
|
ffw.mutex.Unlock()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ffw *FileFlvWriter) TickerStopWrite() {
|
func (ffw *FileFlvWriter) TickerStopWrite() {
|
||||||
@@ -136,8 +122,7 @@ func (ffw *FileFlvWriter) TickerStopWrite() {
|
|||||||
select {
|
select {
|
||||||
case <-time.NewTicker(30 * time.Second).C: //等待30秒再关闭
|
case <-time.NewTicker(30 * time.Second).C: //等待30秒再关闭
|
||||||
ffw.ffm.DeleteFFW(ffw.sessionId)
|
ffw.ffm.DeleteFFW(ffw.sessionId)
|
||||||
ffw.fgDoneClose = true
|
ffw.CloseDone()
|
||||||
close(ffw.done)
|
|
||||||
case <-ffw.GetDone():
|
case <-ffw.GetDone():
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
@@ -180,11 +165,36 @@ func (ffw *FileFlvWriter) flvWrite() {
|
|||||||
logs.Error("system painc : %v \nstack : %v", r, string(debug.Stack()))
|
logs.Error("system painc : %v \nstack : %v", r, string(debug.Stack()))
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
defer func() {
|
||||||
|
ffw.CloseDone()
|
||||||
|
}()
|
||||||
|
condition := common.GetEqualCondition("code", ffw.code)
|
||||||
|
camera, err := base_service.CameraFindOneByCondition(condition)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("query camera error : %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !camera.OnlineStatus {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !camera.SaveVideo {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-ffw.GetDone():
|
||||||
|
return
|
||||||
|
case _, ok := <-ffw.pktStream:
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ffw.idCamera = camera.Id
|
||||||
|
|
||||||
if err := ffw.createFlvFile(); err != nil {
|
if err := ffw.createFlvFile(); err != nil {
|
||||||
logs.Error("create file flv error : %v", err)
|
logs.Error("create file flv error : %v", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
ffw.endTime = time.Now()
|
ffw.endTime = time.Now()
|
||||||
ffw.muxer.WriteTrailer()
|
ffw.muxer.WriteTrailer()
|
||||||
@@ -192,10 +202,6 @@ func (ffw *FileFlvWriter) flvWrite() {
|
|||||||
|
|
||||||
//写入script tag data,主要补充视频的总时长,否则使用播放器播放看不到视频总时长
|
//写入script tag data,主要补充视频的总时长,否则使用播放器播放看不到视频总时长
|
||||||
ffw.writeScriptTagData()
|
ffw.writeScriptTagData()
|
||||||
|
|
||||||
if !ffw.fgDoneClose {
|
|
||||||
close(ffw.done)
|
|
||||||
}
|
|
||||||
}()
|
}()
|
||||||
|
|
||||||
muxer := flv.NewMuxer(ffw)
|
muxer := flv.NewMuxer(ffw)
|
||||||
|
@@ -1,9 +1,11 @@
|
|||||||
package httpflvmanage
|
package httpflvmanage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
"sync"
|
"sync"
|
||||||
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
"github.com/beego/beego/v2/core/logs"
|
||||||
@@ -14,12 +16,33 @@ import (
|
|||||||
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
|
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type SyncMap struct {
|
||||||
|
sync.Map
|
||||||
|
size int32 // 原子计数器,用于跟踪map的大小
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sm *SyncMap) Store(key, value interface{}) {
|
||||||
|
sm.Map.Store(key, value)
|
||||||
|
atomic.AddInt32(&sm.size, 1) // 每次存储时增加计数器
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sm *SyncMap) Delete(key interface{}) {
|
||||||
|
sm.Map.Delete(key)
|
||||||
|
atomic.AddInt32(&sm.size, -1) // 每次删除时减少计数器
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sm *SyncMap) IsEmpty() bool {
|
||||||
|
return atomic.LoadInt32(&sm.size) == 0 // 加载计数器的值并检查是否为0
|
||||||
|
}
|
||||||
|
|
||||||
type HttpFlvManager struct {
|
type HttpFlvManager struct {
|
||||||
done chan int
|
fgDoneClose bool
|
||||||
pktStream <-chan av.Packet
|
done chan int
|
||||||
code string
|
pktStream <-chan av.Packet
|
||||||
codecs []av.CodecData
|
code string
|
||||||
hfws sync.Map
|
codecs []av.CodecData
|
||||||
|
hfws SyncMap
|
||||||
|
mutex sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func (hfm *HttpFlvManager) GetCode() string {
|
func (hfm *HttpFlvManager) GetCode() string {
|
||||||
@@ -50,35 +73,13 @@ func (hfm *HttpFlvManager) GetCodecs() []av.CodecData {
|
|||||||
|
|
||||||
func NewHttpFlvManager(pktStream <-chan av.Packet, code string, codecs []av.CodecData) *HttpFlvManager {
|
func NewHttpFlvManager(pktStream <-chan av.Packet, code string, codecs []av.CodecData) *HttpFlvManager {
|
||||||
hfm := &HttpFlvManager{
|
hfm := &HttpFlvManager{
|
||||||
done: make(chan int),
|
fgDoneClose: false,
|
||||||
pktStream: pktStream,
|
done: make(chan int),
|
||||||
code: code,
|
pktStream: pktStream,
|
||||||
codecs: codecs,
|
code: code,
|
||||||
}
|
codecs: codecs,
|
||||||
condition := common.GetEqualCondition("code", code)
|
|
||||||
camera, err := base_service.CameraFindOneByCondition(condition)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("query camera error : %v", err)
|
|
||||||
return hfm
|
|
||||||
}
|
|
||||||
if camera.OnlineStatus != true {
|
|
||||||
return hfm
|
|
||||||
}
|
|
||||||
if camera.Live != true {
|
|
||||||
go func() {
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-hfm.GetDone():
|
|
||||||
return
|
|
||||||
case _, ok := <-hfm.pktStream:
|
|
||||||
if !ok {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
return hfm
|
|
||||||
}
|
}
|
||||||
|
|
||||||
go hfm.flvWrite()
|
go hfm.flvWrite()
|
||||||
return hfm
|
return hfm
|
||||||
}
|
}
|
||||||
@@ -90,10 +91,19 @@ func (hfm *HttpFlvManager) StopWrite() {
|
|||||||
logs.Error("system painc : %v \nstack : %v", r, string(debug.Stack()))
|
logs.Error("system painc : %v \nstack : %v", r, string(debug.Stack()))
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
close(hfm.done)
|
hfm.CloseDone()
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (hfm *HttpFlvManager) CloseDone() {
|
||||||
|
hfm.mutex.Lock()
|
||||||
|
if !hfm.fgDoneClose {
|
||||||
|
hfm.fgDoneClose = true
|
||||||
|
close(hfm.done)
|
||||||
|
}
|
||||||
|
hfm.mutex.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
// Write extends to writer.Writer
|
// Write extends to writer.Writer
|
||||||
func (hfm *HttpFlvManager) flvWrite() {
|
func (hfm *HttpFlvManager) flvWrite() {
|
||||||
defer func() {
|
defer func() {
|
||||||
@@ -101,6 +111,28 @@ func (hfm *HttpFlvManager) flvWrite() {
|
|||||||
logs.Error("system painc : %v \nstack : %v", r, string(debug.Stack()))
|
logs.Error("system painc : %v \nstack : %v", r, string(debug.Stack()))
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
defer hfm.CloseDone()
|
||||||
|
condition := common.GetEqualCondition("code", hfm.code)
|
||||||
|
camera, err := base_service.CameraFindOneByCondition(condition)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("query camera error : %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !camera.OnlineStatus {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !camera.Live {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-hfm.GetDone():
|
||||||
|
return
|
||||||
|
case _, ok := <-hfm.pktStream:
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
for pkt := range utils.OrDonePacket(hfm.done, hfm.pktStream) {
|
for pkt := range utils.OrDonePacket(hfm.done, hfm.pktStream) {
|
||||||
hfm.hfws.Range(func(key, value interface{}) bool {
|
hfm.hfws.Range(func(key, value interface{}) bool {
|
||||||
wi := value.(*httpflvwriter.HttpFlvWriter)
|
wi := value.(*httpflvwriter.HttpFlvWriter)
|
||||||
@@ -122,6 +154,18 @@ func (hfm *HttpFlvManager) AddHttpFlvPlayer(
|
|||||||
pulseInterval time.Duration,
|
pulseInterval time.Duration,
|
||||||
writer io.Writer,
|
writer io.Writer,
|
||||||
) (<-chan int, error) {
|
) (<-chan int, error) {
|
||||||
|
condition := common.GetEqualCondition("code", hfm.code)
|
||||||
|
camera, err := base_service.CameraFindOneByCondition(condition)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("query camera error : %v", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if !camera.OnlineStatus {
|
||||||
|
return nil, fmt.Errorf("camera offline")
|
||||||
|
}
|
||||||
|
if !camera.Live {
|
||||||
|
return nil, fmt.Errorf("camera live disabled")
|
||||||
|
}
|
||||||
sessionId := utils.NextValSnowflakeID()
|
sessionId := utils.NextValSnowflakeID()
|
||||||
//添加缓冲
|
//添加缓冲
|
||||||
pktStream := make(chan av.Packet, 1024)
|
pktStream := make(chan av.Packet, 1024)
|
||||||
@@ -137,3 +181,7 @@ func (hfm *HttpFlvManager) AddHttpFlvPlayer(
|
|||||||
func (hfm *HttpFlvManager) DeleteHFW(sesessionId int64) {
|
func (hfm *HttpFlvManager) DeleteHFW(sesessionId int64) {
|
||||||
hfm.hfws.LoadAndDelete(sesessionId)
|
hfm.hfws.LoadAndDelete(sesessionId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (hfm *HttpFlvManager) IsCameraExistsPlayer() bool {
|
||||||
|
return hfm.hfws.IsEmpty()
|
||||||
|
}
|
||||||
|
@@ -9,8 +9,6 @@ import (
|
|||||||
"github.com/deepch/vdk/av"
|
"github.com/deepch/vdk/av"
|
||||||
"github.com/deepch/vdk/format/flv"
|
"github.com/deepch/vdk/format/flv"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
|
||||||
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type IHttpFlvManager interface {
|
type IHttpFlvManager interface {
|
||||||
@@ -82,28 +80,6 @@ func NewHttpFlvWriter(
|
|||||||
start: false,
|
start: false,
|
||||||
}
|
}
|
||||||
|
|
||||||
condition := common.GetEqualCondition("code", code)
|
|
||||||
camera, err := base_service.CameraFindOneByCondition(condition)
|
|
||||||
if err != nil {
|
|
||||||
logs.Error("query camera error : %v", err)
|
|
||||||
return hfw
|
|
||||||
}
|
|
||||||
if camera.OnlineStatus != true {
|
|
||||||
return hfw
|
|
||||||
}
|
|
||||||
if camera.Live != true {
|
|
||||||
go func() {
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case <-hfw.GetDone():
|
|
||||||
return
|
|
||||||
case <-hfw.pktStream:
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
return hfw
|
|
||||||
}
|
|
||||||
|
|
||||||
go hfw.httpWrite()
|
go hfw.httpWrite()
|
||||||
return hfw
|
return hfw
|
||||||
}
|
}
|
||||||
@@ -117,6 +93,7 @@ func (hfw *HttpFlvWriter) httpWrite() {
|
|||||||
|
|
||||||
ticker := time.NewTicker(hfw.pulseInterval)
|
ticker := time.NewTicker(hfw.pulseInterval)
|
||||||
defer func() {
|
defer func() {
|
||||||
|
hfw.ihfm.DeleteHFW(hfw.sessionId)
|
||||||
close(hfw.done)
|
close(hfw.done)
|
||||||
}()
|
}()
|
||||||
pktStream := utils.OrDonePacket(hfw.playerDone, hfw.pktStream)
|
pktStream := utils.OrDonePacket(hfw.playerDone, hfw.pktStream)
|
||||||
|
@@ -2,11 +2,13 @@ package rtmpflvwriter
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
"github.com/beego/beego/v2/core/logs"
|
||||||
"github.com/deepch/vdk/av"
|
"github.com/deepch/vdk/av"
|
||||||
"github.com/deepch/vdk/format/rtmp"
|
"github.com/deepch/vdk/format/rtmp"
|
||||||
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/tcpclient/camerastatuspush"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
||||||
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
|
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
|
||||||
@@ -19,6 +21,7 @@ type IRtmpFlvManager interface {
|
|||||||
type RtmpFlvWriter struct {
|
type RtmpFlvWriter struct {
|
||||||
needPushRtmp bool
|
needPushRtmp bool
|
||||||
stop bool
|
stop bool
|
||||||
|
fgDoneClose bool
|
||||||
done chan int
|
done chan int
|
||||||
pktStream <-chan av.Packet
|
pktStream <-chan av.Packet
|
||||||
code string
|
code string
|
||||||
@@ -28,6 +31,7 @@ type RtmpFlvWriter struct {
|
|||||||
conn *rtmp.Conn
|
conn *rtmp.Conn
|
||||||
pulseInterval time.Duration
|
pulseInterval time.Duration
|
||||||
irfm IRtmpFlvManager
|
irfm IRtmpFlvManager
|
||||||
|
mutex sync.Mutex
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rfw *RtmpFlvWriter) GetDone() <-chan int {
|
func (rfw *RtmpFlvWriter) GetDone() <-chan int {
|
||||||
@@ -59,6 +63,7 @@ func NewRtmpFlvWriter(needPushRtmp bool, pktStream <-chan av.Packet, code string
|
|||||||
rfw := &RtmpFlvWriter{
|
rfw := &RtmpFlvWriter{
|
||||||
needPushRtmp: needPushRtmp,
|
needPushRtmp: needPushRtmp,
|
||||||
stop: false,
|
stop: false,
|
||||||
|
fgDoneClose: false,
|
||||||
done: make(chan int),
|
done: make(chan int),
|
||||||
pktStream: pktStream,
|
pktStream: pktStream,
|
||||||
code: code,
|
code: code,
|
||||||
@@ -79,10 +84,19 @@ func (rfw *RtmpFlvWriter) StopWrite() {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
rfw.stop = true
|
rfw.stop = true
|
||||||
close(rfw.done)
|
rfw.CloseDone()
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (rfw *RtmpFlvWriter) CloseDone() {
|
||||||
|
rfw.mutex.Lock()
|
||||||
|
if !rfw.fgDoneClose {
|
||||||
|
rfw.fgDoneClose = true
|
||||||
|
close(rfw.done)
|
||||||
|
}
|
||||||
|
rfw.mutex.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
func (rfw *RtmpFlvWriter) createConn() error {
|
func (rfw *RtmpFlvWriter) createConn() error {
|
||||||
condition := common.GetEqualCondition("code", rfw.code)
|
condition := common.GetEqualCondition("code", rfw.code)
|
||||||
camera, err := base_service.CameraFindOneByCondition(condition)
|
camera, err := base_service.CameraFindOneByCondition(condition)
|
||||||
@@ -114,20 +128,37 @@ func (rfw *RtmpFlvWriter) flvWrite() {
|
|||||||
logs.Error("not found camera : %s", rfw.code)
|
logs.Error("not found camera : %s", rfw.code)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if camera.OnlineStatus != true {
|
if !camera.OnlineStatus {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if camera.RtmpPushStatus != true || !rfw.needPushRtmp {
|
defer rfw.CloseDone()
|
||||||
|
if camera.RtmpPushStatus && camera.FgPassive {
|
||||||
go func() {
|
go func() {
|
||||||
|
defer func() {
|
||||||
|
camerastatuspush.CameraOfflinePush(camera.Code)
|
||||||
|
}()
|
||||||
|
camerastatuspush.CameraOnlinePush(camera.Code)
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-rfw.GetDone():
|
case <-rfw.GetDone():
|
||||||
return
|
return
|
||||||
case <-rfw.pktStream:
|
case <-time.NewTicker(1 * time.Second).C:
|
||||||
|
camerastatuspush.CameraOnlinePush(camera.Code)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
return
|
}
|
||||||
|
if !camera.RtmpPushStatus && !rfw.needPushRtmp {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-rfw.GetDone():
|
||||||
|
return
|
||||||
|
case _, ok := <-rfw.pktStream:
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ticker := time.NewTicker(rfw.pulseInterval)
|
ticker := time.NewTicker(rfw.pulseInterval)
|
||||||
|
@@ -5,13 +5,14 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/tcpclient/tcpclientcommon"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
||||||
dto_convert "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/controller/convert"
|
dto_convert "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/controller/convert"
|
||||||
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
|
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
|
||||||
)
|
)
|
||||||
|
|
||||||
func cameraAq(commandMessage CommandMessage) {
|
func cameraAq(commandMessage tcpclientcommon.CommandMessage) {
|
||||||
conn, err := connectAndRegister("cameraAq", commandMessage.MessageId)
|
conn, err := tcpclientcommon.ConnectAndResRegister("cameraAq", commandMessage.MessageId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("cameraAq connect to server error: %v", err)
|
logs.Error("cameraAq connect to server error: %v", err)
|
||||||
return
|
return
|
||||||
@@ -24,7 +25,7 @@ func cameraAq(commandMessage CommandMessage) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("cameraAq message format error: %v", err)
|
logs.Error("cameraAq message format error: %v", err)
|
||||||
result := common.ErrorResult(fmt.Sprintf("cameraAq message format error: %v", err))
|
result := common.ErrorResult(fmt.Sprintf("cameraAq message format error: %v", err))
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
@@ -36,7 +37,7 @@ func cameraAq(commandMessage CommandMessage) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("CameraFindCollectionByCondition error: %v", err)
|
logs.Error("CameraFindCollectionByCondition error: %v", err)
|
||||||
result := common.ErrorResult("CameraFindCollectionByCondition error")
|
result := common.ErrorResult("CameraFindCollectionByCondition error")
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
@@ -47,7 +48,7 @@ func cameraAq(commandMessage CommandMessage) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("ConvertCameraToVOList error: %v", err)
|
logs.Error("ConvertCameraToVOList error: %v", err)
|
||||||
result := common.ErrorResult("ConvertCameraToVOList error")
|
result := common.ErrorResult("ConvertCameraToVOList error")
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
@@ -55,7 +56,7 @@ func cameraAq(commandMessage CommandMessage) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
result := common.SuccessResultData(voList)
|
result := common.SuccessResultData(voList)
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
|
@@ -0,0 +1,24 @@
|
|||||||
|
package camerastatuspush
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/tcpclient/tcpclientcommon"
|
||||||
|
)
|
||||||
|
|
||||||
|
func CameraOnlinePush(cameraCode string) {
|
||||||
|
conn, err := tcpclientcommon.ConnectAndCameraStatusRegister("cameraOnline", cameraCode)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("cameraAq connect to server error: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer conn.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
func CameraOfflinePush(cameraCode string) {
|
||||||
|
conn, err := tcpclientcommon.ConnectAndCameraStatusRegister("cameraOffline", cameraCode)
|
||||||
|
if err != nil {
|
||||||
|
logs.Error("cameraAq connect to server error: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer conn.Close()
|
||||||
|
}
|
@@ -7,6 +7,7 @@ import (
|
|||||||
|
|
||||||
"github.com/beego/beego/v2/core/config"
|
"github.com/beego/beego/v2/core/config"
|
||||||
"github.com/beego/beego/v2/core/logs"
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/tcpclient/tcpclientcommon"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -20,7 +21,7 @@ func StartCommandReceiveServer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func commandReceiveConnect() {
|
func commandReceiveConnect() {
|
||||||
conn, err := connectAndRegister("keepChannel", "")
|
conn, err := tcpclientcommon.ConnectAndKeepChannelRegister("keepChannel")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("keepChannel connect to server error: %v", err)
|
logs.Error("keepChannel connect to server error: %v", err)
|
||||||
return
|
return
|
||||||
@@ -54,7 +55,7 @@ func commandReceiveConnect() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// commandMessage := CommandMessage{}
|
// commandMessage := tcpclientcommon.CommandMessage{}
|
||||||
// err = json.Unmarshal(serverRepBytes, &commandMessage)
|
// err = json.Unmarshal(serverRepBytes, &commandMessage)
|
||||||
// if err != nil {
|
// if err != nil {
|
||||||
// logs.Error("message format error: %v", err)
|
// logs.Error("message format error: %v", err)
|
||||||
@@ -71,7 +72,7 @@ func commandReceiveConnect() {
|
|||||||
logs.Error("message DecryptAES error: %v", err)
|
logs.Error("message DecryptAES error: %v", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
commandMessage := CommandMessage{}
|
commandMessage := tcpclientcommon.CommandMessage{}
|
||||||
err = json.Unmarshal(commandBytes, &commandMessage)
|
err = json.Unmarshal(commandBytes, &commandMessage)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("message format error: %v", err)
|
logs.Error("message format error: %v", err)
|
||||||
@@ -83,7 +84,7 @@ func commandReceiveConnect() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func commandRes(commandMessage CommandMessage) {
|
func commandRes(commandMessage tcpclientcommon.CommandMessage) {
|
||||||
switch commandMessage.MessageType {
|
switch commandMessage.MessageType {
|
||||||
case "cameraAq":
|
case "cameraAq":
|
||||||
cameraAq(commandMessage)
|
cameraAq(commandMessage)
|
||||||
|
@@ -9,6 +9,7 @@ import (
|
|||||||
"github.com/beego/beego/v2/core/config"
|
"github.com/beego/beego/v2/core/config"
|
||||||
"github.com/beego/beego/v2/core/logs"
|
"github.com/beego/beego/v2/core/logs"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin/fileflvmanager/fileflvreader"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin/fileflvmanager/fileflvreader"
|
||||||
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/tcpclient/tcpclientcommon"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/utils"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
||||||
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
|
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
|
||||||
@@ -59,8 +60,8 @@ func (flvPush FlvPush) Write(p []byte) (n int, err error) {
|
|||||||
return len(p), nil
|
return len(p), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func flvPlay(commandMessage CommandMessage) {
|
func flvPlay(commandMessage tcpclientcommon.CommandMessage) {
|
||||||
conn, err := connectAndRegister("flvPlay", commandMessage.MessageId)
|
conn, err := tcpclientcommon.ConnectAndResRegister("flvPlay", commandMessage.MessageId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("flvPlay connect to server error: %v", err)
|
logs.Error("flvPlay connect to server error: %v", err)
|
||||||
return
|
return
|
||||||
@@ -72,7 +73,7 @@ func flvPlay(commandMessage CommandMessage) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("flvPlay message format error: %v", err)
|
logs.Error("flvPlay message format error: %v", err)
|
||||||
result := common.ErrorResult(fmt.Sprintf("flvPlay message format error: %v", err))
|
result := common.ErrorResult(fmt.Sprintf("flvPlay message format error: %v", err))
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
@@ -84,7 +85,7 @@ func flvPlay(commandMessage CommandMessage) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("CameraRecordSelectById error: %v", err)
|
logs.Error("CameraRecordSelectById error: %v", err)
|
||||||
result := common.ErrorResult(fmt.Sprintf("idCameraRecord: %s CameraRecordSelectById error", playParam.IdCameraRecord))
|
result := common.ErrorResult(fmt.Sprintf("idCameraRecord: %s CameraRecordSelectById error", playParam.IdCameraRecord))
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
@@ -103,7 +104,7 @@ func flvPlay(commandMessage CommandMessage) {
|
|||||||
if ok {
|
if ok {
|
||||||
logs.Error("playerId: %s exists", playParam.PlayerId)
|
logs.Error("playerId: %s exists", playParam.PlayerId)
|
||||||
result := common.ErrorResult(fmt.Sprintf("playerId: %s exists", playParam.PlayerId))
|
result := common.ErrorResult(fmt.Sprintf("playerId: %s exists", playParam.PlayerId))
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
|
@@ -6,6 +6,7 @@ import (
|
|||||||
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
"github.com/beego/beego/v2/core/logs"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin/fileflvmanager/fileflvreader"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin/fileflvmanager/fileflvreader"
|
||||||
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/tcpclient/tcpclientcommon"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -14,8 +15,8 @@ type FetchMoreDataParam struct {
|
|||||||
SeekSecond uint64 `json:"seekSecond"`
|
SeekSecond uint64 `json:"seekSecond"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func flvFetchMoreData(commandMessage CommandMessage) {
|
func flvFetchMoreData(commandMessage tcpclientcommon.CommandMessage) {
|
||||||
conn, err := connectAndRegister("flvFetchMoreData", commandMessage.MessageId)
|
conn, err := tcpclientcommon.ConnectAndResRegister("flvFetchMoreData", commandMessage.MessageId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("flvFetchMoreData connect to server error: %v", err)
|
logs.Error("flvFetchMoreData connect to server error: %v", err)
|
||||||
return
|
return
|
||||||
@@ -28,7 +29,7 @@ func flvFetchMoreData(commandMessage CommandMessage) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("flvFetchMoreData message format error: %v", err)
|
logs.Error("flvFetchMoreData message format error: %v", err)
|
||||||
result := common.ErrorResult(fmt.Sprintf("flvFetchMoreData message format error: %v", err))
|
result := common.ErrorResult(fmt.Sprintf("flvFetchMoreData message format error: %v", err))
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
@@ -40,7 +41,7 @@ func flvFetchMoreData(commandMessage CommandMessage) {
|
|||||||
if !ok {
|
if !ok {
|
||||||
logs.Error("playerId: %s not exists or complate", param.PlayerId)
|
logs.Error("playerId: %s not exists or complate", param.PlayerId)
|
||||||
result := common.SuccessResultMsg(fmt.Sprintf("playerId: %s not exists or complate, skip this request", param.PlayerId))
|
result := common.SuccessResultMsg(fmt.Sprintf("playerId: %s not exists or complate, skip this request", param.PlayerId))
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
@@ -52,7 +53,7 @@ func flvFetchMoreData(commandMessage CommandMessage) {
|
|||||||
|
|
||||||
logs.Info("vod player [%s] fetch data, addr [%s]", param.PlayerId, conn.LocalAddr().String())
|
logs.Info("vod player [%s] fetch data, addr [%s]", param.PlayerId, conn.LocalAddr().String())
|
||||||
result := common.SuccessResultMsg("fetch sccess")
|
result := common.SuccessResultMsg("fetch sccess")
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
|
@@ -6,6 +6,7 @@ import (
|
|||||||
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
"github.com/beego/beego/v2/core/logs"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin/fileflvmanager/fileflvreader"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin/fileflvmanager/fileflvreader"
|
||||||
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/tcpclient/tcpclientcommon"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dto/vo/ext/flv_file"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dto/vo/ext/flv_file"
|
||||||
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
|
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
|
||||||
@@ -15,8 +16,8 @@ type FlvFileMediaInfoParam struct {
|
|||||||
IdCameraRecord string `json:"idCameraRecord"`
|
IdCameraRecord string `json:"idCameraRecord"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func flvFileMediaInfo(commandMessage CommandMessage) {
|
func flvFileMediaInfo(commandMessage tcpclientcommon.CommandMessage) {
|
||||||
conn, err := connectAndRegister("flvFileMediaInfo", commandMessage.MessageId)
|
conn, err := tcpclientcommon.ConnectAndResRegister("flvFileMediaInfo", commandMessage.MessageId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("flvFileMediaInfo connect to server error: %v", err)
|
logs.Error("flvFileMediaInfo connect to server error: %v", err)
|
||||||
return
|
return
|
||||||
@@ -28,7 +29,7 @@ func flvFileMediaInfo(commandMessage CommandMessage) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("flvFileMediaInfo message format error: %v", err)
|
logs.Error("flvFileMediaInfo message format error: %v", err)
|
||||||
result := common.ErrorResult(fmt.Sprintf("flvFileMediaInfo message format error: %v", err))
|
result := common.ErrorResult(fmt.Sprintf("flvFileMediaInfo message format error: %v", err))
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
@@ -41,7 +42,7 @@ func flvFileMediaInfo(commandMessage CommandMessage) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("idCameraRecord: %s CameraRecordSelectById error: %v", idCameraRecord, err)
|
logs.Error("idCameraRecord: %s CameraRecordSelectById error: %v", idCameraRecord, err)
|
||||||
result := common.ErrorResult(fmt.Sprintf("idCameraRecord: %s CameraRecordSelectById error", idCameraRecord))
|
result := common.ErrorResult(fmt.Sprintf("idCameraRecord: %s CameraRecordSelectById error", idCameraRecord))
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
@@ -63,7 +64,7 @@ func flvFileMediaInfo(commandMessage CommandMessage) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("file: %s get mediaInfo error", camera_record.TempFileName)
|
logs.Error("file: %s get mediaInfo error", camera_record.TempFileName)
|
||||||
result := common.ErrorResult(fmt.Sprintf("file: %s get mediaInfo error", camera_record.TempFileName))
|
result := common.ErrorResult(fmt.Sprintf("file: %s get mediaInfo error", camera_record.TempFileName))
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
@@ -73,7 +74,7 @@ func flvFileMediaInfo(commandMessage CommandMessage) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
result := common.SuccessResultData(mediaInfo)
|
result := common.SuccessResultData(mediaInfo)
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
|
@@ -5,14 +5,15 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
"github.com/beego/beego/v2/core/logs"
|
||||||
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/tcpclient/tcpclientcommon"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
||||||
dto_convert "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/controller/convert"
|
dto_convert "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/controller/convert"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/dao/entity"
|
||||||
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
|
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
|
||||||
)
|
)
|
||||||
|
|
||||||
func historyVideoPage(commandMessage CommandMessage) {
|
func historyVideoPage(commandMessage tcpclientcommon.CommandMessage) {
|
||||||
conn, err := connectAndRegister("historyVideoPage", commandMessage.MessageId)
|
conn, err := tcpclientcommon.ConnectAndResRegister("historyVideoPage", commandMessage.MessageId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("historyVideoPage connect to server error: %v", err)
|
logs.Error("historyVideoPage connect to server error: %v", err)
|
||||||
return
|
return
|
||||||
@@ -24,7 +25,7 @@ func historyVideoPage(commandMessage CommandMessage) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("historyVideoPage message format error: %v", err)
|
logs.Error("historyVideoPage message format error: %v", err)
|
||||||
result := common.ErrorResult(fmt.Sprintf("historyVideoPage message format error: %v", err))
|
result := common.ErrorResult(fmt.Sprintf("historyVideoPage message format error: %v", err))
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
@@ -36,7 +37,7 @@ func historyVideoPage(commandMessage CommandMessage) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("aqPage error : %v", err)
|
logs.Error("aqPage error : %v", err)
|
||||||
result := common.ErrorResult("CameraRecordFindPageByCondition error")
|
result := common.ErrorResult("CameraRecordFindPageByCondition error")
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
@@ -51,7 +52,7 @@ func historyVideoPage(commandMessage CommandMessage) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("aqPage error: %v", err)
|
logs.Error("aqPage error: %v", err)
|
||||||
result := common.ErrorResult(fmt.Sprintf("ConvertCameraRecordToVOList error"))
|
result := common.ErrorResult(fmt.Sprintf("ConvertCameraRecordToVOList error"))
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
@@ -64,7 +65,7 @@ func historyVideoPage(commandMessage CommandMessage) {
|
|||||||
}
|
}
|
||||||
pageInfo.DataList = dataList
|
pageInfo.DataList = dataList
|
||||||
result := common.SuccessResultData(pageInfo)
|
result := common.SuccessResultData(pageInfo)
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
|
@@ -6,6 +6,7 @@ import (
|
|||||||
|
|
||||||
"github.com/beego/beego/v2/core/logs"
|
"github.com/beego/beego/v2/core/logs"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin"
|
||||||
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/tcpclient/tcpclientcommon"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -13,8 +14,8 @@ type RtmpPushParam struct {
|
|||||||
CameraCode string `json:"cameraCode"`
|
CameraCode string `json:"cameraCode"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func startRtmpPush(commandMessage CommandMessage) {
|
func startRtmpPush(commandMessage tcpclientcommon.CommandMessage) {
|
||||||
conn, err := connectAndRegister("startPushRtmp", commandMessage.MessageId)
|
conn, err := tcpclientcommon.ConnectAndResRegister("startPushRtmp", commandMessage.MessageId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("startPushRtmp connect to server error: %v", err)
|
logs.Error("startPushRtmp connect to server error: %v", err)
|
||||||
return
|
return
|
||||||
@@ -26,7 +27,7 @@ func startRtmpPush(commandMessage CommandMessage) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("startPushRtmp message format error: %v", err)
|
logs.Error("startPushRtmp message format error: %v", err)
|
||||||
result := common.ErrorResult(fmt.Sprintf("startPushRtmp message format error: %v", err))
|
result := common.ErrorResult(fmt.Sprintf("startPushRtmp message format error: %v", err))
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
@@ -36,15 +37,15 @@ func startRtmpPush(commandMessage CommandMessage) {
|
|||||||
flvadmin.GetSingleRtmpFlvAdmin().RemoteStartWrite(param.CameraCode)
|
flvadmin.GetSingleRtmpFlvAdmin().RemoteStartWrite(param.CameraCode)
|
||||||
|
|
||||||
result := common.SuccessResultData("startPushRtmp success")
|
result := common.SuccessResultData("startPushRtmp success")
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func stopRtmpPush(commandMessage CommandMessage) {
|
func stopRtmpPush(commandMessage tcpclientcommon.CommandMessage) {
|
||||||
conn, err := connectAndRegister("stopPushRtmp", commandMessage.MessageId)
|
conn, err := tcpclientcommon.ConnectAndResRegister("stopPushRtmp", commandMessage.MessageId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("stopPushRtmp connect to server error: %v", err)
|
logs.Error("stopPushRtmp connect to server error: %v", err)
|
||||||
return
|
return
|
||||||
@@ -56,7 +57,7 @@ func stopRtmpPush(commandMessage CommandMessage) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("stopPushRtmp message format error: %v", err)
|
logs.Error("stopPushRtmp message format error: %v", err)
|
||||||
result := common.ErrorResult(fmt.Sprintf("stopPushRtmp message format error: %v", err))
|
result := common.ErrorResult(fmt.Sprintf("stopPushRtmp message format error: %v", err))
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
@@ -67,7 +68,7 @@ func stopRtmpPush(commandMessage CommandMessage) {
|
|||||||
|
|
||||||
defer conn.Close()
|
defer conn.Close()
|
||||||
result := common.SuccessResultData("stopPushRtmp success")
|
result := common.SuccessResultData("stopPushRtmp success")
|
||||||
_, err = writeResult(result, conn)
|
_, err = tcpclientcommon.WriteResult(result, conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
package tcpclient
|
package tcpclientcommon
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
@@ -25,12 +25,13 @@ type RegisterInfo struct {
|
|||||||
ClientCode string `json:"clientCode"`
|
ClientCode string `json:"clientCode"`
|
||||||
DateStr string `json:"dateStr"`
|
DateStr string `json:"dateStr"`
|
||||||
Sign string `json:"sign"`
|
Sign string `json:"sign"`
|
||||||
// "keepChannel" "cameraAq" "historyVideoPage" "flvFileMediaInfo" "flvPlay" "flvFetchMoreData" "startPushRtmp" "stopPushRtmp"
|
// "keepChannel" "cameraOnline" "cameraOffline" "cameraAq" "historyVideoPage" "flvFileMediaInfo" "flvPlay" "flvFetchMoreData" "startPushRtmp" "stopPushRtmp"
|
||||||
ConnType string `json:"connType"`
|
ConnType string `json:"connType"`
|
||||||
MessageId string `json:"messageId"`
|
MessageId string `json:"messageId"`
|
||||||
|
CameraCode string `json:"cameraCode"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func newReisterInfo(connType string, messageId string) (ri RegisterInfo, err error) {
|
func newReisterInfo(connType string, messageId string, cameraCode string) (ri RegisterInfo, err error) {
|
||||||
currentDateStr := time.Now().Format(time.RFC3339)
|
currentDateStr := time.Now().Format(time.RFC3339)
|
||||||
clientCode, err := config.String("server.remote.client-code")
|
clientCode, err := config.String("server.remote.client-code")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -51,11 +52,24 @@ func newReisterInfo(connType string, messageId string) (ri RegisterInfo, err err
|
|||||||
DateStr: currentDateStr,
|
DateStr: currentDateStr,
|
||||||
Sign: signStr,
|
Sign: signStr,
|
||||||
MessageId: messageId,
|
MessageId: messageId,
|
||||||
|
CameraCode: cameraCode,
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func connectAndRegister(connType string, messageId string) (conn net.Conn, err error) {
|
func ConnectAndKeepChannelRegister(connType string) (conn net.Conn, err error) {
|
||||||
|
return connectAndRegister(connType, "", "")
|
||||||
|
}
|
||||||
|
|
||||||
|
func ConnectAndCameraStatusRegister(connType string, cameraCode string) (conn net.Conn, err error) {
|
||||||
|
return connectAndRegister(connType, "", cameraCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ConnectAndResRegister(connType string, messageId string) (conn net.Conn, err error) {
|
||||||
|
return connectAndRegister(connType, messageId, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
func connectAndRegister(connType string, messageId string, cameraCode string) (conn net.Conn, err error) {
|
||||||
serverIp, err := config.String("server.remote.server-ip")
|
serverIp, err := config.String("server.remote.server-ip")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error("get remote server-ip error: %v. \n", err)
|
logs.Error("get remote server-ip error: %v. \n", err)
|
||||||
@@ -73,7 +87,7 @@ func connectAndRegister(connType string, messageId string) (conn net.Conn, err e
|
|||||||
}
|
}
|
||||||
|
|
||||||
// register to server
|
// register to server
|
||||||
ri, err := newReisterInfo(connType, messageId)
|
ri, err := newReisterInfo(connType, messageId, cameraCode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
||||||
return
|
return
|
||||||
@@ -94,7 +108,7 @@ func connectAndRegister(connType string, messageId string) (conn net.Conn, err e
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeResult(result common.AppResult, writer io.Writer) (n int, err error) {
|
func WriteResult(result common.AppResult, writer io.Writer) (n int, err error) {
|
||||||
messageBytes, err := json.Marshal(result)
|
messageBytes, err := json.Marshal(result)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logs.Error(err)
|
logs.Error(err)
|
@@ -9,7 +9,6 @@ import (
|
|||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin/fileflvmanager/fileflvreader"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/flvadmin/fileflvmanager/fileflvreader"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/rtmpserver"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/rtmpserver"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/rtspclientmanager"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/rtspclientmanager"
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web"
|
|
||||||
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
"github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/common"
|
||||||
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
|
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
|
||||||
)
|
)
|
||||||
@@ -40,7 +39,6 @@ func (t *task) clearToken() {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
for {
|
for {
|
||||||
web.ClearExipresToken()
|
|
||||||
<-time.After(24 * time.Hour)
|
<-time.After(24 * time.Hour)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -4,8 +4,6 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
"strconv"
|
"strconv"
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/beego/beego/v2/core/config"
|
"github.com/beego/beego/v2/core/config"
|
||||||
"github.com/beego/beego/v2/core/logs"
|
"github.com/beego/beego/v2/core/logs"
|
||||||
@@ -14,22 +12,6 @@ import (
|
|||||||
ext_controller "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/controller/ext"
|
ext_controller "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/controller/ext"
|
||||||
)
|
)
|
||||||
|
|
||||||
var tokens sync.Map
|
|
||||||
|
|
||||||
func ClearExipresToken() {
|
|
||||||
deleteTokens := []string{}
|
|
||||||
// 遍历所有sync.Map中的键值对
|
|
||||||
tokens.Range(func(k, v interface{}) bool {
|
|
||||||
if time.Now().After(v.(time.Time).Add(30 * time.Minute)) {
|
|
||||||
deleteTokens = append(deleteTokens, k.(string))
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
for _, v := range deleteTokens {
|
|
||||||
tokens.Delete(v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var webInstance *web
|
var webInstance *web
|
||||||
|
|
||||||
type web struct{}
|
type web struct{}
|
||||||
|
Reference in New Issue
Block a user