From f69742e2d645a330506fe644a15d13c0760c0f94 Mon Sep 17 00:00:00 2001 From: langhuihui <178529795@qq.com> Date: Fri, 12 Sep 2025 17:47:44 +0800 Subject: [PATCH] doc: optimize resuse --- doc/arch/reuse.md | 43 ++++++++++++++++++++++++++--------------- doc_CN/arch/reuse.md | 46 ++++++++++++++++++++++++++++---------------- 2 files changed, 57 insertions(+), 32 deletions(-) diff --git a/doc/arch/reuse.md b/doc/arch/reuse.md index 408a1a0..9165470 100644 --- a/doc/arch/reuse.md +++ b/doc/arch/reuse.md @@ -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 { diff --git a/doc_CN/arch/reuse.md b/doc_CN/arch/reuse.md index 4a8c784..1081905 100644 --- a/doc_CN/arch/reuse.md +++ b/doc_CN/arch/reuse.md @@ -321,27 +321,40 @@ func (r *VideoFrame) Demux() error { ``` **场景2:SEI插入处理** + +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压力。 + **场景3:RTP包处理** ```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) { - 高频数据处理 - 对延迟敏感的应用 -通过合理应用这些技术,可以显著提升系统的性能和稳定性,为高并发、低延迟的流媒体应用提供坚实的技术基础。 \ No newline at end of file +通过合理应用这些技术,可以显著提升系统的性能和稳定性,为高并发、低延迟的流媒体应用提供坚实的技术基础。