Added new functions.
This commit is contained in:
parent
a11ba13ae8
commit
ca6ff10458
@ -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.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user