history video push to server play

This commit is contained in:
madao
2025-01-27 11:59:47 +08:00
parent 513c0c2471
commit 900ed290bd
10 changed files with 112 additions and 68 deletions

View File

@@ -122,4 +122,39 @@ COMMENT ON COLUMN public.camera_share.enabled IS '启用状态';
COMMENT ON COLUMN public.camera_share.created IS '创建时间';
COMMENT ON COLUMN public.camera_share.start_time IS '开始时间';
COMMENT ON COLUMN public.camera_share.deadline IS '结束时间';
COMMENT ON COLUMN public.camera_share.camera_id IS '摄像头id';
COMMENT ON COLUMN public.camera_share.camera_id IS '摄像头id';
-- public.camera_record definition
-- Drop table
-- DROP TABLE camera_record;
CREATE TABLE camera_record (
id_camera_record varchar(255) NOT NULL,
created timestamp NULL, -- 创建时间
temp_file_name varchar(255) NULL, -- 临时文件名称
fg_temp bool NULL, -- 临时文件标志
file_name varchar(255) NULL, -- 文件名称
fg_remove bool NULL, -- 文件删除标志
duration int4 NULL, -- 文件时长: 单位:毫秒
start_time timestamp NULL, -- 开始时间
end_time timestamp NULL, -- 结束时间
id_camera varchar(255) NOT NULL, -- 摄像头主属性
has_audio bool NULL, -- 是否有音频
CONSTRAINT pk_camera_record PRIMARY KEY (id_camera_record)
);
COMMENT ON TABLE public.camera_record IS '摄像头记录';
-- Column comments
COMMENT ON COLUMN public.camera_record.created IS '创建时间';
COMMENT ON COLUMN public.camera_record.temp_file_name IS '临时文件名称';
COMMENT ON COLUMN public.camera_record.fg_temp IS '临时文件标志';
COMMENT ON COLUMN public.camera_record.file_name IS '文件名称';
COMMENT ON COLUMN public.camera_record.fg_remove IS '文件删除标志';
COMMENT ON COLUMN public.camera_record.duration IS '文件时长: 单位:毫秒';
COMMENT ON COLUMN public.camera_record.start_time IS '开始时间';
COMMENT ON COLUMN public.camera_record.end_time IS '结束时间';
COMMENT ON COLUMN public.camera_record.id_camera IS '摄像头主属性';
COMMENT ON COLUMN public.camera_record.has_audio IS '是否有音频';

View File

@@ -21,9 +21,9 @@ server:
duration: 1440
remote:
server-ip: 127.0.0.1
port: 8089
client-id: demo
sign-secret: 123456
secret: 123456
port: 9089
client-code: demo
sign-secret: A012345678901234
secret: A012345678901234

View File

