# RecorderAVCodeDemo **Repository Path**: zhaoxin247/recorder-avcode-demo ## Basic Information - **Project Name**: RecorderAVCodeDemo - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2025-04-29 - **Last Updated**: 2025-08-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 使用场景 本案例的场景是投屏功能,需要将录屏后获取到的音频和视频buffer编码后分别发送到对端,因此无需使用复用器保存文件,因此该示例结合官方示例做裁剪、修改补充,暂只说明录屏、音频编码、视频编码,不涉及编码后发送buffer逻辑,基于本示例可帮助应用开发需要进行录屏、音视频编码场景。 # 开发环境 - IDE:DevEco Studio 5.0.2 Release - SDK:5.0.4(16) # 开发示例 ```工程结构 ├──entry/src/main/cpp // Native层 │ ├──capbilities // 能力接口和实现 │ │ ├──include // 能力接口 │ │ ├──AudioEncoder.cpp // 音频编码实现 │ │ └──VideoEncoder.cpp // 视频编码实现 │ ├──common // 公共模块 │ │ ├──dfx // 日志工具 │ │ ├──SampleCallback.cpp // 编解码回调实现 │ │ ├──SampleCallback.h // 编解码回调定义 │ │ └──SampleInfo.h // 功能实现公共类 │ ├──recorder // Native层录制接口和实现 │ │ ├──Recorder.cpp // Native层录制功能调用逻辑的实现 │ │ ├──Recorder.h // Native层录制功能调用逻辑的接口 │ │ ├──RecorderNative.cpp // Native层 录制的入口 │ │ └──RecorderNative.h │ ├──types // Native层暴露上来的接口 │ │ └──librecorder // 录制模块暴露给UI层的接口 │ └──CMakeLists.txt // 编译入口 ├──ets // UI层 │ ├──entryability // 应用的入口 │ │ └──EntryAbility.ets │ └──pages // EntryAbility 包含的页面 │ ├──Index.ets // 首页/调试页面 └──module.json5 // 模块配置信息 代码调用逻辑:Index-> librecorder/Index.d.ts-> RecorderNatice.cpp-> Recorder.cpp-> AudioEncoder.cpp/VideoEncoder.cpp ``` ## 具体实现 ### UI层 1. UI只简单写启动录屏及停止录屏两个按钮,用于native层调试录屏; 2. 点击启动录屏,首先申请后台长时任务(涉及内录音频则需申请,若不申请,仍可正常单独录制视频),申请成功后调用native层启动录屏; 3. 在录制一段时间后,点击停止录屏,则停止并释放相关资源。 ### Natice层 1. 在点击启动录屏后,首先对录屏及音视频编码器进行配置初始化,并创建音视频输出文件,在初始化完成后调用启动接口,启动录屏,与此同时启动音视频编码器; 2. 编码器每编码成功一帧,sample_callback.cpp的输出回调OnNewOutputBuffer()就会调起一次,此时用户可以拿到AVCodec框架给出的OH_AVBuffer; 3. 在输出回调中,用户需手动把帧buffer、index存入输出队列中,并通知输出线程解锁; 4. 在输出线程中,把上一步的帧信息储存为bufferInfo后,pop出队; 5. 在输出线程中,使用上一步的bufferInfo,调用写入音视频文件接口,将每一帧被分别写入h264(视频)和acc(音频)文件中; 6. 最后调用FreeOutputBuffer接口后,这一帧buffer释放回AVCodec框架,实现buffer轮转。 ### 相关权限 1. 允许Service Ability在后台持续运行:ohos.permission.KEEP_BACKGROUND_RUNNING