doc: optimize resuse

This commit is contained in:
langhuihui
2025-09-12 17:47:44 +08:00
parent 50b36fd5ee
commit f69742e2d6
2 changed files with 57 additions and 32 deletions

View File

@@ -321,27 +321,40 @@ func (r *VideoFrame) Demux() error {
``` ```
**Scenario 2: SEI Insertion Processing** **Scenario 2: SEI Insertion Processing**
```go
func (t *Transformer) processVideo(video *format.H26xFrame) {
nalus := writer.VideoFrame.GetNalus()
SEI insertion achieves efficient processing through object reuse:
```go
func (t *Transformer) Run() (err error) {
allocator := util.NewScalableMemoryAllocator(1 << util.MinPowerOf2)
defer allocator.Recycle()
writer := m7s.NewPublisherWriter[*format.RawAudio, *format.H26xFrame](pub, allocator)
return m7s.PlayBlock(t.TransformJob.Subscriber,
func(video *format.H26xFrame) (err error) {
nalus := writer.VideoFrame.GetNalus() // Reuse NALU array
// Process each NALU, reuse NALU objects
for nalu := range video.Raw.(*pkg.Nalus).RangePoint { for nalu := range video.Raw.(*pkg.Nalus).RangePoint {
// Get reused NALU object
p := nalus.GetNextPointer() // Reuse object, auto Reset() p := nalus.GetNextPointer() // Reuse object, auto Reset()
mem := writer.VideoFrame.NextN(nalu.Size) mem := writer.VideoFrame.NextN(nalu.Size)
nalu.CopyTo(mem) nalu.CopyTo(mem)
// Handle SEI insertion // Insert SEI data
if seiCount > 0 { if len(seis) > 0 {
for _, sei := range seis { for _, sei := range seis {
p.Push(append([]byte{byte(codec.NALU_SEI)}, sei...)) p.Push(append([]byte{byte(codec.NALU_SEI)}, sei...))
} }
} }
p.PushOne(mem) p.PushOne(mem)
} }
return writer.NextVideo() // Reuse VideoFrame object
})
} }
``` ```
**Key Advantage**: Through `nalus.GetNextPointer()` reusing NALU objects, avoiding creating new objects for each NALU, significantly reducing GC pressure.
**Scenario 3: RTP Packet Processing** **Scenario 3: RTP Packet Processing**
```go ```go
func (r *VideoFrame) Demux() error { func (r *VideoFrame) Demux() error {

View File

@@ -321,27 +321,40 @@ func (r *VideoFrame) Demux() error {
``` ```
**场景2SEI插入处理** **场景2SEI插入处理**
```go
func (t *Transformer) processVideo(video *format.H26xFrame) {
nalus := writer.VideoFrame.GetNalus()
SEI插入通过对象复用实现高效处理
```go
func (t *Transformer) Run() (err error) {
allocator := util.NewScalableMemoryAllocator(1 << util.MinPowerOf2)
defer allocator.Recycle()
writer := m7s.NewPublisherWriter[*format.RawAudio, *format.H26xFrame](pub, allocator)
return m7s.PlayBlock(t.TransformJob.Subscriber,
func(video *format.H26xFrame) (err error) {
nalus := writer.VideoFrame.GetNalus() // 复用NALU数组
// 处理每个NALU复用NALU对象
for nalu := range video.Raw.(*pkg.Nalus).RangePoint { for nalu := range video.Raw.(*pkg.Nalus).RangePoint {
// 获取复用的NALU对象
p := nalus.GetNextPointer() // 复用对象自动Reset() p := nalus.GetNextPointer() // 复用对象自动Reset()
mem := writer.VideoFrame.NextN(nalu.Size) mem := writer.VideoFrame.NextN(nalu.Size)
nalu.CopyTo(mem) nalu.CopyTo(mem)
// 处理SEI插入 // 插入SEI数据
if seiCount > 0 { if len(seis) > 0 {
for _, sei := range seis { for _, sei := range seis {
p.Push(append([]byte{byte(codec.NALU_SEI)}, sei...)) p.Push(append([]byte{byte(codec.NALU_SEI)}, sei...))
} }
} }
p.PushOne(mem) p.PushOne(mem)
} }
return writer.NextVideo() // 复用VideoFrame对象
})
} }
``` ```
**关键优势**:通过`nalus.GetNextPointer()`复用NALU对象避免为每个NALU创建新对象显著降低GC压力。
**场景3RTP包处理** **场景3RTP包处理**
```go ```go
func (r *VideoFrame) Demux() error { func (r *VideoFrame) Demux() error {
@@ -697,7 +710,6 @@ func pullFLVNew(publisher *Publisher, file *os.File) {
} }
} }
``` ```
## 7. 总结 ## 7. 总结
### 7.1 核心优势 ### 7.1 核心优势