vue项目手机录音

手机实现录音功能,安卓和苹果都可。功能,点击开始录制录音后,随时可以停止录音,如果不点击停止最多录制15秒。

在这里插入图片描述
在这里插入图片描述

页面结构

<!--音频-->
<div class="audio-box">
    <audio id="audioPlayer"
           controls
           controlslist="noplaybackrate nodownload"
           preload="auto"></audio>
    <i @click="deleteAudio" class="el-icon-delete"></i>
</div>

<!--录制按钮-->
<div class="out-ring">
	<!--未录制状态-->
    <div @click="startRecording" v-show="!isRecording" class="in-ring">
        <img src="@/assets/img/audio.png" alt="" style="height:48px;">
    </div>
    <!--录制中-->
    <div v-show="isRecording" @click="stopClick" class="in-ring">
        <div class="red-square"></div>
    </div>
</div>
<!--录制提示-->
<div v-show="!isRecording" class="tip">点击录制音频</div>

函数

/**
 * 开始录音
 */
async startRecording() {
    let that = this
    try {
        const stream = await navigator.mediaDevices.getUserMedia(
        {audio:{ sampleRate: 44100,channelCount: 2},
         video:false});
        that.mediaRecorder = new MediaRecorder(stream);
        that.mediaRecorder.ondataavailable = e => {
            that.audioChunks.push(e.data);
        };
        that.mediaRecorder.start();
        that.isRecording = true;

        that.timer = setTimeout(that.stopRecording, 15000);

    } catch (err) {
        that.$toast('录音失败')
    }
},

/**
 * 结束录音
 */
stopRecording() {
    this.mediaRecorder.stop();
    this.mediaRecorder.onstop = () => {
        let audioBlob = new Blob(this.audioChunks, {'type': 'audio/mp3; codecs=opus'});
        let soundUrl = URL.createObjectURL(audioBlob);

        //生成file对象
        let file = new File([audioBlob], 'yinpin.mp3', {
            type: 'application/json',
            lastModified: Date.now()
        })

        //页面播放录音
        this.showAudio(soundUrl)

        this.$store.commit('SET_AUDIO_FILE', file)
        this.$store.commit('SET_AUDIO_URL', soundUrl)

        // 重置音频块数组以备下次录音
        this.audioChunks = [];
    };
    this.isRecording = false;
    this.$toast('录音结束')
},

/**
 * 停止录音点击事件
 */
stopClick() {
    clearTimeout(this.timer);
    this.timer = null
    this.stopRecording()
},

/**
 * 展示音频
 */
showAudio(Url) {
    let audio = document.getElementById('audioPlayer');
    audio.src = Url;
    audio.load();
},

/**
 * 删除音频
 */
deleteAudio() {
    this.showAudio('');
    this.audioChunks = [];
    this.$store.commit('SET_AUDIO_FILE', null)
    this.$store.commit('SET_AUDIO_URL', null)
}

注意,在项目尚未发布时,也就是前端在手机上测试录音功能时,会出现navigator.mediaDevices未定义的情况,可以百度搜索,有三种解决办法。我的解决办法是:使用内网穿透,生成一个公网ip,就可以解决这个问题。具体教程可以参考这边文章:https://blog.csdn.net/qq_42978230/article/details/113618902。使用时,注意将本地地址改为localhost,文章中未提及这个。

当音频录制完成后,audio标签在第一次播放时,进度条的显示以及总显示时间不对,第二次播放才是正确的,可以隐藏audio标签,重新写一个样式包含暂停键,进度条,播放时间和总时间,以及删除按钮。总时长和播放时间自己使用计时器计时。

Vue移动端,你可以使用HTML5的MediaRecorder API来录制音频。下面是一个示例: 1. 创建一个录音组件,例如Record.vue: ```html <template> <div> <button v-on:touchstart="startRecording" v-on:touchend="stopRecording">开始录音</button> </div> </template> <script> export default { data() { return { chunks: [], mediaRecorder: null, isRecording: false }; }, methods: { startRecording() { navigator.mediaDevices.getUserMedia({ audio: true }) .then(stream => { this.mediaRecorder = new MediaRecorder(stream); this.mediaRecorder.start(); this.isRecording = true; this.mediaRecorder.addEventListener('dataavailable', event => { if (typeof event.data === 'undefined') return; if (event.data.size === 0) return; this.chunks.push(event.data); }); }) .catch(err => console.log(err)); }, stopRecording() { this.mediaRecorder.stop(); this.mediaRecorder.addEventListener('stop', () => { const audioBlob = new Blob(this.chunks, { 'type': 'audio/mp3' }); const audioURL = URL.createObjectURL(audioBlob); const audio = new Audio(audioURL); audio.play(); this.chunks = []; this.isRecording = false; }); } } } </script> ``` 2. 在需要使用录音功能的页面中引入Record组件,并使用: ```html <template> <div> <Record></Record> </div> </template> <script> import Record from './Record.vue'; export default { components: { Record } } </script> ``` 在上面的示例中,我们在Record组件中请求用户许可使用麦克风。一旦用户授权,我们就创建一个MediaRecorder实例并开始录制音频。在录制期间,我们将音频数据存储在一个数组中。当停止录制时,我们使用Blob对象将音频数据转换为Blob对象,这样我们就可以将其上传到服务器或将其保存到本地文件中。最后,我们创建一个Audio实例并将其播放,以便用户可以听到自己的录音
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值