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**
SEI insertion achieves efficient processing through object reuse:
```go
func (t *Transformer) processVideo(video *format.H26xFrame) {
nalus := writer.VideoFrame.GetNalus()
func (t *Transformer) Run() (err error) {
allocator := util.NewScalableMemoryAllocator(1 << util.MinPowerOf2)
defer allocator.Recycle()
writer := m7s.NewPublisherWriter[*format.RawAudio, *format.H26xFrame](pub, allocator)
for nalu := range video.Raw.(*pkg.Nalus).RangePoint {
// Get reused NALU object
p := nalus.GetNextPointer() // Reuse object, auto Reset()
mem := writer.VideoFrame.NextN(nalu.Size)
nalu.CopyTo(mem)
// Handle SEI insertion
if seiCount > 0 {
for _, sei := range seis {
p.Push(append([]byte{byte(codec.NALU_SEI)}, sei...))
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 {
p := nalus.GetNextPointer() // Reuse object, auto Reset()
mem := writer.VideoFrame.NextN(nalu.Size)
nalu.CopyTo(mem)
// Insert SEI data
if len(seis) > 0 {
for _, sei := range seis {
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**
```go
func (r *VideoFrame) Demux() error {

View File

@@ -321,27 +321,40 @@ func (r *VideoFrame) Demux() error {
```
**场景2SEI插入处理**
SEI插入通过对象复用实现高效处理
```go
func (t *Transformer) processVideo(video *format.H26xFrame) {
nalus := writer.VideoFrame.GetNalus()
func (t *Transformer) Run() (err error) {
allocator := util.NewScalableMemoryAllocator(1 << util.MinPowerOf2)
defer allocator.Recycle()
writer := m7s.NewPublisherWriter[*format.RawAudio, *format.H26xFrame](pub, allocator)
for nalu := range video.Raw.(*pkg.Nalus).RangePoint {
// 获取复用的NALU对象
p := nalus.GetNextPointer() // 复用对象自动Reset()
mem := writer.VideoFrame.NextN(nalu.Size)
nalu.CopyTo(mem)
// 处理SEI插入
if seiCount > 0 {
for _, sei := range seis {
p.Push(append([]byte{byte(codec.NALU_SEI)}, sei...))
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 {
p := nalus.GetNextPointer() // 复用对象自动Reset()
mem := writer.VideoFrame.NextN(nalu.Size)
nalu.CopyTo(mem)
// 插入SEI数据
if len(seis) > 0 {
for _, sei := range seis {
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包处理**
```go
func (r *VideoFrame) Demux() error {
@@ -697,7 +710,6 @@ func pullFLVNew(publisher *Publisher, file *os.File) {
}
}
```
## 7. 总结
### 7.1 核心优势
@@ -724,4 +736,4 @@ func pullFLVNew(publisher *Publisher, file *os.File) {
- 高频数据处理
- 对延迟敏感的应用
通过合理应用这些技术,可以显著提升系统的性能和稳定性,为高并发、低延迟的流媒体应用提供坚实的技术基础。
通过合理应用这些技术,可以显著提升系统的性能和稳定性,为高并发、低延迟的流媒体应用提供坚实的技术基础。