uni-app 插件讨论 录音 实时帧pcm回调 实时分贝值 实时录音回调(双端) - FullStack frameSize大小设置

发布于 1周前 作者 gougou168 来自 Uni-App

uni-app 插件讨论 录音 实时帧pcm回调 实时分贝值 实时录音回调(双端) - FullStack frameSize大小设置

平台 版本 问题描述
IOS 17.3.1 当frameSize不等于10的时候,onFrameRecordedJson中的数据块,最后面的信息会发现语音块丢失。安卓不会出现错误。
1 回复

针对您提出的关于uni-app插件中实现录音功能,特别是实时帧PCM回调、实时分贝值获取以及双端实时录音回调的需求,这里提供一个基于uni-app和小程序原生插件的示例代码框架。由于uni-app本身对原生功能的支持有限,我们通常会借助原生插件或者H5+ API来实现这些高级功能。

1. 插件配置

首先,确保您已经在uni-app项目中配置了相应的原生插件,用于录音功能。如果使用的是自定义插件,需要在manifest.json中声明并引入。

"mp-weixin": { // 以微信小程序为例
    "usingComponents": true,
    "nativePlugins": [
        {
            "name": "RecorderPlugin",
            "description": "录音插件"
        }
    ]
}

2. 插件实现(示例代码,仅展示关键部分)

插件JavaScript接口

// RecorderPlugin.js
module.exports = {
    startRecording: function(options) {
        // options 包含 frameSize, sampleRate 等参数
        wx.createInnerAudioContext().onAudioProcess((res) => {
            // 获取实时PCM数据
            const pcmData = res.inputBuffer.getChannelData(0);
            // 处理PCM数据,如计算分贝值
            const rms = Math.sqrt(pcmData.reduce((sum, val) => sum + val * val, 0) / pcmData.length);
            const db = 20 * Math.log10(rms + 1e-9); // 防止log(0)

            // 回调PCM数据和分贝值
            if (options.onPCMFrame) options.onPCMFrame(pcmData);
            if (options.onDBValue) options.onDBValue(db);
        });

        // 开始录音,这里仅为示意,实际需调用微信小程序的录音API
        wx.startRecord({
            // 配置参数
            success: () => {
                console.log('Recording started');
            },
            fail: (err) => {
                console.error('Recording failed:', err);
            }
        });
    },
    stopRecording: function() {
        wx.stopRecord({
            success: (res) => {
                console.log('Recording stopped', res.tempFilePath);
            }
        });
    }
};

uni-app调用插件

// 在uni-app的页面中调用插件
const recorder = require('@/native-plugins/RecorderPlugin'); // 根据实际路径调整

recorder.startRecording({
    frameSize: 1024, // 设置frameSize大小
    sampleRate: 44100,
    onPCMFrame: (pcmData) => {
        // 处理PCM帧数据
        console.log('PCM Frame:', pcmData);
    },
    onDBValue: (db) => {
        // 处理实时分贝值
        console.log('DB Value:', db);
    }
});

// 停止录音
setTimeout(() => {
    recorder.stopRecording();
}, 10000); // 假设录音10秒

注意

  1. 以上代码为简化示例,未包含完整的错误处理和资源管理。
  2. wx.createInnerAudioContext().onAudioProcess并非微信小程序原生API,此处仅为示意,实际需利用小程序的录音API获取PCM数据。
  3. 分贝值计算可能需要根据实际需求调整,上述示例采用了简单的RMS(均方根)方法。
  4. 插件开发需考虑平台差异,如微信小程序、H5、App等平台可能有不同的实现方式。
回到顶部