前言:本项目基于github开源插件实现,该插件使用flash实现,兼容IE8以上浏览器

感谢michalstocki的分享该项目,github项目地址:https://github.com/michalstocki/FlashWavRecorder

博主修改后的项目下载地址:http://download.csdn.net/detail/eguid_1/9684124

1、要提交的表单(如果只需要上传文件,可以不需要)

<form id="uploadForm" name="uploadForm" action="audio/send" method="post">
<span>设备id:</span><input name="deviceId" value="0000007"><!-- 设备id -->
<span>音频格式:</span><input name="audio_format" value="wav"><!-- 音频格式 -->
</form>

2、修改表单名和上传的音频文件名

这两个参数用来修改上传的表单和要上传的已经录制好的音频文件名,与后台的文件接收的参数名一致

FWRecorder.uploadFormId = "#uploadForm";//要上传的表单

 FWRecorder.uploadFieldName = "audio_file";//上传文件的参数名

$(function () {
var $uploadStatus = $('#upload_status'),
$showLevelButton = $('.show_level'),
$hideLevelButton = $('.hide_level'),
$level = $('.control_panel .level'); var CLASS_CONTROLS = "control_panel";
var CLASS_RECORDING = "recording";
var CLASS_PLAYBACK_READY = "playback_ready";
var CLASS_PLAYING = "playing";
var CLASS_PLAYBACK_PAUSED = "playback_paused"; // Embedding flash object --------------------------------------------------------------------------------------------- setUpFormOptions();
var appWidth = 24;
var appHeight = 24;
var flashvars = {'upload_image': 'audioRecorder/upload.png'};
var params = {};
var attributes = {'id': "recorderApp", 'name': "recorderApp"};
swfobject.embedSWF("audioRecorder/recorder.swf", "flashcontent", appWidth, appHeight, "11.0.0", "", flashvars, params, attributes); // Handling FWR events ------------------------------------------------------------------------------------------------ window.fwr_event_handler = function fwr_event_handler() {
$('#status').prepend("<div class=\"recorder-event\">" + arguments[0] + "</div>");
var name, $controls;
switch (arguments[0]) {
case "ready":
var width = parseInt(arguments[1]);
var height = parseInt(arguments[2]);
FWRecorder.uploadFormId = "#uploadForm";//要上传的表单
FWRecorder.uploadFieldName = "audio_file";//上传文件的参数名
FWRecorder.connect("recorderApp", 0);
FWRecorder.recorderOriginalWidth = width;
FWRecorder.recorderOriginalHeight = height;
$('.save_button').css({'width': width, 'height': height});
break; case "no_microphone_found":
break; case "microphone_user_request":
recorderEl().addClass("floating");
FWRecorder.showPermissionWindow();
break; case "microphone_connected":
FWRecorder.isReady = true;
$uploadStatus.css({'color': '#000'});
break; case "permission_panel_closed":
FWRecorder.defaultSize();
recorderEl().removeClass("floating");
break; case "microphone_activity":
$('#activity_level').text(arguments[1]);
break; case "recording":
name = arguments[1];
$controls = controlsEl(name);
FWRecorder.hide();
setControlsClass($controls, CLASS_RECORDING);
break; case "recording_stopped":
name = arguments[1];
$controls = controlsEl(name);
var duration = arguments[2];
FWRecorder.show();
setControlsClass($controls, CLASS_PLAYBACK_READY);
$('#duration').text(duration.toFixed(4) + " 秒");
break; case "microphone_level":
$level.css({width: arguments[1] * 50 + '%'});
break; case "observing_level":
$showLevelButton.hide();
$hideLevelButton.show();
break; case "observing_level_stopped":
$showLevelButton.show();
$hideLevelButton.hide();
$level.css({width: 0});
break; case "playing":
name = arguments[1];
$controls = controlsEl(name);
setControlsClass($controls, CLASS_PLAYING);
break; case "playback_started":
name = arguments[1];
var latency = arguments[2];
break; case "stopped":
name = arguments[1];
$controls = controlsEl(name);
setControlsClass($controls, CLASS_PLAYBACK_READY);
break; case "playing_paused":
name = arguments[1];
$controls = controlsEl(name);
setControlsClass($controls, CLASS_PLAYBACK_PAUSED);
break; case "save_pressed":
FWRecorder.updateForm();
break; case "saving":
name = arguments[1];
break; case "saved":
name = arguments[1];
var data = $.parseJSON(arguments[2]);
if (data.status) {
$('#upload_status').css({'color': '#0F0'}).text(name + " 上传成功");
} else {
$('#upload_status').css({'color': '#F00'}).text(name + " 上传失败");
}
break; case "save_failed":
name = arguments[1];
var errorMessage = arguments[2];
$uploadStatus.css({'color': '#F00'}).text(name + " 失败: " + errorMessage);
break; case "save_progress":
name = arguments[1];
var bytesLoaded = arguments[2];
var bytesTotal = arguments[3];
$uploadStatus.css({'color': '#000'}).text(name + " 进展: " + bytesLoaded + " / " + bytesTotal);
break;
}
}; // Helper functions --------------------------------------------------------------------------------------------------- function setUpFormOptions() {
var gain = $('#gain')[0];
var silenceLevel = $('#silenceLevel')[0];
for (var i = 0; i <= 100; i++) {
gain.options[gain.options.length] = new Option(100 - i);
silenceLevel.options[silenceLevel.options.length] = new Option(i);
}
} function setControlsClass($controls, className) {
$controls.attr('class', CLASS_CONTROLS + ' ' + className);
} function controlsEl(name) {
return $('#recorder-' + name);
} function recorderEl() {
return $('#recorderApp');
} // Button actions ----------------------------------------------------------------------------------------------------- window.microphonePermission = function () {
recorderEl().addClass("floating");
FWRecorder.showPermissionWindow({permanent: true});
}; window.configureMicrophone = function () {
if (!FWRecorder.isReady) {
return;
}
FWRecorder.configure($('#rate').val(), $('#gain').val(), $('#silenceLevel').val(), $('#silenceTimeout').val());
FWRecorder.setUseEchoSuppression($('#useEchoSuppression').is(":checked"));
FWRecorder.setLoopBack($('#loopBack').is(":checked"));
}; });

