java 网页 录音_Java+FlashWavRecorder实现网页录音并上传

article/2025/7/22 5:48:12

【注意】

【前言】

肯定有需求要网页录音,并且要上传。这奇葩需求。

然后找到了FlashWavRecorder,

【原始版本号】

1.下载

在上面的地址下载zip解压之后,目录里面有个index.html。打开之后这效果:

ce9c2a1bad6196e0dce190167a8222c1.png

2.录音权限

必须保证你的电脑有麦克风,也就是说台式机你得有耳麦。笔记本保证麦克风没有坏掉。

有麦克风的情况下,点击上面的红框内的button。然后选择同意。例如以下:

f37594312a650ab32f12551b49dc72eb.png

可能有的人会说我点了没反应,或者firebug报错啊,神。插上麦克风。。

3.录音

之后你就能够试的录音了,自己研究吧,挺简单。

【上传】

1.上传

flash录音非常好实现,比較难的是录音后直接上传录音文件到server,

FlashWavRecorder做到了,

看了下as源代码。大概是js调用swf中的方法。

swf会把录音放到内存,然后编码,然后传到server,

server就能够保存了。

2.php

这个插件是好,对于用java程序猿来说。as代码,php代码都是坑啊,

幸好as代码和java类似。还能看懂点,php曾经也看过点。

【改装后版本号】

1.引入js

在页面head中引入一下js和css:

当然前提要有jquery。这里就没有写了

2.页面:

精简了一些东西,又一次布局了,代码:

Record

Stop Recording

Play

Pause Playing

Stop Playing

显示声波

隐藏声波

麦克风权限

您的浏览器必须支持Javascript,并且安装了Flash播放器!

录音状态。

。。

录音时长:
上传状态:

3.效果

4382c07ec0e899a031db425491818df0.png

4.后台代码

使用的springmvc(这个没啥关系),和apache的fileupload组件,代码:

package com.bfsuol.common.controller;

import java.io.File;

import java.util.Iterator;

import org.apache.commons.fileupload.FileItem;

import org.apache.commons.fileupload.disk.DiskFileItemFactory;

import org.apache.commons.fileupload.servlet.ServletFileUpload;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import com.bfsuolcomponents.file.entity.FileManager;

import com.bfsuolcomponents.file.service.FileManagerService;

import com.bfsuolframework.core.controller.SpringControllerSupport;

import com.bfsuolframework.core.utils.DateTimeUtils;

import com.bfsuolframework.core.utils.FileUtils;

/**

* 录音以及上传controller

* @author qiaowenbin

*/

@Controller

@RequestMapping("/record")

public class RecordController extends SpringControllerSupport{

@Autowired

private FileManagerService fileManagerService;

@RequestMapping("/upload")

public @ResponseBody String upload() throws Exception{

Long id = null;

Iterator iter = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(getRequest()).iterator();

while (iter.hasNext()) {

FileItem item = iter.next();

if(!item.isFormField()){

id = processUploadedFile(item);

}

}

return "{\"saved\": 1,\"id\": "+id+"}";

}

private Long processUploadedFile(FileItem item) throws Exception{

// 上传

String uploadPath = FileUtils.getUploadRealPath("files/records") + FileUtils.getDatePath()+"/";

FileUtils.createFolder(uploadPath);

String fileFullPath = getFileValidName(uploadPath, item.getName(), true, true);

item.write(new File(fileFullPath));

// 保存

FileManager fileManager = new FileManager();

fileManager.setFilePath(fileFullPath);

fileManager.setUrl(FileUtils.realPath2Path(fileFullPath));

fileManager.setFileRealname(FileUtils.getFileName(fileFullPath));

fileManager.setFileTitle(item.getName());

return fileManagerService.save(fileManager);

}

private String getFileValidName(String filePath, String fileName,boolean format, boolean overwrite ){

String fileValidName;

if(format){

String fileExt = FileUtils.getFileExt(fileName);

fileValidName = filePath + DateTimeUtils.getCurrentDateTimeString("yyyyMMddHHmmss") + (fileExt==null?"":"."+fileExt);

}else{

fileValidName = filePath + fileName;

}

if( !overwrite ){

fileValidName = FileUtils.getValidFileName(fileValidName);

}

return fileValidName;

}

}

