mirror of
https://github.com/kerberos-io/agent.git
synced 2026-10-19 17:38:25 +00:00
align fragmentation time scale + upgrade to new joy4
This commit is contained in:
@@ -120,8 +120,6 @@ func HandleRecordStream(queue *pubsub.Queue, configuration *models.Configuration
|
||||
// Cleanup muxer
|
||||
start = false
|
||||
myMuxer = nil
|
||||
runtime.GC()
|
||||
debug.FreeOSMemory()
|
||||
|
||||
recordingStatus = "idle"
|
||||
|
||||
@@ -233,8 +231,6 @@ func HandleRecordStream(queue *pubsub.Queue, configuration *models.Configuration
|
||||
// Cleanup muxer
|
||||
start = false
|
||||
myMuxer = nil
|
||||
runtime.GC()
|
||||
debug.FreeOSMemory()
|
||||
|
||||
recordingStatus = "idle"
|
||||
}
|
||||
|
||||
+107
-1
@@ -252,7 +252,8 @@ func RandStringBytesRmndr(n int) string {
|
||||
func CreateFragmentedMP4(fullName string, fragmentedDuration int64) {
|
||||
path, _ := os.Getwd()
|
||||
duration := fragmentedDuration * 1000
|
||||
cmd := exec.Command("mp4fragment", "--fragment-duration", strconv.FormatInt(duration, 10), fullName, fullName+"f.mp4")
|
||||
// This timescale is crucial, as it should be the same as the one defined in JOY4.
|
||||
cmd := exec.Command("mp4fragment", "--timescale", "10000", "--fragment-duration", strconv.FormatInt(duration, 10), fullName, fullName+"f.mp4")
|
||||
cmd.Dir = path
|
||||
log.Log.Info(cmd.String())
|
||||
var out bytes.Buffer
|
||||
@@ -270,3 +271,108 @@ func CreateFragmentedMP4(fullName string, fragmentedDuration int64) {
|
||||
os.Remove(fullName)
|
||||
os.Rename(fullName+"f.mp4", fullName)
|
||||
}
|
||||
|
||||
/*func FloatToString(input_num float64) string {
|
||||
// to convert a float number to a string
|
||||
return strconv.FormatFloat(input_num, 'f', 6, 64)
|
||||
}
|
||||
|
||||
func ParseFMP4(file *bytes.Reader) (error, uint64, uint64, []*mp4.MediaSegment, uint64) {
|
||||
var ftypSize, moovSize uint64
|
||||
var segments []*mp4.MediaSegment
|
||||
var duration uint64
|
||||
parsedMp4, err := mp4.DecodeFile(file, mp4.WithDecodeMode(mp4.DecModeLazyMdat))
|
||||
if parsedMp4 != nil && parsedMp4.Init != nil && err == nil {
|
||||
ftypSize = parsedMp4.Init.Ftyp.Size()
|
||||
moovSize = parsedMp4.Init.Moov.Size()
|
||||
duration = parsedMp4.Moov.Trak.Tkhd.Duration
|
||||
segments = parsedMp4.Segments
|
||||
}
|
||||
return err, ftypSize, moovSize, segments, duration
|
||||
}
|
||||
|
||||
func ParseFMP4Detail(fullName string) {
|
||||
|
||||
// open fullName
|
||||
file, err := os.Open(fullName)
|
||||
if err != nil {
|
||||
log.Log.Error("Error opening file: " + err.Error())
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
fileBytes, err := ioutil.ReadAll(file)
|
||||
if err != nil {
|
||||
log.Log.Error("Error reading file: " + err.Error())
|
||||
}
|
||||
fileReader := bytes.NewReader(fileBytes)
|
||||
|
||||
err, ftypSize, moovSize, segments, dur := ParseFMP4(fileReader)
|
||||
fmt.Println("========== Fragmented details =================")
|
||||
fmt.Println(dur)
|
||||
fmt.Println(ftypSize)
|
||||
fmt.Println(moovSize)
|
||||
fmt.Println(len(segments))
|
||||
|
||||
// Calculate duration of segments
|
||||
var totalDuration uint64
|
||||
for _, segment := range segments {
|
||||
fragments := segment.Fragments
|
||||
|
||||
for _, fragment := range fragments {
|
||||
var sampleDuration uint32
|
||||
samples := fragment.Moof.Traf.Trun.Samples
|
||||
for _, sample := range samples {
|
||||
sampleDuration += sample.Dur
|
||||
}
|
||||
fmt.Println(sampleDuration)
|
||||
totalDuration += uint64(sampleDuration)
|
||||
}
|
||||
}
|
||||
|
||||
misingDuration := dur - totalDuration/100
|
||||
fmt.Println(misingDuration)
|
||||
fmt.Println(totalDuration/100 + misingDuration)
|
||||
}
|
||||
|
||||
func CreateFragmentByteRanges(log log.Logging, fileName string, ftypSize uint64, moovSize uint64, segments []*mp4.MediaSegment) (string, []models.BytesRangeOnTime) {
|
||||
size := strconv.FormatInt(int64(ftypSize+moovSize), 10)
|
||||
|
||||
var fileFragments strings.Builder
|
||||
fileFragments.WriteString("#EXT-X-MAP:URI=\"" + fileName + "\",BYTERANGE=\"" + size + "@0\"\n")
|
||||
|
||||
var bytesRangeOnTime []models.BytesRangeOnTime
|
||||
var currentTime uint32
|
||||
for _, segment := range segments {
|
||||
fragments := segment.Fragments
|
||||
for _, fragment := range fragments {
|
||||
var sampleDuration uint32
|
||||
samples := fragment.Moof.Traf.Trun.Samples
|
||||
for _, sample := range samples {
|
||||
sampleDuration += sample.Dur
|
||||
}
|
||||
currentTime = currentTime + sampleDuration
|
||||
duration := FloatToString(float64(sampleDuration / 100000))
|
||||
|
||||
startPos := fragment.Moof.StartPos
|
||||
start := strconv.FormatInt(int64(startPos), 10)
|
||||
|
||||
totalSize := fragment.Mdat.Size() + fragment.Moof.Size()
|
||||
size := strconv.FormatInt(int64(totalSize), 10)
|
||||
|
||||
fileFragments.WriteString("#EXTINF:" + duration + ",\n") // @TODO calculate the duration
|
||||
fileFragments.WriteString("#EXT-X-BYTERANGE:" + size + "@" + start + "\n")
|
||||
fileFragments.WriteString(fileName + "\n")
|
||||
|
||||
byteRange := models.BytesRangeOnTime{
|
||||
Duration: duration,
|
||||
Time: FloatToString(float64(currentTime) / 100000),
|
||||
Range: size + "@" + start,
|
||||
}
|
||||
bytesRangeOnTime = append(bytesRangeOnTime, byteRange)
|
||||
}
|
||||
}
|
||||
|
||||
bytesRanges := fileFragments.String()
|
||||
log.Info("Fragments calculate from " + fileName + ": " + bytesRanges)
|
||||
return bytesRanges, bytesRangeOnTime
|
||||
}*/
|
||||
|
||||
Reference in New Issue
Block a user