首頁 web前端 H5教程 html5實現手機觸摸出現錄音以及離開停止錄音並上傳的功能(代碼)

html5實現手機觸摸出現錄音以及離開停止錄音並上傳的功能(代碼)

Aug 20, 2018 pm 05:56 PM
html 錄音

這篇文章帶給大家的內容是關於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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

HTML 中的表格邊框 HTML 中的表格邊框 Sep 04, 2024 pm 04:49 PM

HTML 表格邊框指南。在這裡,我們以 HTML 中的表格邊框為例,討論定義表格邊框的多種方法。

HTML 中的巢狀表 HTML 中的巢狀表 Sep 04, 2024 pm 04:49 PM

這是 HTML 中巢狀表的指南。這裡我們討論如何在表中建立表格以及對應的範例。

HTML 左邊距 HTML 左邊距 Sep 04, 2024 pm 04:48 PM

HTML 左邊距指南。在這裡,我們討論 HTML margin-left 的簡要概述及其範例及其程式碼實作。

HTML 表格佈局 HTML 表格佈局 Sep 04, 2024 pm 04:54 PM

HTML 表格佈局指南。在這裡,我們詳細討論 HTML 表格佈局的值以及範例和輸出。

HTML 輸入佔位符 HTML 輸入佔位符 Sep 04, 2024 pm 04:54 PM

HTML 輸入佔位符指南。在這裡,我們討論 HTML 輸入佔位符的範例以及程式碼和輸出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在這裡我們也分別討論了 HTML 有序列表和類型的介紹以及它們的範例

在 HTML 中移動文字 在 HTML 中移動文字 Sep 04, 2024 pm 04:45 PM

HTML 中的文字移動指南。在這裡我們討論一下marquee標籤如何使用語法和實作範例。

HTML onclick 按鈕 HTML onclick 按鈕 Sep 04, 2024 pm 04:49 PM

HTML onclick 按鈕指南。這裡我們分別討論它們的介紹、工作原理、範例以及各個事件中的onclick事件。

See all articles