You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.2 KiB
51 lines
1.2 KiB
2 years ago
|
package extend
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"m7s.live/engine/v4/codec"
|
||
|
"m7s.live/engine/v4/common"
|
||
|
"m7s.live/engine/v4/track"
|
||
|
"m7s.live/engine/v4/util"
|
||
|
"net"
|
||
|
)
|
||
|
|
||
|
func ReadRing(vt *track.Video) *common.RingBuffer[common.AVFrame] {
|
||
|
return util.Clone(vt.Media.RingBuffer)
|
||
|
}
|
||
|
|
||
|
func Read(r *common.RingBuffer[common.AVFrame], ctx context.Context) (item *common.AVFrame) {
|
||
|
for item = &r.Value; ctx.Err() == nil && !item.CanRead; {
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// PlayFullAnnexB 订阅annex-b格式的流数据,每一个I帧增加sps、pps头
|
||
|
func PlayFullAnnexB(vt *track.Video, ctx context.Context, onMedia func(net.Buffers) error) error {
|
||
|
for vr := ReadRing(vt); ctx.Err() == nil; vr.MoveNext() {
|
||
|
vp := Read(vr, ctx)
|
||
|
var data net.Buffers
|
||
|
if vp.IFrame {
|
||
|
for _, nalu := range vt.ParamaterSets {
|
||
|
data = append(data, codec.NALU_Delimiter2, nalu)
|
||
|
}
|
||
|
}
|
||
|
data = append(data, codec.NALU_Delimiter2)
|
||
|
|
||
|
i := 0
|
||
|
vp.AUList.Range(func(au *util.BLL) bool {
|
||
|
if i > 0 {
|
||
|
data = append(data, codec.NALU_Delimiter1, au.ToBytes())
|
||
|
} else {
|
||
|
data = append(data, au.ToBuffers()...)
|
||
|
}
|
||
|
i++
|
||
|
return true
|
||
|
})
|
||
|
if err := onMedia(data); err != nil {
|
||
|
// TODO: log err
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
return ctx.Err()
|
||
|
}
|