@@ -9,16 +9,17 @@ import (
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
)
func cameraAq(paramStr string) {
func cameraAq(commandMessage CommandMessage) {
paramStr := commandMessage.Param
condition := common.AqCondition{}
err := json.Unmarshal([]byte(paramStr), &condition)
if err != nil {
logs.Error("flvFileMediaInfo message format error: %v", err)
logs.Error("cameraAq message format error: %v", err)
return
}
conn, err := connectAndRegister("historyVideoPage")
conn, err := connectAndRegister("cameraAq", commandMessage.MessageId)
if err != nil {
logs.Error("historyVideoPage connect to server error: %v", err)
logs.Error("cameraAq connect to server error: %v", err)
return
}

View File

@@ -1,8 +1,6 @@
package tcpclient
import (
"bytes"
"encoding/binary"
"encoding/json"
"time"
@@ -15,13 +13,13 @@ func StartCommandReceiveServer() {
go func() {
for {
commandReceiveConnect()
<-time.NewTicker(1 * time.Minute).C
<-time.NewTicker(10 * time.Second).C
}
}()
}
func commandReceiveConnect() {
conn, err := connectAndRegister("keepChannel")
conn, err := connectAndRegister("keepChannel", "")
if err != nil {
logs.Error("keepChannel connect to server error: %v", err)
return
@@ -35,14 +33,8 @@ func commandReceiveConnect() {
logs.Error("read len error: %v", err)
break
}
var dataLen int32
buffer := bytes.NewBuffer(dataLenBytes)
err = binary.Read(buffer, binary.LittleEndian, &dataLen)
if err != nil {
logs.Error(err)
break
}
logs.Info("receive message dataLen: %d", dataLen)
dataLen := utils.BigEndianToUint32(dataLenBytes)
serverRepBytes := make([]byte, dataLen)
_, err = conn.Read(serverRepBytes)
if err != nil {
@@ -50,7 +42,7 @@ func commandReceiveConnect() {
break
}
secretCommandStr := string(serverRepBytes)
logs.Info("receive message: %s", secretCommandStr)
secretStr, err := config.String("server.remote.secret")
if err != nil {
logs.Error("get remote secret error: %v", err)
@@ -68,19 +60,24 @@ func commandReceiveConnect() {
continue
}
switch commandMessage.MessageType {
case "cameraAq":
cameraAq(commandMessage.Param)
case "historyVideoPage":
historyVideoPage(commandMessage.Param)
case "flvFileMediaInfo":
flvFileMediaInfo(commandMessage.Param)
case "flvPlay":
flvPlay(commandMessage.Param)
case "flvFetchMoreData":
flvFetchMoreData(commandMessage.Param)
default:
logs.Error("unsupport commandType: %s", commandMessage.MessageType)
}
// do response
go commandRes(commandMessage)
}
}
func commandRes(commandMessage CommandMessage) {
switch commandMessage.MessageType {
case "cameraAq":
cameraAq(commandMessage)
case "historyVideoPage":
historyVideoPage(commandMessage)
case "flvFileMediaInfo":
flvFileMediaInfo(commandMessage)
case "flvPlay":
flvPlay(commandMessage)
case "flvFetchMoreData":
flvFetchMoreData(commandMessage)
default:
logs.Error("unsupport commandType: %s", commandMessage.MessageType)
}
}

View File

@@ -17,22 +17,24 @@ type CommandMessage struct {
// "cameraAq" "historyVideoPage" "flvFileMediaInfo" "flvPlay" "flvFetchMoreData" "startPushRtmp" "stopPushRtmp"
MessageType string `json:"messageType"`
Param string `json:"param"`
MessageId string `json:"messageId"`
}
// when connect to server, first send register packet to server
type RegisterInfo struct {
ClientId string `json:"clientId"`
DateStr string `json:"dateStr"`
Sign string `json:"sign"`
ClientCode string `json:"clientCode"`
DateStr string `json:"dateStr"`
Sign string `json:"sign"`
// "keepChannel" "cameraAq" "historyVideoPage" "flvFileMediaInfo" "flvPlay" "flvFetchMoreData" "startPushRtmp" "stopPushRtmp"
ConnType string `json:"connType"`
ConnType string `json:"connType"`
MessageId string `json:"messageId"`
}
func newReisterInfo(connType string) (ri RegisterInfo, err error) {
func newReisterInfo(connType string, messageId string) (ri RegisterInfo, err error) {
currentDateStr := time.Now().Format(time.RFC3339)
clientId, err := config.String("server.remote.client-id")
clientCode, err := config.String("server.remote.client-code")
if err != nil {
logs.Error("get remote client-id error: %v\n", err)
logs.Error("get remote client-code error: %v\n", err)
return
}
signSecret, err := config.String("server.remote.sign-secret")
@@ -40,7 +42,7 @@ func newReisterInfo(connType string) (ri RegisterInfo, err error) {
logs.Error("get remote sign-secret error: %v\n", err)
return
}
planText := fmt.Sprintf("cilentId=%s&dateStr=%s", clientId, currentDateStr)
planText := fmt.Sprintf("clientCode=%s&dateStr=%s", clientCode, currentDateStr)
signStr, err := utils.EncryptAES([]byte(signSecret), planText)
if err != nil {
err = fmt.Errorf("buildSign error: %v", err)
@@ -48,15 +50,16 @@ func newReisterInfo(connType string) (ri RegisterInfo, err error) {
}
ri = RegisterInfo{
ClientId: clientId,
ConnType: connType,
DateStr: currentDateStr,
Sign: signStr,
ClientCode: clientCode,
ConnType: connType,
DateStr: currentDateStr,
Sign: signStr,
MessageId: messageId,
}
return
}
func connectAndRegister(connType string) (conn net.Conn, err error) {
func connectAndRegister(connType string, messageId string) (conn net.Conn, err error) {
serverIp, err := config.String("server.remote.server-ip")
if err != nil {
logs.Error("get remote server-ip error: %v. \n", err)
@@ -72,12 +75,9 @@ func connectAndRegister(connType string) (conn net.Conn, err error) {
logs.Error(err)
return
}
defer func() {
conn.Close()
}()
// register to server
ri, err := newReisterInfo(connType)
ri, err := newReisterInfo(connType, messageId)
if err != nil {
logs.Error(err)
return

View File

@@ -51,16 +51,17 @@ func (flvPush FlvPush) Write(p []byte) (n int, err error) {
return len(p), nil
}
func flvPlay(paramStr string) {
func flvPlay(commandMessage CommandMessage) {
paramStr := commandMessage.Param
playParam := PlayParam{}
err := json.Unmarshal([]byte(paramStr), &playParam)
if err != nil {
logs.Error("flvPlay message format error: %v", err)
return
}
conn, err := connectAndRegister("flvFileMediaInfo")
conn, err := connectAndRegister("flvPlay", commandMessage.MessageId)
if err != nil {
logs.Error("flvFileMediaInfo connect to server error: %v", err)
logs.Error("flvPlay connect to server error: %v", err)
return
}
camera_record, err := base_service.CameraRecordSelectById(playParam.IdCameraRecord)
@@ -79,7 +80,9 @@ func flvPlay(paramStr string) {
fileName = camera_record.TempFileName
}
ffr := fileflvreader.NewFileFlvReader(playParam.SeekSecond, conn, fileName)
flvPush := FlvPush{conn: conn}
ffr := fileflvreader.NewFileFlvReader(playParam.SeekSecond, flvPush, fileName)
_, ok := playerMap.Load(playParam.PlayerId)
if ok {
logs.Error("playerId: %s exists", playParam.PlayerId)

View File

@@ -14,14 +14,15 @@ type FetchMoreDataParam struct {
SeekSecond uint64 `json:"seekSecond"`
}
func flvFetchMoreData(paramStr string) {
func flvFetchMoreData(commandMessage CommandMessage) {
paramStr := commandMessage.Param
param := FetchMoreDataParam{}
err := json.Unmarshal([]byte(paramStr), &param)
if err != nil {
logs.Error("flvPlay message format error: %v", err)
logs.Error("flvFetchMoreData message format error: %v", err)
return
}
conn, err := connectAndRegister("flvFetchMoreData")
conn, err := connectAndRegister("flvFetchMoreData", commandMessage.MessageId)
if err != nil {
logs.Error("flvFetchMoreData connect to server error: %v", err)
return

View File

@@ -15,7 +15,8 @@ type FlvFileMediaInfoParam struct {
IdCameraRecord string `json:"idCameraRecord"`
}
func flvFileMediaInfo(paramStr string) {
func flvFileMediaInfo(commandMessage CommandMessage) {
paramStr := commandMessage.Param
param := FlvFileMediaInfoParam{}
err := json.Unmarshal([]byte(paramStr), &param)
if err != nil {
@@ -23,7 +24,7 @@ func flvFileMediaInfo(paramStr string) {
return
}
idCameraRecord := param.IdCameraRecord
conn, err := connectAndRegister("flvFileMediaInfo")
conn, err := connectAndRegister("flvFileMediaInfo", commandMessage.MessageId)
if err != nil {
logs.Error("flvFileMediaInfo connect to server error: %v", err)
return

View File

@@ -11,14 +11,15 @@ import (
base_service "github.com/hkmadao/rtsp2rtmp/src/rtsp2rtmp/web/service/base"
)
func historyVideoPage(paramStr string) {
func historyVideoPage(commandMessage CommandMessage) {
paramStr := commandMessage.Param
pageInfoInput := common.AqPageInfoInput{}
err := json.Unmarshal([]byte(paramStr), &pageInfoInput)
if err != nil {
logs.Error("flvFileMediaInfo message format error: %v", err)
logs.Error("historyVideoPage message format error: %v", err)
return
}
conn, err := connectAndRegister("historyVideoPage")
conn, err := connectAndRegister("historyVideoPage", commandMessage.MessageId)
if err != nil {
logs.Error("historyVideoPage connect to server error: %v", err)
return

View File

@@ -40,13 +40,18 @@ func Float64ToByteBigEndian(float float64) []byte {
func Int32ToByteBigEndian(number int32) []byte {
bytes := make([]byte, 4)
bytes[0] = byte(number >> (3 * 8))
bytes[0] = byte(number >> (2 * 8))
bytes[0] = byte(number >> (1 * 8))
bytes[0] = byte(number)
bytes[1] = byte(number >> (2 * 8))
bytes[2] = byte(number >> (1 * 8))
bytes[3] = byte(number)
return bytes
}
func BigEndianToUint32(bytes []byte) (dataLen uint32) {
dataLen = binary.BigEndian.Uint32(bytes)
return
}
func ByteToFloat64(bytes []byte) float64 {
bits := binary.LittleEndian.Uint64(bytes)