}
var (
- cu int
- keyframe []byte
+ cu int
+ haveKeyframe bool
+ keyframe []byte
)
for cu < len(buf) {
break
}
moofI = cu + moofI - 4
- cu = moofI
moofE := moofI + int(F.Btoi(buf, moofI, 4))
if moofE > len(buf) {
break
}
+ cu = moofI
var (
iskeyFrame bool
break
}
trafI = cu + trafI - 4
- cu = trafI
trafE := trafI + int(F.Btoi(buf, trafI, 4))
if trafE > moofE {
break
}
+ cu = trafI
//tfhd
tfhdI := bytes.Index(buf[cu:], []byte("tfhd"))
break
}
tfhdI = cu + tfhdI - 4
- cu = tfhdI
tfhdE := tfhdI + int(F.Btoi(buf, tfhdI, 4))
if tfhdE > trafE {
err = errors.New("tfhd包破损")
break
}
+ cu = tfhdI
//tfdt
tfdtI := bytes.Index(buf[cu:], []byte("tfdt"))
break
}
tfdtI = cu + tfdtI - 4
- cu = tfdtI
tfdtE := tfdtI + int(F.Btoi(buf, tfdtI, 4))
if tfdtE > trafE {
err = errors.New("tfdt包破损")
break
}
+ cu = tfdtI
//trun
trunI := bytes.Index(buf[cu:], []byte("trun"))
break
}
trunI = cu + trunI - 4
- cu = trunI
trunE := trunI + int(F.Btoi(buf, trunI, 4))
if trunE > trafE {
err = errors.New("trun包破损")
break
}
+ cu = trunI
var (
timeStamp int
}
if iskeyFrame {
- last_avilable_offset = moofI - 1
+ haveKeyframe = true
+ last_avilable_offset = moofI
if len(keyframe) != 0 {
keyframes = append(keyframes, keyframe)
}
break
}
mdatI = cu + mdatI - 4
- cu = mdatI
mdatE := mdatI + int(F.Btoi(buf, mdatI, 4))
if mdatE > len(buf) {
// err = errors.New("mdat包破损")
break
}
+ cu = mdatI
+
+ if !iskeyFrame && !haveKeyframe {
+ // 之前并没有关键帧,丢弃
+ last_avilable_offset = cu
+ continue
+ }
keyframe = append(keyframe, buf[moofI:mdatE]...)
}
if cu == 0 {
err = errors.New("未找到moof")
}
- if last_avilable_offset == 0 && len(buf) > 1024*1024*20 {
+ if len(buf) > 1024*1024*20 {
err = errors.New("buf超过20M")
}
return