Added new functions.

This commit is contained in:
Сергей Петров 2025-04-09 17:38:15 +05:00
parent a11ba13ae8
commit ca6ff10458

View File

@ -399,39 +399,79 @@ func FileBytes(id, res, file string) (int64, error) {
return size, nil return size, nil
} }
// GetHeader // GetDurAndTracks reads .insit file and returns duration and tracks of the file.
func GetHeader(id, res, file string) ([]string, error) { func GetDurAndTracks(id, res, file string) (int, map[string]string, error) {
// Open file for reading. // Open file for reading.
f, err := os.Open(fmt.Sprintf("%s/%s/%s/%s", config.DirData, id, res, file)) f, err := os.Open(fmt.Sprintf("%s/%s/%s/%s", config.DirData, id, res, file))
if err != nil { if err != nil {
return nil, errors.New("opening file error for file: " + err.Error()) return 0, nil, errors.New("opening file error for file: " + err.Error())
} }
defer f.Close() defer f.Close()
// Read StreamID. // Read StreamID.
var streamIDLen int32 var streamIDLen int32
if err := binary.Read(f, binary.LittleEndian, &streamIDLen); err != nil { if err := binary.Read(f, binary.LittleEndian, &streamIDLen); err != nil {
return nil, errors.New("reading StreamID length error: " + err.Error()) return 0, nil, errors.New("reading StreamID length error: " + err.Error())
} }
streamIDBytes := make([]byte, streamIDLen) streamIDBytes := make([]byte, streamIDLen)
if _, err := io.ReadFull(f, streamIDBytes); err != nil { if _, err := io.ReadFull(f, streamIDBytes); err != nil {
return nil, errors.New("reading StreamID error: " + err.Error()) return 0, nil, errors.New("reading StreamID error: " + err.Error())
} }
// Read header of the file. // Read header of the file.
var segLen int32 var segLen int32
if err := binary.Read(f, binary.LittleEndian, &segLen); err != nil { if err := binary.Read(f, binary.LittleEndian, &segLen); err != nil {
return nil, errors.New("reading header length error: " + err.Error()) return 0, nil, errors.New("reading header length error: " + err.Error())
} }
segData := make([]byte, segLen) segData := make([]byte, segLen)
if _, err := io.ReadFull(f, segData); err != nil { if _, err := io.ReadFull(f, segData); err != nil {
return nil, errors.New("reading header error: " + err.Error()) return 0, nil, errors.New("reading header error: " + err.Error())
} }
headerReader := bytes.NewReader(segData) headerReader := bytes.NewReader(segData)
headerSeg, err := ReadHeaderSegment(headerReader) headerSeg, err := ReadHeaderSegment(headerReader)
if err != nil { if err != nil {
return nil, errors.New("reading header error: " + err.Error()) return 0, nil, errors.New("reading header error: " + err.Error())
} }
// Parse duration of a segment.
per, err := strconv.Atoi(headerSeg.Duration)
if err != nil {
return 0, nil, errors.New("parsing duration error: " + err.Error())
}
tracks := make(map[string]string, 2)
for {
// Read segments length.
var segLen int32
err := binary.Read(f, binary.LittleEndian, &segLen)
if err != nil {
if err == io.EOF {
break
}
return 0, nil, errors.New("read segments length error: " + err.Error())
}
// Read segments data.
segData = make([]byte, segLen)
if _, err := io.ReadFull(f, segData); err != nil {
return 0, nil, errors.New("read segments error: " + err.Error())
}
packetReader := bytes.NewReader(segData)
packets, err := ReadPacketSegment(packetReader)
if err != nil {
return 0, nil, errors.New("func readPacketSegment error: " + err.Error())
}
for _, pkt := range packets {
switch pkt.Type {
case PacketTypeH264:
tracks["video"] = "H264"
case PacketTypeLPCM:
tracks["audio"] = "LPCM"
}
}
}
return per, tracks, nil
} }
// readString reads string length and then reads string data. // readString reads string length and then reads string data.