修复拉流恢复失败问题

This commit is contained in:
yangjiechina
2024-12-01 11:36:55 +08:00
parent 92bd005fc4
commit 1e1408db19
3 changed files with 20 additions and 10 deletions

View File

@@ -2,6 +2,7 @@ package hls
import (
"fmt"
"github.com/lkmio/avformat/utils"
"github.com/lkmio/lkm/log"
"github.com/lkmio/lkm/stream"
"strings"
@@ -23,6 +24,9 @@ type M3U8Sink struct {
// SendM3U8Data 首次向拉流端应答M3U8文件 后续更新M3U8文件, 通过调用@see GetPlaylist 函数获取最新的M3U8文件.
func (s *M3U8Sink) SendM3U8Data(data *string) error {
utils.Assert(data != nil)
utils.Assert(s.playlistFormat == nil)
s.playlistFormat = data
s.cb([]byte(s.GetPlaylist()))
@@ -48,9 +52,12 @@ func (s *M3U8Sink) SendM3U8Data(data *string) error {
}
func (s *M3U8Sink) StartStreaming(transStream stream.TransStream) error {
hls := transStream.(*TransStream)
if s.playlistFormat != nil {
return nil
}
if hls.M3U8Writer.Size() > 0 {
hls := transStream.(*TransStream)
if hls.M3U8Writer.Size() > 0 && s.playlistFormat == nil {
if err := s.SendM3U8Data(hls.PlaylistFormat); err != nil {
return err
}

View File

@@ -24,6 +24,10 @@ type Sink struct {
}
func (s *Sink) StartStreaming(transStream stream.TransStream) error {
if s.peer != nil {
return nil
}
// 创建PeerConnection
var remoteTrack *webrtc.TrackLocalStaticSample
s.tracks = make([]*webrtc.TrackLocalStaticSample, transStream.TrackCount())
@@ -107,7 +111,6 @@ func (s *Sink) StartStreaming(transStream stream.TransStream) error {
// offer的sdp, 应答给http请求
if s.cb != nil {
s.cb(connection.LocalDescription().SDP)
s.cb = nil
}
return nil
}

View File

@@ -22,20 +22,20 @@ type Sink struct {
stream.BaseSink
senders []*librtp.RtpSender // 一个rtsp源, 可能存在多个流, 每个流都需要拉取
sdpCb func(sdp string) // sdp回调, 响应describe
cb func(sdp string) // sdp回调, 响应describe
}
func (s *Sink) StartStreaming(transStream stream.TransStream) error {
if s.senders == nil {
s.senders = make([]*librtp.RtpSender, transStream.TrackCount())
utils.Assert(transStream.TrackCount() > 0)
if s.senders != nil {
return nil
}
s.senders = make([]*librtp.RtpSender, transStream.TrackCount())
// sdp回调给sink, sink应答给describe请求
if s.sdpCb != nil {
s.sdpCb(transStream.(*TransStream).sdp)
s.sdpCb = nil
if s.cb != nil {
s.cb(transStream.(*TransStream).sdp)
}
return nil
}