5.解说

大概的意思就是上传文件。将文件相关信息保存到数据库,返回保存后的id。

里面有些代码是没实用的。你能够自己改动。

【页面多次调用】

1.奇葩

怎么会有这需求,

解决的方法,每次都弹出来就好了。

2.封装

能够自己封装一个方法,弹出后录音上传完成后返回id。

【代码】

原始文件有改动了一些js和页面内容。打个zip包,

有须要的能够下载。

zip仅仅打包了前端的,后台摘出来太麻烦了,自己看上面的代码吧。

index.html须要替换为上面的页面。


http://chatgpt.dhexx.cn/article/uAjS2lp5.shtml

相关文章

10.WebRTC实现网页录音功能

一、概述 通过WebRTC,实现在页面上进行录音,并将录音结果转换为.wav格式进行播放 二、录音实现 检测是否有麦克风权限 navigator.mediaDevices.enumerateDevices().then(function(devices) {// 检测视频输入let video devices.find((device) > {…

uniapp中使用网页录音并上传声音文件(发语音)——js-audio-recorder的使用【伸手党福利】

uniapp中上传音频只能在app或小程序当中实现,如何使用网页完成语音的录制和上传则成为了困扰前端童鞋的重点。 本文着重解决: js-audio-recorder报 error:浏览器不支持getUserMedia ! 的问题。 js-audio-recorder报 NotFoundError : Requested device no…

前端实现在浏览器网页中录音

一、整体实现的思想 页面中实现录音需要使用浏览器提供的MediaRecorder API,所以要实现页面录音就需要浏览器支持MediaStream Recording相关的功能,即浏览器能够获取浏览器的录音权限。 页面内容,需要一个记录录音开始和结束的按钮,以及一个用…

基于神经网络的自适应最优控制

《 N e u r a l n e t w o r k a p p r o a c h t o c o n t i n u o u s − t i m e d i r e c t a d a p t i v e o p t i m a l c o n t r o l f o r p a r t i a l l y u n k n o w n n o n l i n e a r s y s t e m s 》 D r a g u n a V r a b i e ∗ , F r a n k L e w …

堆排序(排升序为啥建大堆,排降序为啥建小堆)

简介: 之前对堆排序认识的不是很透彻,今天回过头来再把堆排序的知识整理整理!以及排升序为什么要建大堆,排降序要建小堆。 正文: 首先我们要知道:   ①堆的逻辑是一颗完全二叉树;   ②它使…

残差网络Residual Networks-残差网络的创建、训练、测试、调参

残差网络的创建、训练、测试、调参加粗样式 在Keras中实现残差网络模型的创建,并通过模型来实现对图片的分类。 残差网络的预备知识 网络越深越好? 随着网络层级的不断增加,模型精度不断得到提升,而当网络层级增加到一定的数目…

堆排序,为什么升序排列要建大堆,降序排列要建小堆

堆排序中用到了建立大小堆和向下调整的内容,对这些内容有些不了解的同学可以去补一补专门写堆的博客,方便更好的理解堆排序数据结构之堆(Heap),堆的相关操作,用堆模拟优先级队列。 如果把待排序序列分为未排…

操作系统——动态分配算法(首次适应算法,最佳适应算法,最坏适应算法及回收)

操作系统——动态分配 写的时间早了,有些许漏洞和不足,请大家不要介意 分配方式可分为四类:单一连续分配、固定分区分配、动态分区分配以及动态可重定位分区分配算法四种方式,其中动态分区分配算法就是此实验的实验对象。动态分区分配又称为…

pandas中对列进行排序(单列/多列)/(升序/降序)/(多列升序,降序控制)

前言 我想把数据分析刻进DNA里 如下面的数据,对price,要进行最简单的升序操作: 这个好整: import pandas as pdshop pd.read_csv("data/shop.csv", index_colid)shop.sort_values(byprice, inplaceTrue)结果: 如果你想整活(被迫)要把数据进行降序排列: 按照降序,传…

最先适应法、最佳适应法、下次适配法、最差适配法

题: 分析: 1. 首先分析是不是最差适配法,最差适配法意思是首先找到最大的内存空间进行分配, 对于请求的5K存储空间,首先找到地址200K容量为56K的地方进行分配,然后剩余51K。 再对请求的15K进行分配&…

自适应滤波器更新算法-EP1

自适应滤波器更新算法-EP1 自适应滤波器是回声消除系统中非常重要的一个功能模块,而对于自适应滤波器来说,如果更新滤波器系数则是关键所在。本文将介绍几种现有的滤波器更新算法,并附上Matlab测试代码。 1、LMS算法 1.1算法原理 LMS算法即…

自适应神经网络算法原理,单神经元自适应控制

关于神经网络自适应控制求助 这句话你可以直接用,不用加引用。因为这句话是很容易验证的。在网络层数、隐含层节点数逐渐增加,训练次数增加之后,他的拟合能力也是不断增加的,所以说,他可以以任意精度逼近任何非线性连…

【转载】梯度下降算法的参数更新公式

NN这块的公式,前馈网络是矩阵乘法。损失函数的定义也是一定的。 但是如何更新参数看了不少描述,下面的叙述比较易懂的: 1、在吴恩达的CS229的讲义的第四页直接给出参数迭代公式 在UFLDL中反向传导算法一节也是直接给出的公式 2、例子&#x…

Java中Comparator的个人简单理解(升序降序)与使用

目录 Java自定义排序返回值简单记忆理解实践LInkedList升序(默认情况)降序 PriorityQueue升序下的小顶堆(默认情况)降序下的大顶堆 总结补充数组类型自定义排序降序排序 数组 Java自定义排序返回值简单记忆理解 默认情况下&#…

深度残差收缩网络(从信号降噪的角度进行理解)

本文探讨了深度残差收缩网络的另一种理解方式。 传统信号降噪算法的常见步骤是: ① 采用某种信号变换方法(例如小波、经验模态分解),将含噪信号变换到另外一种形态(例如小波系数、本征模态分量等)。在这些…

NIPS 2016 深度学习 迁移学习 ---残差转移网络用于无监督领域自适应

深度学习的成功得益于大量的标注数据,而数据标注是非常消耗资源的。当一个问题中缺少标注数据时,可以从另一个源中所学知识迁移过来,并且用于新问题中。 清华大学的学者提出了一种新的方法(https://arxiv.org/pdf/1602.04433.pdf&…

深度残差网络+自适应参数化ReLU激活函数(调参记录21)Cifar10~95.12%

本文在调参记录20的基础上,将残差模块的个数,从27个增加到60个,继续测试深度残差网络ResNet+自适应参数化ReLU激活函数在Cifar10数据集上的表现。 自适应参数化ReLU函数被放在了残差模块的第二个卷积层之后,这与Squeeze-and-Excitation Networks或者深度残差收缩网络是相似…

已知两个长度分别为m 和 n 的升序链表,合并降序链表,求时间复杂度

王道数据结构上一道题: 之前我看到一个电子版的书,上边答案解析写的有点错误, 听说有些同学买的实体书上,答案解析也是这样写的 这个是刊印错误,很显然2Max( m , n )大于等于 m n 而且这个解析也不够清晰。 解析&a…

波束形成 常见自适应波束形成算法信(干)噪比增益影响因素

0、其他补充 均匀线阵波束形成器的信噪比增益上确界可由下式表示: 其中为阵元数,所以为了方便起见,一般的稳健自适应波束形成算法在仿真过程中的阵元数量均设置为10。 阵列的导向矢量可由下式表示: 以首个阵元为参考阵元&#xff…

两个升序链表合并成一个降序链表的时间复杂度

王道考研P7 第六题 【2013年统考真题】已知两个长度分别为m和n的升序链表,若将它们合并为长度为mn的一个降序链表,则最坏情况下的时间复杂度是() A. O(n) B. O(mn) C. O(min(m,n)) D. O(max(m,n)) 答案是D 注意,此题…