修复hls拉流卡住问题

This commit is contained in:
yangjiechina
2024-07-16 23:02:05 +08:00
parent b677e4ff43
commit 21c4512b3a
2 changed files with 26 additions and 15 deletions

View File

@@ -116,6 +116,10 @@ func (t *transStream) onTSAlloc(size int) []byte {
}
func (t *transStream) flushSegment(end bool) error {
defer func() {
t.context.segmentSeq++
}()
//将剩余数据写入缓冲区
if t.context.writeBufferSize > 0 {
_, _ = t.context.file.Write(t.context.writeBuffer[:t.context.writeBufferSize])
@@ -135,7 +139,6 @@ func (t *transStream) flushSegment(end bool) error {
duration := float32(t.muxer.Duration()) / 90000
t.m3u8.AddSegment(duration, t.context.url, t.context.segmentSeq, t.context.path)
if _, err := t.m3u8File.Seek(0, 0); err != nil {
return err
}
@@ -165,25 +168,33 @@ func (t *transStream) flushSegment(end bool) error {
// 创建一个新的ts切片
func (t *transStream) createSegment() error {
t.muxer.Reset()
defer func() {
t.context.segmentSeq++
}()
tsName := fmt.Sprintf(t.tsFormat, t.context.segmentSeq)
//ts文件
t.context.path = fmt.Sprintf("%s/%s", t.dir, tsName)
//m3u8列表中切片的url
t.context.url = fmt.Sprintf("%s%s", t.tsUrl, tsName)
var tsFile *os.File
for {
tsName := fmt.Sprintf(t.tsFormat, t.context.segmentSeq)
//ts文件
t.context.path = fmt.Sprintf("%s/%s", t.dir, tsName)
//m3u8列表中切片的url
t.context.url = fmt.Sprintf("%s%s", t.tsUrl, tsName)
file, err := os.OpenFile(t.context.path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
if err == nil {
tsFile = file
break
}
file, err := os.OpenFile(t.context.path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0666)
if err != nil {
log.Sugar.Errorf("创建ts切片文件失败 err:%s path:%s", err.Error(), t.context.path)
return err
if os.IsPermission(err) || os.IsTimeout(err) || os.IsNotExist(err) {
return err
}
//继续创建, 认为是文件名冲突, 并且文件已经被打开.
t.context.segmentSeq++
}
t.context.file = file
t.context.file = tsFile
_ = t.muxer.WriteHeader()
return err
return nil
}
func (t *transStream) Close() error {

View File

@@ -122,7 +122,7 @@ func (m *m3u8Writer) ToString() string {
m.stringBuffer.WriteString("#EXT-X-TARGETDURATION:")
m.stringBuffer.WriteString(strconv.Itoa(m.targetDuration()))
m.stringBuffer.WriteString("\r\n")
m.stringBuffer.WriteString("#Ext-X-MEDIA-SEQUENCE:")
m.stringBuffer.WriteString("#EXT-X-MEDIA-SEQUENCE:")
m.stringBuffer.WriteString(strconv.Itoa(head[0].(Segment).sequence))
m.stringBuffer.WriteString("\r\n")