搜索
首页web前端H5教程html5实现手机触摸出现录音以及离开停止录音并上传的功能(代码)

本篇文章给大家带来的内容是关于html5实现手机触摸出现录音以及离开停止录音并上传的功能(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

以下是实现功能实例:
html

<!DOCTYPE html><html><head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <script type="text/javascript" scr="record.js"></script></head><body>
    <p>
        <input id="microphone" type="button" />
    </p>
    <script>
    <script  type="text/javascript">        
    var microDome=document.getElementById(&#39;microphone&#39;);        
    var recorder;        
    var btnElem=document.getElementById("microphone");//获取ID
        function initEvent() {
            btnElem.addEventListener("touchstart", function(event) {
                //event.preventDefault();//阻止浏览器默认行为
                HZRecorder.get(function (rec) {
                    recorder = rec;
                    recorder.start();
                });
                      });
            btnElem.addEventListener("touchend", function(event) {
                //event.preventDefault();
                HZRecorder.get(function (rec) {
                    recorder = rec;
                    recorder.stop();
                })
                recorder.upload("/upload", function (state, e) {
                    switch (state) {                        
                    case &#39;uploading&#39;:                            
                    //var percentComplete = Math.round(e.loaded * 100 / e.total) + &#39;%&#39;;
                            break;                        
                            case &#39;ok&#39;:                            
                            //alert(e.target.responseText);
                            alert("上传成功");                            
                            break;                        
                            case &#39;error&#39;:
                            alert("上传失败");                            
                            break;                        
                            case &#39;cancel&#39;:
                            alert("上传被取消");                            
                            break;
                    }
                });
                            });
        };
        initEvent();    
        <script/>

下面是js:

//兼容
window.URL = window.URL || window.webkitURL;
//获取计算机的设备:摄像头或者录音设备
navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia;var HZRecorder = function (stream, config) {
    config = config || {};
    config.sampleBits = config.sampleBits || 8;      //采样数位 8, 16
    config.sampleRate = config.sampleRate || (44100 / 6);   //采样率(1/6 44100)

    //创建一个音频环境对象
    var audioContext = window.AudioContext || window.webkitAudioContext;    
    var context = new audioContext();    
    var audioInput = context.createMediaStreamSource(stream);    
    // 第二个和第三个参数指的是输入和输出都是单声道,2是双声道。
    var recorder = context.createScriptProcessor(4096, 1, 1);    
    var audioData = {
        size: 0          //录音文件长度
        , buffer: []     //录音缓存
        , inputSampleRate: context.sampleRate    //输入采样率
        , inputSampleBits: 16       //输入采样数位 8, 16
        , outputSampleRate: config.sampleRate    //输出采样率
        , outputSampleBits: config.sampleBits       //输出采样数位 8, 16
        , input: function (data) {
            this.buffer.push(new Float32Array(data));            
            this.size += data.length;
        }
        , compress: function () { //合并压缩
            //合并
            var data = new Float32Array(this.size);            
            var offset = 0;            
            for (var i = 0; i < this.buffer.length; i++) {
                data.set(this.buffer[i], offset);
                offset += this.buffer[i].length;
            }            
            //压缩
            var compression = parseInt(this.inputSampleRate / this.outputSampleRate);            
            var length = data.length / compression;            
            var result = new Float32Array(length);            
            var index = 0, j = 0;            
            while (index < length) {
                result[index] = data[j];
                j += compression;
                index++;
            }            
            return result;
        }
        , encodeWAV: function () {
            var sampleRate = Math.min(this.inputSampleRate, this.outputSampleRate);            
            、var sampleBits = Math.min(this.inputSampleBits, this.outputSampleBits);            
            var bytes = this.compress();            
            var dataLength = bytes.length * (sampleBits / 8);            
            var buffer = new ArrayBuffer(44 + dataLength);            
            var data = new DataView(buffer);            
            var channelCount = 1;//单声道
            var offset = 0;            
            var writeString = function (str) {
                for (var i = 0; i < str.length; i++) {
                    data.setUint8(offset + i, str.charCodeAt(i));
                }
            }            
            // 资源交换文件标识符
            writeString(&#39;RIFF&#39;); offset += 4;            
            // 下个地址开始到文件尾总字节数,即文件大小-8
            data.setUint32(offset, 36 + dataLength, true); offset += 4;            
            // WAV文件标志
            writeString(&#39;WAVE&#39;); offset += 4;            
            // 波形格式标志
            writeString(&#39;fmt &#39;); offset += 4;            
            // 过滤字节,一般为 0x10 = 16
            data.setUint32(offset, 16, true); offset += 4;            
            // 格式类别 (PCM形式采样数据)
            data.setUint16(offset, 1, true); offset += 2;            
            // 通道数
            data.setUint16(offset, channelCount, true); offset += 2;            
            // 采样率,每秒样本数,表示每个通道的播放速度
            data.setUint32(offset, sampleRate, true); offset += 4;            
            // 波形数据传输率 (每秒平均字节数) 单声道×每秒数据位数×每样本数据位/8
            data.setUint32(offset, channelCount * sampleRate * (sampleBits / 8), true); offset += 4;            
            // 快数据调整数 采样一次占用字节数 单声道×每样本的数据位数/8
            data.setUint16(offset, channelCount * (sampleBits / 8), true); offset += 2;            
            // 每样本数据位数
            data.setUint16(offset, sampleBits, true); offset += 2;            
            // 数据标识符
            writeString(&#39;data&#39;); offset += 4;            
            // 采样数据总数,即数据总大小-44
            data.setUint32(offset, dataLength, true); offset += 4;            
            // 写入采样数据
            if (sampleBits === 8) {                
            for (var i = 0; i < bytes.length; i++, offset++) {                    
            var s = Math.max(-1, Math.min(1, bytes[i]));                    
            var val = s < 0 ? s * 0x8000 : s * 0x7FFF;
                    val = parseInt(255 / (65535 / (val + 32768)));
                    data.setInt8(offset, val, true);
                }
            } else {                
            for (var i = 0; i < bytes.length; i++, offset += 2) {                    
            var s = Math.max(-1, Math.min(1, bytes[i]));
                    
                    data.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);
                }
            }            return new Blob([data], { type: &#39;audio/mp3&#39; });
        }
    };    
    //开始录音
    this.start = function () {
        audioInput.connect(recorder);
        recorder.connect(context.destination);
    }    
    //停止
    this.stop = function () {
        recorder.disconnect();
    }    
    //获取音频文件
    this.getBlob = function () {
        this.stop();        
        return audioData.encodeWAV();
    }    
    //上传
    this.upload = function (url, callback) {
        var fd = new FormData();
        fd.append("audioData", this.getBlob());        
        var xhr = new XMLHttpRequest();        
        if (callback) {
            xhr.upload.addEventListener("progress", function (e) {
                callback(&#39;uploading&#39;, e);
            }, false);
            xhr.addEventListener("load", function (e) {
                callback(&#39;ok&#39;, e);
            }, false);
            xhr.addEventListener("error", function (e) {
                callback(&#39;error&#39;, e);
            }, false);
            xhr.addEventListener("abort", function (e) {
                callback(&#39;cancel&#39;, e);
            }, false);
        }
        xhr.open("POST", url);
        xhr.send(fd);
    }    //音频采集
    recorder.onaudioprocess = function (e) {
        audioData.input(e.inputBuffer.getChannelData(0));        
        //record(e.inputBuffer.getChannelData(0));
    }

};//抛出异常// HZRecorder.throwError = function (message) {
//     alert(message);
//     throw new function () { this.toString = function () { return message; } }
// }
//是否支持录音HZRecorder.canRecording = (navigator.getUserMedia != null);
//获取录音机
HZRecorder.get = function (callback, config) {
    if (callback) {        
    if (navigator.getUserMedia) {
            navigator.getUserMedia(
                { audio: true } //只启用音频
                , function (stream) {
                    var rec = new HZRecorder(stream, config);
                    callback(rec);
                }
                , function (error) {
                    switch (error.code || error.name) {                        
                    case &#39;PERMISSION_DENIED&#39;:                        
                    case &#39;PermissionDeniedError&#39;:
                            HZRecorder.throwError(&#39;用户拒绝提供信息。&#39;);                            
                            break;                        
                            case &#39;NOT_SUPPORTED_ERROR&#39;:                        
                            case &#39;NotSupportedError&#39;:
                            HZRecorder.throwError(&#39;浏览器不支持硬件设备。&#39;);                            
                            break;                        
                            case &#39;MANDATORY_UNSATISFIED_ERROR&#39;:                        
                            case &#39;MandatoryUnsatisfiedError&#39;:
                            HZRecorder.throwError(&#39;无法发现指定的硬件设备。&#39;);                            
                            break;                        default:
                            HZRecorder.throwError(&#39;无法打开麦克风。异常信息:&#39; + (error.code || error.name));                            
                            break;
                    }
                });
        } else {
            HZRecorder.throwErr(&#39;当前浏览器不支持录音功能。&#39;); 
            return;
        }
    }
};

这些都是通过大神的讲解进行整合后自己摸索出来的,有什么问题可以评论,我们一起解决,谢谢!!!

相关推荐:

html5 audio标签怎么用?html5 自动播放实现代码实例

html5移动页面如何自适应屏幕?html5页面自适应手机屏幕的四种方法

以上是html5实现手机触摸出现录音以及离开停止录音并上传的功能(代码)的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
HTML超文本标记语言--超在那里?(文档分析)HTML超文本标记语言--超在那里?(文档分析)Aug 02, 2022 pm 06:04 PM

本篇文章带大家了解一下HTML(超文本标记语言),介绍一下HTML的本质,HTML文档的结构、HTML文档的基本标签和图像标签、列表、表格标签、媒体元素、表单,希望对大家有所帮助!

html和css算编程语言吗html和css算编程语言吗Sep 21, 2022 pm 04:09 PM

不算。html是一种用来告知浏览器如何组织页面的标记语言,而CSS是一种用来表现HTML或XML等文件样式的样式设计语言;html和css不具备很强的逻辑性和流程控制功能,缺乏灵活性,且html和css不能按照人类的设计对一件工作进行重复的循环,直至得到让人类满意的答案。

web前端笔试题库之HTML篇web前端笔试题库之HTML篇Apr 21, 2022 am 11:56 AM

总结了一些web前端面试(笔试)题分享给大家,本篇文章就先给大家分享HTML部分的笔试题(附答案),大家可以自己做做,看看能答对几个!

总结HTML中a标签的使用方法及跳转方式总结HTML中a标签的使用方法及跳转方式Aug 05, 2022 am 09:18 AM

本文给大家总结介绍a标签使用方法和跳转方式,希望对大家有所帮助!

HTML5中画布标签是什么HTML5中画布标签是什么May 18, 2022 pm 04:55 PM

HTML5中画布标签是“<canvas>”。canvas标签用于图形的绘制,它只是一个矩形的图形容器,绘制图形必须通过脚本(通常是JavaScript)来完成;开发者可利用多种js方法来在canvas中绘制路径、盒、圆、字符以及添加图像等。

html中document是什么html中document是什么Jun 17, 2022 pm 04:18 PM

在html中,document是文档对象的意思,代表浏览器窗口的文档;document对象是window对象的子对象,所以可通过“window.document”属性对其进行访问,每个载入浏览器的HTML文档都会成为Document对象。

html5废弃了哪个列表标签html5废弃了哪个列表标签Jun 01, 2022 pm 06:32 PM

html5废弃了dir列表标签。dir标签被用来定义目录列表,一般和li标签配合使用,在dir标签对中通过li标签来设置列表项,语法“<dir><li>列表项值</li>...</dir>”。HTML5已经不支持dir,可使用ul标签取代。

Html5怎么取消td边框Html5怎么取消td边框May 18, 2022 pm 06:57 PM

3种取消方法:1、给td元素添加“border:none”无边框样式即可,语法“td{border:none}”。2、给td元素添加“border:0”样式,语法“td{border:0;}”,将td边框的宽度设置为0即可。3、给td元素添加“border:transparent”样式,语法“td{border:transparent;}”,将td边框的颜色设置为透明即可。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),