使用APICloud開發app錄音功能

  • 2022 年 7 月 11 日
  • 筆記
​

mp3Recorder模組封裝在iOS、Android下錄音直接生成mp3,統一兩個平台的錄音生成文件,方便雙平台之間的交互,減少錄音完成後再轉碼的過程;同時提供分貝波形圖顯示UI;使用該模組前需要打開麥克風許可權。

效果圖如下:

韌體要求:Android:4.0及以上 iOS:8.0及以上

該模組提供了8個介面:

addEventListener 影片結果和聲音分貝監聽;

startRecord 開始錄音

stopRecord   停止錄音

openVoiceLine 顯示線性波形圖

closeVoiceLine 關閉線性波形圖

**setDecibels       **設置波形圖的分貝值

pauseRecord 暫停錄音

resumeRecord 恢復錄音

方法詳解見apicloud平台模組開發文檔:

//docs.apicloud.com/Client-API/Func-Ext/mp3Recorder

以下是程式碼的詳細實現過程:

<!DOCTYPE html>
<html>

<head>
    <title>Module Develop</title>
    <meta charset="utf-8">
    <meta name="viewport"
        content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0" />
    <style type="text/css">
        html,
        body {
            height: 100%
        }

        body {
            background-color: #fff;
            margin: 0;
        }

        #wrap {
            height: 100%;
            position: relative;
        }

        #header {
            padding-top: 20px;
            background-color: #5082c2;
            height: 44px;
            position: relative;
        }

        #header h1 {
            font-size: 20px;
            height: 44px;
            line-height: 44px;
            margin: 0em;
            color: #fff;
            margin-left: 100px;
            margin-right: 100px;
            text-align: center;
        }

        #main {
            display: -webkit-box;
            -webkit-box-orient: vertical;
            -webkit-box-pack: center;
        }

        a.button {
            display: -webkit-box;
            -webkit-box-orient: vertical;
            -webkit-box-pack: center;
            -webkit-box-align: center;
            height: 32px;
            margin: 8px;
            background-color: rgba(240, 240, 240, 1.0);
            border-color: rgba(220, 220, 220, 1.0);
            border-width: 2px;
            border-style: solid;
        }

        a.active {
            background-color: rgba(240, 240, 240, 0.7);
        }
    </style>
</head>

<body>
    <div id="wrap">
        <div id="main">
            <br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
            <a class="button" tapmode="active" onclick="_addEventListener()">監聽錄音</a>
            <a class="button" tapmode="active" onclick="startRecord()">開始錄音</a>
            <a class="button" tapmode="active" onclick="pauseRecord()">暫停錄音</a>
            <a class="button" tapmode="active" onclick="resumeRecord()">恢復錄音</a>
            <a class="button" tapmode="active" onclick="stopRecord()">停止錄音</a>
            <a class="button" tapmode="active" onclick="openVoiceLine()">打開曲線</a>
            <a class="button" tapmode="active" onclick="closeVoiceLine()">關閉曲線</a>
            <a class="button" tapmode="active" onclick="setDecibels()">設置分貝值</a>
            <a class="button" tapmode="active" onclick="playAudio()">播放錄音</a>
            <br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />
        </div>
    </div>
</body>
<script>

    apiready = function () {

    }

    var mp3Path;

    function _addEventListener() {
       
        var demo = api.require('mp3Recorder');
        demo.addEventListener(function (ret, err) {
            alert(JSON.stringify(ret));
            if (ret.evenType == 'endRecord') {
                mp3Path = ret.data.path;
            }
            api.toast({
                msg: JSON.stringify(ret)
            });
        });
    }

    function startRecord() {
        var demo = api.require('mp3Recorder');
        demo.startRecord({
            channel: 2, //聲道支援:1 單聲道 2 立體聲道
            sampleRates: 44100, //取樣率
        }, function (ret, err) {
            api.toast({
                msg: JSON.stringify(ret)
            });
        });
    }

    function pauseRecord() {
        var demo = api.require('mp3Recorder');
        demo.pauseRecord(function (ret, err) {
            api.toast({ msg: JSON.stringify(ret) });
        });
    }

    function resumeRecord() {
        var demo = api.require('mp3Recorder');
        demo.resumeRecord(function (ret, err) {
            api.toast({ msg: JSON.stringify(ret) });
        });
    }

    function stopRecord() {
        var demo = api.require('mp3Recorder');
        demo.stopRecord(function (ret, err) {
            api.toast({
                msg: JSON.stringify(ret)
            });
        });
    }

    function openVoiceLine() {
        var demo = api.require('mp3Recorder');
        demo.openVoiceLine({
            rect: {
                x: 0,
                y: 0,
                w: api.frameWidth,
                h: api.frameHeight / 3
            },
            fixedOn: api.frameName,
            fixed: true,
            isTransparent: false, //背景是否透明(透明時可以穿透點擊視圖)
        }, function (ret, err) {
            alert(JSON.stringify(ret));
        });
    }

    function closeVoiceLine() {
        var demo = api.require('mp3Recorder');
        demo.closeVoiceLine(function (ret, err) {
            api.toast({
                msg: JSON.stringify(ret)
            });
        });
    }

    function setDecibels() {
        var demo = api.require('mp3Recorder');
        var random = getRandom(0, 60);
        demo.setDecibels({
            decibel: random
        }, function (ret, err) {
            api.toast({
                msg: JSON.stringify(ret)
            });
        });
    }

    function getRandom(min, max) {
        var r = Math.random() * (max - min);
        var re = Math.round(r + min);
        re = Math.max(Math.min(re, max), min)
        return re;
    }

    function playAudio() {
        api.startPlay({
            path: mp3Path
        }, function (ret, err) {

        });
    }
</script>

</html>

模組使用相對比較簡單,可以在APICloud開發平台上創建應用並添加直接添加模組,編譯後安裝到手機上,用示例程式碼進行測試。方便開發者在app開發的過程中使用。

​
Tags: