修复拉流恢复失败问题

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

View File

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

View File

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