feat: 支持国标倍速播放

This commit is contained in:
ydajiang
2025-09-14 21:39:50 +08:00
parent a5b7fc6f24
commit ef313b1ea4
3 changed files with 33 additions and 19 deletions

9
api.go
View File

@@ -131,10 +131,11 @@ func startApiServer(addr string) {
apiServer.router.HandleFunc("/api/v1/streams/statistics", nil) // 统计所有推拉流
if stream.AppConfig.GB28181.Enable {
apiServer.router.HandleFunc("/ws/v1/gb28181/talk", apiServer.OnGBTalk) // 对讲的主讲人WebSocket连接
apiServer.router.HandleFunc("/api/v1/control/ws-talk/{device}/{channel}", apiServer.OnGBTalk) // 对讲的主讲人WebSocket连接
apiServer.router.HandleFunc("/api/v1/gb28181/source/create", withJsonParams(apiServer.OnGBOfferCreate, &SourceSDP{}))
apiServer.router.HandleFunc("/api/v1/gb28181/answer/set", withJsonParams(apiServer.OnGBSourceConnect, &SourceSDP{})) // 应答sdp, 如果是active模式拉流, 设置对方的地址. 下载文件设置文件大小
apiServer.router.HandleFunc("/ws/v1/gb28181/talk", apiServer.OnGBTalk) // 对讲的主讲人WebSocket连接
apiServer.router.HandleFunc("/api/v1/control/ws-talk/{device}/{channel}", apiServer.OnGBTalk) // 对讲的主讲人WebSocket连接
apiServer.router.HandleFunc("/api/v1/gb28181/source/create", withJsonParams(apiServer.OnGBOfferCreate, &SourceSDP{})) // 创建国标源
apiServer.router.HandleFunc("/api/v1/gb28181/answer/set", withJsonParams(apiServer.OnGBSourceConnect, &SourceSDP{})) // 设置应答sdp, 如果是active模式拉流, 设置对方的地址. 下载文件设置文件大小
apiServer.router.HandleFunc("/api/v1/gb28181/speed/set", withJsonParams(apiServer.OnGBSpeedSet, &SourceSDP{}))
}
apiServer.router.HandleFunc("/api/v1/gc/force", func(writer http.ResponseWriter, request *http.Request) {

View File

@@ -24,20 +24,20 @@ const (
)
type SDP struct {
SessionName string `json:"session_name,omitempty"` // play/download/playback/talk/broadcast
Addr string `json:"addr,omitempty"` // 连接地址
SSRC string `json:"ssrc,omitempty"`
Setup string `json:"setup,omitempty"` // active/passive
Transport string `json:"transport,omitempty"` // tcp/udp
Speed int `json:"speed,omitempty"`
StartTime int `json:"start_time,omitempty"`
EndTime int `json:"end_time,omitempty"`
FileSize int `json:"file_size,omitempty"`
SessionName string `json:"session_name,omitempty"` // play/download/playback/talk/broadcast
Addr string `json:"addr,omitempty"` // 连接地址
SSRC string `json:"ssrc,omitempty"`
Setup string `json:"setup,omitempty"` // active/passive
Transport string `json:"transport,omitempty"` // tcp/udp
Speed float64 `json:"speed,omitempty"`
StartTime int `json:"start_time,omitempty"`
EndTime int `json:"end_time,omitempty"`
FileSize int `json:"file_size,omitempty"`
}
type DownloadInfo struct {
PlaybackDuration int // 回放/下载时长
PlaybackSpeed int // 回放/下载速度
PlaybackSpeed float64 // 回放/下载速度
PlaybackFileURL string // 回放/下载文件URL
PlaybackStartTime string // 回放/下载开始时间
PlaybackEndTime string // 回放/下载结束时间
@@ -370,3 +370,16 @@ func (api *ApiServer) OnLiveGBSTalk(w http.ResponseWriter, r *http.Request) {
talkSource.Close()
}
func (api *ApiServer) OnGBSpeedSet(v *SourceSDP, w http.ResponseWriter, r *http.Request) {
source := stream.SourceManager.Find(v.Source)
if source == nil {
w.WriteHeader(http.StatusBadRequest)
httpResponseError(w, "stream not found")
} else if stream.SourceType28181 != source.GetType() {
w.WriteHeader(http.StatusBadRequest)
httpResponseError(w, "stream type not support")
} else if gbSource := Source2GBSource(source); gbSource != nil {
gbSource.SetSpeed(v.Speed)
}
}

View File

@@ -80,7 +80,7 @@ type GBSource interface {
SetTransport(transport transport.Transport)
GetDuration() int
GetSpeed() int
GetSpeed() float64
GetSessionName() string
GetStartTime() string
GetEndTime() string
@@ -88,7 +88,7 @@ type GBSource interface {
GetPlaybackProgress() float64
SetDuration(duration int)
SetSpeed(speed int)
SetSpeed(speed float64)
SetSessionName(sessionName string)
SetStartTime(startTime string)
SetEndTime(endTime string)
@@ -112,7 +112,7 @@ type BaseGBSource struct {
sessionName string // play/playback/download...
duration int // 回放/下载时长, 单位秒
speed int // 回放/下载速度
speed float64 // 回放/下载速度
startTime string // 回放/下载开始时间
endTime string // 回放/下载结束时间
fileSize int // 回放/下载文件大小
@@ -345,7 +345,7 @@ func (source *BaseGBSource) GetDuration() int {
return source.duration
}
func (source *BaseGBSource) GetSpeed() int {
func (source *BaseGBSource) GetSpeed() float64 {
return source.speed
}
@@ -353,7 +353,7 @@ func (source *BaseGBSource) SetDuration(duration int) {
source.duration = duration
}
func (source *BaseGBSource) SetSpeed(speed int) {
func (source *BaseGBSource) SetSpeed(speed float64) {
source.speed = speed
}