3、后台接收文件

接收前端三个参数:deviceId,audio_format,audio_file
audio_file就是音频文件
public int sendAudioData(@RequestParam(value = "deviceId") String deviceId,
@RequestParam(value = "audio_format") String audio_format, @RequestParam("audio_file") MultipartFile file) {
boolean ret=false;
File tFile = null;
System.out.println(audio_format + "," + deviceId);
String fileName=null;
// 判断文件是否为空
if (file != null && !file.isEmpty()&&(fileName=file.getName()+System.currentTimeMillis())!=null) {
String filePath = Util.getRootPath() + fileName + ".wav";
System.out.println("文件保存路径:" +filePath);
tFile = new File(filePath); try {
// 转存文件
file.transferTo(tFile);
ret=true;
} catch (Exception e) {
e.printStackTrace();
}
}
if(ret=true){
return 0;
}
return -1;
}

4、最终效果

使用FlashWavRecorder实现浏览器录制wav音频和上传音频文件,兼容IE8以上浏览器的更多相关文章

  1. 兼容IE8以下浏览器input表单属性placeholder不能智能提示功能

    当前很多表单提示使用了表单属性placeholder,可这属性不兼容IE8以下的浏览器,我自己写了一个兼容处理js // 兼容IE8以下浏览器input不能智能提示功能 if(navigator.ap ...

  2. placeholder兼容方法(兼容IE8以上浏览器)

    //placeholder兼容方法(兼容IE8以上浏览器) var JPlaceHolder = { //检测 _check: function () { return 'placeholder' i ...

  3. [转]python3之paramiko模块(基于ssh连接进行远程登录服务器执行命令和上传下载文件的功能)

    转自:https://www.cnblogs.com/zhangxinqi/p/8372774.html 阅读目录 1.paramiko模块介绍 2.paramiko的使用方法 回到顶部 1.para ...

  4. 背景图片background-size兼容ie8以下浏览器解决

    背景图片不够大,然后就想到用background-size:100%; 测试浏览器的时候发现ie8以下不兼容,图片会自动填充平铺过去,然后出现背景不好看的现象.解决方法: background-ima ...

  5. 浏览器关闭、刷新、关闭标签事件,兼容IE8,chrome,firefox

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...

  6. vue项目中兼容ie8以上浏览器的配置

    1.首先需要在根目录的index.html文件加入如下代码 <meta http-equiv="X-UA-Compatible" content="IE=edge& ...

  7. Django积木块三——静态文件和上传文件

    静态文件和上传的文件 # 静态文件 STATIC_URL = '/static/' STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), ) # ...

  8. Windows Phone 8初学者开发—第20部分:录制Wav音频文件

    原文 Windows Phone 8初学者开发—第20部分:录制Wav音频文件 原文地址:http://channel9.msdn.com/Series/Windows-Phone-8-Develop ...

  9. 多浏览器播放wav格式的音频文件

    html5的audio标签只在火狐下支持wav格式的音频播放,无法兼容IE和google , 使用audioplayer.js 基本上能支持大部分浏览器播放wav音频文件,经测试IE.火狐.googl ...

