You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
1.8 KiB
Go
77 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/deepch/vdk/av"
|
|
)
|
|
|
|
//Segment struct
|
|
type Segment struct {
|
|
FPS int //Current fps
|
|
CurrentFragment *Fragment //CurrentFragment link
|
|
CurrentFragmentID int //CurrentFragment ID
|
|
Finish bool //Segment Ready
|
|
Duration time.Duration //Segment Duration
|
|
Time time.Time //Realtime EXT-X-PROGRAM-DATE-TIME
|
|
Fragment map[int]*Fragment //Fragment map
|
|
}
|
|
|
|
//NewSegment func
|
|
func (element *MuxerHLS) NewSegment() *Segment {
|
|
res := &Segment{
|
|
Fragment: make(map[int]*Fragment),
|
|
CurrentFragmentID: -1, //Default fragment -1
|
|
}
|
|
//Increase MSN
|
|
element.MSN++
|
|
element.Segments[element.MSN] = res
|
|
return res
|
|
}
|
|
|
|
//GetDuration func
|
|
func (element *Segment) GetDuration() time.Duration {
|
|
return element.Duration
|
|
}
|
|
|
|
//SetFPS func
|
|
func (element *Segment) SetFPS(fps int) {
|
|
element.FPS = fps
|
|
}
|
|
|
|
//WritePacket func
|
|
func (element *Segment) WritePacket(packet *av.Packet) {
|
|
if element.CurrentFragment == nil || element.CurrentFragment.GetDuration().Milliseconds() >= element.FragmentMS(element.FPS) {
|
|
if element.CurrentFragment != nil {
|
|
element.CurrentFragment.Close()
|
|
}
|
|
element.CurrentFragmentID++
|
|
element.CurrentFragment = element.NewFragment()
|
|
}
|
|
element.Duration += packet.Duration
|
|
element.CurrentFragment.WritePacket(packet)
|
|
}
|
|
|
|
//GetFragmentID func
|
|
func (element *Segment) GetFragmentID() int {
|
|
return element.CurrentFragmentID
|
|
}
|
|
|
|
//Close segment func
|
|
func (element *Segment) Close() {
|
|
element.Finish = true
|
|
if element.CurrentFragment != nil {
|
|
element.CurrentFragment.Close()
|
|
}
|
|
}
|
|
|
|
//FragmentMS func
|
|
func (element *Segment) FragmentMS(fps int) int64 {
|
|
for i := 6; i >= 1; i-- {
|
|
if fps%i == 0 {
|
|
return int64(float64(1000) / float64(fps) * float64(i))
|
|
}
|
|
}
|
|
return 100
|
|
}
|