使用Cordova在Android中录制并获取音量以生成波形

使用Cordova在Android中录制并获取音量以生成波形,android,cordova,volume,microphone,recording,Android,Cordova,Volume,Microphone,Recording,我一直在学习Cordova,现在我正在开发一个用于录制声音的应用程序,我想获得所录制声音的音量/分贝/振幅。 我知道Cordova对此没有官方插件,所以我搜索并测试了一些插件: Wavesurfer.js: 它很简单,有很多功能,但在android系统中不起作用,我不知道问题是webview还是什么(我有android 4.1.2) 以下是我的插件问题的详细信息: MicVolume.js: 我尝试了这个,但没有成功,我不知道到底是什么问题,但我认为在这种情况下,它是在cordova.ex

我一直在学习Cordova,现在我正在开发一个用于录制声音的应用程序,我想获得所录制声音的音量/分贝/振幅。 我知道Cordova对此没有官方插件,所以我搜索并测试了一些插件:

  • Wavesurfer.js:

    它很简单,有很多功能,但在android系统中不起作用,我不知道问题是webview还是什么(我有android 4.1.2) 以下是我的插件问题的详细信息:

  • MicVolume.js:

    我尝试了这个,但没有成功,我不知道到底是什么问题,但我认为在这种情况下,它是在cordova.exec

我找不到更多的插件了。还有什么我可以做或使用的,或者我做错了什么?我觉得奇怪的是,我找不到这种简单的插件,所以也许解决方案是它开始从零开始学习java?>:(


提前感谢。

您应该使用Crosswalk,这样您就可以在不使用Cordova插件的情况下访问Web Audio API。从这里您可以使用以下示例:

从当前的Crosswalk版本开始,Web Audio API完全受支持,而且由于您使用的是Cordova,因此您不会有任何跨源问题需要担心(例如,您将使用“localhost”,因此不会有任何HTTPS问题)

我已经用Angular构建了一个节拍器,我在最近的Ionic Crosswalk应用程序中使用了该节拍器,它工作得非常完美(即使在我用于测试的相当糟糕的XGODY设备上也是如此)。请参见下面的要点:


我不知道这有多重要,因为这个问题是在一年多前提出的。 但是它可能会帮助其他人寻找答案。MicVolume.js可以工作,但是它的文档记录很差,我花了很多时间来弄清楚。以下代码应该可以工作:

function audioSuccessCallback(e) {
    setInterval(function() {
        micVolume.read(function(reading) {
            console.log(reading.volume);
        },
        function(error){
            console.log(error);
        });
    }, 200);
}

function audioErrorCallback(e) {
    console.log(e);
}

micVolume.start(audioSuccessCallback, audioErrorCallback);
您需要做的就是循环micVolume.read()函数,这将返回录制的“响度”。可以通过内部麦克风,也可以通过外部麦克风。记住在deviceready启动后调用micVolume.start()。 如果需要获得声音的频率,可以向插件“MicVolumePlugin.java”添加以下代码:

//现在我们需要使用过零方法对PCM数据进行解码
int numCrossing=0;//将过零次数初始化为0

对于(int p=0;p0&&buffer[p+1]0&&buffer[p+2]0&&buffer[p+3]0&&buffer[p+4]@Luca你找到这个问题的解决方案了吗?不,对不起,问题已经提出一年了,所以我不知道现在是否有插件。如果你想做一些特定的功能,最好了解Java。我没有测试过这个,但它看起来很有趣。不管怎样,如果有人想使用Cordova,也许wavesurfer会解决这个问题很快就会有问题:谢谢你,等我有更多时间的时候我会试试的
//Now we need to decode the PCM data using the Zero Crossings Method
int numCrossing = 0; //initialize your number of zero crossings to 0
for (int p = 0; p<bufferSize/4; p+=4) {
    if (buffer[p]>0 && buffer[p+1]<=0) numCrossing++;
    if (buffer[p]<0 && buffer[p+1]>=0) numCrossing++;
    if (buffer[p+1]>0 && buffer[p+2]<=0) numCrossing++;
    if (buffer[p+1]<0 && buffer[p+2]>=0) numCrossing++;
    if (buffer[p+2]>0 && buffer[p+3]<=0) numCrossing++;
    if (buffer[p+2]<0 && buffer[p+3]>=0) numCrossing++;
    if (buffer[p+3]>0 && buffer[p+4]<=0) numCrossing++;
    if (buffer[p+3]<0 && buffer[p+4]>=0) numCrossing++;
}//for p

for (int p=(bufferSize/4)*4;p<bufferSize-1;p++) {
    if (buffer[p]>0 && buffer[p+1]<=0) numCrossing++;
    if (buffer[p]<0 && buffer[p+1]>=0) numCrossing++;
}

// Set the audio Frequency to half the number of zero crossings, times the number of samples our buffersize is per second.
float frequency = (44100*4/bufferSize)*(numCrossing/2);
returnObj.put("frequency", frequency);