随机推荐

  1. Vim常用操作-快速删除括号中内容。

    如果你和我一样,希望拥有众多工具,发挥工具最大执行效率,让工作事半功倍的话,我推荐你来使用下 Vim. 刚接触Vim 会觉得它的学习曲线非常陡峭,要记住很多命令,操作太复杂.所以这个系列的分享,不会教 ...

  2. 腾讯云无法绑定公网IP问题解释与解决方案。

    http://blog.csdn.net/chenggong2dm/article/details/51475222 解释:公网IP并不直接配置在服务器上,而是在服务器外部的路由上,通过某种映射连接. ...

  3. Machine Learning——Supervised Learning(机器学习之监督学习)

    监督学习是指:利用一组已知类别的样本调整分类器的参数,使其达到所要求性能的过程. 我们来看一个例子:预测房价(注:本文例子取自业界大牛吴恩达老师的机器学习课程) 如下图所示:横轴表示房子的面积,单位是 ...

  4. python自动化开发-[第一章]-练习题

    1.使用while循环输入 1 2 3 4 5 6 8 9 10 i = 1 while i < 11: if i == 7: i += 1 continue print (i) i += 1 ...

  5. PPT要你好看---读书笔记

    PPT要你好看.主要是设计的思维. 下图,对于现阶段的我来说,收获最大的是毕业答辩PPT的制作. 以及整体的PPT制作思路.

  6. 【算法系列学习】[kuangbin带你飞]专题十二 基础DP1 E - Super Jumping! Jumping! Jumping!

    https://vjudge.net/contest/68966#problem/E http://blog.csdn.net/to_be_better/article/details/5056334 ...

  7. Oracle中碰到的函数和关键字收集

    一.时间处理函数 trunc(sysdate) 返回日期 to_date() to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') to_number() 转为数字 二.字 ...

  8. [js笔记整理]正则篇

    一.正则基本概念 1.一种规则.模式 2.强大的字符串匹配工具 3.在js中常与字符串函数配合使用 二.js正则写法 正则在js中以正则对象存在: (1)var re=new RegExp(正则表达式 ...

  9. .NET面试题系列[16] - 多线程概念(1)

    .NET面试题系列目录 这篇文章主要是各个百科中的一些摘抄,简述了进程和线程的来源,为什么出现了进程和线程. 操作系统层面中进程和线程的实现 操作系统发展史 直到20世纪50年代中期,还没出现操作系统 ...

  10. 无分类编址(CIDR)构成超网

    CIDR(无分类域间路由选择) CIDR最主要有两个以下特点: 消除传统的A,B,C地址和划分子网的概念,更有效的分配IPv4的地址空间,CIDR使IP地址又回到无分类的两级编码.记法:IP地址::= ...