class D2,E111,E211,E311 libfunc class E212,E312 newfunc
Start
在record页面onload调用recorder.startNative
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
graph TD A["startNative"] --- B["RecorderNative::Start"] B --- C["Recorder.Start"] C --- D1["muxer_->Start"] C --- D2["videoEncoder_->Start"] C --- D3["EncOutputThread"] C --- D4["Audio"] D1 --- D11[OH_AVMuxer_Start] D2 --- D21[OH_VideoEncoder_Start] D4 --- D41["AudioCapturerStart"] D4 --- D42["audioEncoder->Start"] D4 --- D43["AudioEncInputThread"] D4 --- D44["AudioEncOutputThread"]
classDef libfunc fill:#4CAF50,stroke:#388E3C,stroke-width:2px; class D11,D21 libfunc
1 2 3 4 5 6 7 8 9 10 11 12 13
graph TD A["EncOutputThread"] --- Z["循环体"] A --- D[StartRelease] subgraph 循环 Z --- B["muxer_->WriteSample"] Z ---|传入pop出的bufferInfo的bufferIndex| C["videoEncoder_->FreeOutputBuffer"] C --- |将处理后的index对应的OH_AVBuffer退回给编码器|C1["OH_VideoEncoder_FreeOutputBuffer"] B --- B1["OH_AVBuffer_SetBufferAttr"] B --- |将sample写入muxer封装器对应视频轨道|B2["OH_AVMuxer_WriteSampleBuffer"] end classDef libfunc fill:#4CAF50,stroke:#388E3C,stroke-width:2px;
class C1,B1,B2 libfunc
1 2 3 4 5 6 7 8 9 10 11
graph TD A["AudioEncInputThread"] --- Z["循环体"] subgraph 循环 Z --- B[audioEncContext_->ReadCache] Z --- C[audioEncoder_->PushInputData] C --- C1[OH_AVBuffer_SetBufferAttr] C --- C2[OH_AudioCodec_PushInputBuffer] end classDef libfunc fill:#4CAF50,stroke:#388E3C,stroke-width:2px;
class C1,C2 libfunc
1 2 3 4 5 6 7 8 9 10 11 12 13
graph TD A["AudioEncOutputThread"] --- Z["循环体"] A --- D[StartRelease] subgraph 循环 Z --- B["muxer_->WriteSample"] Z ---|传入pop出的bufferInfo的bufferIndex| C["audioEncoder_->FreeOutputData"] C --- |将处理后的index对应的OH_AVBuffer退回给编码器|C1["OH_AudioCodec_FreeOutputBuffer"] B --- B1["OH_AVBuffer_SetBufferAttr"] B --- |将sample写入muxer封装器对应视频轨道|B2["OH_AVMuxer_WriteSampleBuffer"] end classDef libfunc fill:#4CAF50,stroke:#388E3C,stroke-width:2px;
class C1,B1,B2 libfunc
Stop
用户在录制页面点击结束录制按钮时release函数调用recorder.stopNative
1 2 3 4 5 6 7 8 9 10 11
graph TD A["stopNative"] --- B["NativeRecorder::Stop"] B --- C["NativeStop"] C --- D["Recorder.Stop"] D --- D1["videoEncoder_->NotifyEndOfStream"] D --- D2["WaitForDone"] D1 --- E1["OH_VideoEncoder_NotifyEndOfStream"]